setKlineData method

dynamic setKlineData(
  1. dynamic codeId,
  2. dynamic interval,
  3. dynamic data
)

Implementation

setKlineData(codeId, interval, data) {
  var newKlineData = data['klineData'];
  int newkl = newKlineData.length;
  if (codeId != currentCodeId || interval != currentInterval || newkl == 0) {
    return 0;
  }
  if (data['dicType'] == "add") {
    //累加
    if (data['dic'] == -1) {
      //向前
      // print('向前增加k线数据');
    } else {
      //向后
      // print('向后增加k线数据');
    }
    klineData = [...klineData, ...newKlineData];
    //从小到大排序
    klineData.sort((a, b) => a['time'].compareTo(b['time']));
    //时间清洗,清洗掉时间一样的数据,从后开始清洗
    int klineDataL = klineData.length;
    int qxNum = 0;
    List<Map> newKData = [klineData[klineDataL - 1]];
    for (int i = klineDataL - 2; i > -1; i--) {
      if (klineData[i]['time'] != newKData[0]['time']) {
        newKData.insert(0, klineData[i]);
      } else {
        qxNum += 1; //清洗掉数据数量统计
      }
    }
    newkl -= qxNum; //更新新增数量
    klineData = newKData;
  } else if (data['dicType'] == "cover") {
    //获取最后一根线
    var last = klineData.isNotEmpty?klineData[klineData.length - 1]:null;
    var newLast = newKlineData[newkl - 1];
    //如果前往返回的最后一根k线和上次最后一根k线时间不一样,放入最后一根线(最后一根线是撮合的基础,如果没有最后一根线会立刻出现新的线)
    if (last != null && last['time'] != newLast['time']) {
      newKlineData.add(last);
    }
    // print('前往k线数据直接覆盖');
    //覆盖
    klineData = newKlineData;
  } else {
    // print('首次k线数据直接覆盖');
    //覆盖
    // 如果http先,推送后,则直接覆盖,推送会在推送逻辑里更新数据
    // 如果http无,推送模拟第一次,则直接覆盖,后续推送会在推送逻辑里更新数据
    // 如果推送先,http后,则http来时,已经有数据了,推送数据和http首次数据的融合在应用层处理,这里还是直接覆盖
    klineData = newKlineData;
  }
  if (klineData.isNotEmpty) {
    //k线长度
    kDataL = klineData.length;
    //最后一根k线开始时间
    lastBeginT = klineData[kDataL - 1]['time'];
  } else {
    //k线长度
    kDataL = 0;
    //最后一根k线开始时间
    lastBeginT = DateTime.now().microsecondsSinceEpoch;
  }
  return newkl;
}