calSAMDatas method

dynamic calSAMDatas(
  1. dynamic high,
  2. dynamic low,
  3. dynamic p1,
  4. dynamic p2,
)

SAM p1 = 2, p2 = 2

Implementation

calSAMDatas(high, low, p1, p2) {
  p1 = p1 / 100;
  p2 = p2 / 100;

  num AfStep = p1, AfLimit = p2, oParClose = 0.0;
  num Af = 0.0,
      preAf = 0.0,
      ParOpen = 0.0,
      preParOpen = 0.0,
      Position = 0.0,
      prePosition = 0.0,
      HHValue = 0.0,
      preHHValue = 0.0,
      LLValue = 0.0,
      preLLValue = 0.0,
      High = 0.0,
      Low = 0.0;
  int i = 0;
  var sar = [], upsar = [], downsar = [], len = high.length;
  for (i = 0; i < len; i++) {
    High = high[i];
    Low = low[i];
    if (i == 0) {
      //如果是第一根k线
      Position = 1; //设置初始值 1
      Af = AfStep; //设置初始值 等于步进值 0.02
      HHValue = High; //设置初始值 第一根k线的最大值
      LLValue = Low; //设置初始值 第一根k线的最小值
      oParClose = LLValue;
      ParOpen = oParClose + Af * (HHValue - oParClose); //计算上升sar 值
      if (ParOpen > Low) {
        ParOpen = Low;
      }
    } else {
      HHValue = High > preHHValue ? High : preHHValue;
      LLValue = Low < preLLValue ? Low : preLLValue;
      if (prePosition == 1) {
        //上一个position
        if (Low <= preParOpen) {
          Position = -1;
          oParClose = HHValue;
          HHValue = High;
          LLValue = Low;
          Af = AfStep;
          ParOpen = oParClose + Af * (LLValue - oParClose);
          ParOpen = ParOpen < High ? High : ParOpen;
          ParOpen = ParOpen < high[i - 1] ? high[i - 1] : ParOpen;
        } else {
          Position = prePosition;
          oParClose = preParOpen;
          if (HHValue > preHHValue && preAf < AfLimit) {
            Af = preAf + AfStep > AfLimit ? AfLimit : preAf + AfStep;
          } else {
            Af = preAf;
          }
          ParOpen = oParClose + Af * (HHValue - oParClose);
          ParOpen = ParOpen > Low ? Low : ParOpen;
          ParOpen = ParOpen > low[i - 1] ? low[i - 1] : ParOpen;
        }
      } else {
        if (High >= preParOpen) {
          Position = 1;
          oParClose = LLValue;
          HHValue = High;
          LLValue = Low;
          Af = AfStep;
          ParOpen = oParClose + Af * (HHValue - oParClose);
          ParOpen = ParOpen > Low ? Low : ParOpen;
          ParOpen = ParOpen > low[i - 1] ? low[i - 1] : ParOpen;
        } else {
          Position = prePosition;
          oParClose = preParOpen;
          if (LLValue < preLLValue && preAf < AfLimit) {
            Af = preAf + AfStep > AfLimit ? AfLimit : preAf + AfStep;
          } else {
            Af = preAf;
          }
          ParOpen = oParClose + Af * (LLValue - oParClose);
          ParOpen = ParOpen < High ? High : ParOpen;
          ParOpen = ParOpen < high[i - 1] ? high[i - 1] : ParOpen;
        }
      }
    }

    preLLValue = LLValue;
    preHHValue = HHValue;
    preAf = Af;
    prePosition = Position;
    preParOpen = ParOpen;

    sar.add(oParClose);
    if (oParClose > High) {
      upsar.add(oParClose);
      downsar.add("-"); //外面在绘制时会判断是否是数字 如果不是不绘制
    } else {
      downsar.add(oParClose);
      upsar.add("-"); //外面在绘制时会判断是否是数字 如果不是不绘制
    }
  }
  var obj = {};
  obj['SAR'] = sar;
  obj['UPSAR'] = upsar;
  obj['DOWNSAR'] = downsar;
  return obj;
}