1. 在实盘多期货品种跟单时,采用order=api.insert_order()下限价单,对target_pos.set_target_volume()要有很多优势,但其后面要跟while order.status != “FINISHED”: api.wait_update(); 我的考虑是,多数情况下,该单应该成交;但在不成交的情况下,程序是否会出现死循环堵在这里,从而使其他品种的期货跟单无法跟踪?
2. 是否可以下单用api.insert_order(); 同时,止损单用target_pos.set_target_volume(0); 两种命令在程序中混合使用推荐吗?谢谢
- 单看这两句的话应该还好,毕竟 while order.status != “FINISHED” 要比 while True 还要弱一些,特别是如果你用多线程或者async的话,更不会堵在这里了。
- 理论上是可以的,但要注意最好不要同时使用,这里指的 “同时” 的意思是,insert_order的单最好要都成交之后再调用下一个 set_target_volume,然后 set_target_volume都成交之后再调用 insert_order, 因为 insert_order 是更底层的接口,所以其实单用 insert_order 是不依赖 set_target_volume 的,但 set_target_volume 的下单数量是根据调用时的当前头寸来做计算,也就是说,如果时序是这样,就会出现计算错误:
- 当前仓位为10手
- insert_order 5手 (假设这个单叫 order_1)
- set_target_volume 0 (在这时,如果 order_1 还没成交的话,系统会计算成需要平 10手,假设这个单叫 order_2)
- order_1 成交,当前仓位15手
- order_2 成交,当前仓位5手
所以如果要混用的话,一定要等 order_1 完全成交之后,再调用 set_target_volume,否则就和预期不一致了,或者再手动平掉 order_1 新增的单子
要是不这么做的话其中还会有各种错误,不仅仅是手数问题,比方说 order_1 如果是减仓, order_2 也是减仓,那么对于平昨和平今的计算也会有问题,然后导致其中慢的一个单可能就是错单了
关于1. 我觉得还是得看你程序其它部分怎么写的,不能完全说不会堵但逻辑我觉得还是有问题的
多线程应该不会出现像您说的运行完一个策略再运行下一个,应该是同时运行的,而且不会受CPU个数影响,除非每一个子线程的逻辑都是死循环,如果逻辑是死循环的话异步任务也解决不了……,所以还是得看代码怎么写的
可以参考 TargetPosTask 里的 InsertOrderTask
https://github.com/shinnytech/tqsdk-python/blob/9fdd420437a1c819229ceae2c11d82da358173ec/tqsdk/lib.py#L322
谢谢您的解释!
关于第一个问题,我曾经测试过多线程,采用多策略,每个策略一个线程,然后同时启动,但实际运行效果跟单线程没有区别,还是运行完每一个策略,才运行第二个策略;后来查看了TqSdk的帮助文档,说多线程数还要受制于CPU个数,通常情况下,跟踪的期货品种个数要远远大于CPU个数,所以,多线程的方案放弃了;
关于单线程创建多异步任务的方案,TdSdk文档中的内容不多,能否再多分分享一些信息,我可以实际测试一下,谢谢!