背景是通过行情端口获取期货数据合成 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 自己画了下流程图 搞定了
|