calcSAR static method

void calcSAR(
  1. List<KLineEntity> dataList
)

Implementation

static void calcSAR(List<KLineEntity> dataList) {
  const List<double> params = [2, 2, 20]; //calcParams default
  final startAf = params[0] / 100;
  final step = params[1] / 100;
  final maxAf = params[2] / 100;

  // Acceleration factor
  double af = startAf;
  // Extreme point
  double ep = -100;
  // Determine trend direction — false: downtrend
  bool isIncreasing = false;
  double sar = 0;

  for (int i = 0; i < dataList.length; ++i) {
    // the previous period SAR
    final preSar = sar;
    final high = dataList[i].high;
    final low = dataList[i].low;

    if (isIncreasing) {
      // Uptrend
      if (ep == -100 || ep < high) {
        // Reinitialize parameters
        ep = high;
        af = min(af + step, maxAf);
      }
      sar = preSar + af * (ep - preSar);
      final lowMin = min(dataList[max(1, i) - 1].low, low);
      if (sar > dataList[i].low) {
        sar = ep;
        // Reinitialize parameters
        af = startAf;
        ep = -100;
        isIncreasing = !isIncreasing;
      } else if (sar > lowMin) {
        sar = lowMin;
      }
    } else {
      if (ep == -100 || ep > low) {
        // Reinitialize parameters
        ep = low;
        af = min(af + step, maxAf);
      }
      sar = preSar + af * (ep - preSar);
      final highMax = max(dataList[max(1, i) - 1].high, high);
      if (sar < dataList[i].high) {
        sar = ep;
        // Reinitialize parameters
        af = 0;
        ep = -100;
        isIncreasing = !isIncreasing;
      } else if (sar < highMax) {
        sar = highMax;
      }
    }

    dataList[i].sar = sar;
  }
}