背景是通过行情端口获取期货数据合成 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)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.