4.23K 浏览
0

假如有这样的应用场景: 想研究砖头图, 那么一般思路是用tq的.get_quote数据模式  每个update进行砖头的合成 (类似生成k线),如果生成,开始计算策略,假如策略运行时间是超过1秒,那么理论上会丢失2个行情截面数据,那么下一轮的砖头生成的数据就不准确了。

想到的思路是专门一个线程合成砖头,另外一个线程共享合成后的数据,这样行情接收—-数据合成—策略计算都是独立的  ,不会丢tick。

但因水平有限,没有试验成功,请大神们指点,如果天勤官方能出个示例就更好了。

谢谢!

lookis 已回答的问题 2020年11月5日
0

可以先不要用异步,对新手不友好,可以只用多线程来做:

from queue import Queue
q = Queue()
# 线程一
while True:
    api.wait_update()
    t = api.get_tick_serial(symbol)
    if can_merge_new_kline(t):
        new_kline = merge_new_kline(t)
        q.put(new_kline)
 # 线程二
while True:
    new_kline = q.get()
    #....
    pass

shen liu 发表新评论 2020年11月6日

万分感谢大神的帮助,代码牛x,完美解决问题!

0

可以用多线程,也可以用异步的方式,合成好了之后通过队列推送,这样就隔离了合成K线的逻辑和策略逻辑,不知道你遇到的困难在哪?

需要考虑的一点是,如果策略运行逻辑超过1秒的话,那岂不是策略就没办法处理最新的砖头了?永远滞后了就

shen liu 发表新评论 2020年11月5日

谢谢楼上大神 我遇到问题就是不会写异步代码 试了下 线程1根据推送的tick生成的数据没法自动推给线程2计算
流程大概是
api.wait_uptate
t=gettick
线程1根据t合成k 推给线程2 并发送是否开始策略计算的信号 也就是k是否闭合
线程2根据k刚好闭合的信号 开始策略计算 相当于sleep(2)
因为策略处理的时间不是太长 一般不会在下个k闭合前还没完 所以不存在错过该有的交易信号