6

代码逻辑优化求助(修改一下变量名也好

 2 years ago
source link: https://www.v2ex.com/t/802588
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Python

代码逻辑优化求助(修改一下变量名也好

  bleutail · 4 小时 3 分钟前 · 90 次点击

背景是通过行情端口获取期货数据合成 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)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK