背景是通过行情端口获取期货数据合成 k 线,意外情况有两个:1 、休盘; 2 、端口不稳定有时候在收盘后仍然会回报两组数据,比如收盘是 11:30:00.一般最后行情回报时间会在 11:29:59.xxxx,但有时最后回报时间为 11:30:00.xxxxx
1 属于固定情况比较好处理,主要问题是 2 。我的处理是超过收盘时间的数据都放下一 k 线内,简单说 11:30:00.xxx 来了一个很高的价格,那么这个价格可以当作 13:30:00-13:30:15 这个时间段内的 k 线的最高价(下午 13:30 开盘)。
while True: # 当出现行情时间大于 last_time + period 时,则发送上一时间段的已成熟 kbar,last_time 在第一个 if 判断中作为未成熟 kbar 所属时间段的开端,在 else 语句中将 last_time 更新为 last_time + period 。 data = sub_q.get() UpdateTime = data['UpdateTime'] LastPrice = data['LastPrice'] if UpdateTime < last_time + period: # 11:30:15 11:30:00 11:29:45 if LastPrice > high: high = LastPrice elif LastPrice < low: low = LastPrice last_price = LastPrice # 最后价格是为了收盘价准备 volume += data['volume'] else: # 跳出时间条件判断则说明收盘价已成立 if (UpdateTime - last_time) < datetime.timedelta(Minutes=10):#是否休盘 if last_time.secOnd== 00:#如果为真说明 11:30 以后仍有有行情回报 flag_day = False flag_day3 = False if flag_day2 and flag_day: # 都为真值则是正常情况 close = last_price kbar_q.put({ 'open': open, 'high': high, 'low': low, 'close': close, 'volume': volume, 'ask': ask, 'bid': bid, 'ask_v': ask_v, 'bid_v': bid_v, 'datetime': last_time + period # 把上一个时间段的最后时刻作为 kbar 时间属性 }) # 先发送上一个 kbar 然后更新 ohlv 以及相关属性 open = LastPrice high = LastPrice low = LastPrice volume = data['volume'] ask = data['ask'] bid = data['bid'] ask_v = data['ask_v'] bid_v = data['bid_v'] if flag_day3:#是否经过休盘 last_time = last_time + period # data['datetime']需要取整 else: last_time = UpdateTime - \ datetime.timedelta( secOnds=UpdateTime.second, microsecOnds=UpdateTime.microsecond) else: if LastPrice > high: high = LastPrice elif LastPrice < low: low = LastPrice last_price = LastPrice # 最后价格是为了收盘价准备 volume += data['volume'] flag_day = True last_time = UpdateTime - \ datetime.timedelta( secOnds=UpdateTime.second, microsecOnds=UpdateTime.microsecond)
1 2i2Re2PLMaDnghL 2021-09-18 12:03:37 +08:00 意义不明,你到底要优化什么? 没看代码,我猜你可以预处理一下把 > 11:30 的数据点直接挪到下一个 k 线 再推荐个中文变量名。 |
![]() | 2 windyCity1 2021-09-18 14:17:55 +08:00 codeReview ?免费的?恐怕没什么人给你做吧。。。。。。 自己公司里面找大佬给看看吧,这个比较实际 |
3 bleutail OP 自己画了下流程图 搞定了 |