setKlineData method
dynamic
setKlineData(
- dynamic codeId,
- dynamic interval,
- 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;
}