callMM method

dynamic callMM()

Implementation

callMM() {
  //================计算k线最大最小值==============
  int i = 0, j = 0;
  dynamic zb = "";
  // print('计算最大最小值。开始索引: $kStartI  结束索引: $kStopI');
  for (i = kStartI; i < kStopI; i++) {
    var k = chartData.klineData[i];
    if (i == kStartI) {
      //首次赋值
      kMax = k['high'];
      kMin = k['low'];
      kMaxI = i;
      kMinI = i;

      // print('首次最高值 $kMax - $kMaxI. 首次最低值 $kMin. - $kMinI');
    } else {
      //比较赋值
      if (kMax < k['high']) {
        kMax = k['high'];
        kMaxI = i;
      }
      if (kMin > k['low']) {
        kMin = k['low'];
        kMinI = i;
      }
    }
  }
  // print('最终最高值 $kMax - $kMaxI. 首次最低值 $kMin. - $kMinI');
  // int startIndex =
  //     kStartI - 1 < 0 ? kStartI : kStartI - 1; //这相当于从左边屏幕外一根开始绘制 ()
  // int stopIndex = kStopI + 1 > chartData.kDataL
  //     ? chartData.kDataL
  //     : kStopI + 1; //这相当于画到右边屏幕外一根

  int startIndex =kStartI;
  int stopIndex = kStopI ;

  //===============计算主图BOLL最大最小值============
  kZtMm['valid'] = false;
  for (i = 0; i < ztzb.length; i++) {
    zb = ztzb[i];
    if (zb == Indicator['BOLL']) {
      var bolldata = zbData[zb];
      List boll = [], bollA = [];
      for (var bollV in bolldata.keys) {
        boll = bolldata[bollV];
        boll = boll.sublist(startIndex, stopIndex);
        for (var j = 0, bollL = boll.length; j < bollL; j++) {
          if (!Tools.isNaN(boll[j])) {
            bollA.add(boll[j]);
          }
        }
      }
      if (bollA.isNotEmpty) {
        bollA.sort();
        kZtMm['max'] = bollA[bollA.length - 1];
        kZtMm['min'] = bollA[0];
        kZtMm['valid'] = true;
      }
    }
  }

  //====================计算附图最大最小值=====================
  for (i = 0; i < ftzb.length; i++) {
    zb = ftzb[i];
    kFtMm[zb] = {'max': 0.0, 'min': 0.0, 'valid': false};
    kElement['ft']![zb]['max'] = 0.0;
    kElement['ft']![zb]['min'] = 0.0;
    kElement['ft']![zb]['valid'] = false;
    var ftData = zbData[zb];
    List mmData = [];
    if (zb == Indicator['VOLUME']) {
      for (var mmcjlv in ftData.keys) {
        var mmcjl2 = ftData[mmcjlv];
        mmcjl2 = mmcjl2.sublist(startIndex, stopIndex);
        var mmcjl2l = mmcjl2.length;
        for (j = 0; j < mmcjl2l; j++) {
          if (mmcjlv == "VOL") {
            mmData.add(mmcjl2[j]['volume']);
          } else {
            if (!Tools.isNaN(mmcjl2[j])) {
              mmData.add(mmcjl2[j]);
            }
          }
        }
      }
      mmData.sort();
      // print('cjl ${mmData}');
      kFtMm[zb]['max'] = mmData.isNotEmpty ? mmData[mmData.length - 1] : 0.0;
      kFtMm[zb]['min'] = mmData.isNotEmpty ? mmData[0] : 0.0;
      kFtMm[zb]['valid'] = mmData.isNotEmpty;
    } else {
      for (var mmdv in ftData.keys) {
        var mmd2 = ftData[mmdv];
        mmd2 = mmd2.sublist(startIndex, stopIndex);
        var mmd2l = mmd2.length;
        for (j = 0; j < mmd2l; j++) {
          if (!Tools.isNaN(mmd2[j])) {
            mmData.add(mmd2[j]);
          }
        }
      }
      mmData.sort();
      kFtMm[zb]['max'] = mmData.isNotEmpty ? mmData[mmData.length - 1] : 0.0;
      kFtMm[zb]['min'] = mmData.isNotEmpty ? mmData[0] : 0.0;
      kFtMm[zb]['valid'] = mmData.isNotEmpty;
    }

    if (zb != Indicator['BBI']) {
      //如果不是BBI指标 添加0值刻度
      if (kFtMm[zb]['max'] <= 0) {
        kFtMm[zb]['max'] = 0.0;
      } else if (kFtMm[zb]['min'] >= 0) {
        kFtMm[zb]['min'] = 0.0;
      }
    }
    kElement['ft']![zb]['max'] = kFtMm[zb]['max'];
    kElement['ft']![zb]['min'] = kFtMm[zb]['min'];
    kElement['ft']![zb]['valid'] = kFtMm[zb]['valid'];
  }
  return;
}