假如有这样的应用场景: 想研究砖头图, 那么一般思路是用tq的.get_quote数据模式 每个update进行砖头的合成 (类似生成k线),如果生成,开始计算策略,假如策略运行时间是超过1秒,那么理论上会丢失2个行情截面数据,那么下一轮的砖头生成的数据就不准确了。
想到的思路是专门一个线程合成砖头,另外一个线程共享合成后的数据,这样行情接收—-数据合成—策略计算都是独立的 ,不会丢tick。
但因水平有限,没有试验成功,请大神们指点,如果天勤官方能出个示例就更好了。
谢谢!
lookis 已回答的问题 2020年11月5日
可以先不要用异步,对新手不友好,可以只用多线程来做:
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日
可以用多线程,也可以用异步的方式,合成好了之后通过队列推送,这样就隔离了合成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闭合前还没完 所以不存在错过该有的交易信号
万分感谢大神的帮助,代码牛x,完美解决问题!