calcEMA static method

void calcEMA(
  1. List<KLineEntity> dataList,
  2. List<int> emaDayList
)

Implementation

static void calcEMA(List<KLineEntity> dataList, List<int> emaDayList) {
  if (dataList.isNotEmpty) {
    Map<int, double> previousEma = {};
    for (int period in emaDayList) {
      previousEma[period] = dataList[0].close; // 初始化第一个EMA值为第一个收盘价
    }

    for (int i = 0; i < dataList.length; i++) {
      KLineEntity entity = dataList[i];
      entity.emaValueList ??= List<double>.filled(emaDayList.length, 0);

      for (int period in emaDayList) {
        double multiplier = 2 / (period + 1);
        if (i == 0) {
          entity.emaValueList![emaDayList.indexOf(period)] = entity.close;
        } else {
          double ema = (entity.close - previousEma[period]!) * multiplier +
              previousEma[period]!;
          entity.emaValueList![emaDayList.indexOf(period)] = ema;
          previousEma[period] = ema; // 更新前一个EMA值
        }
      }
    }
  }
}