程序设计时,使用insert_order后,经常会再判断下单一段时间后仍未成交,即撤单再重新下单。
这时一般会使用当前时间与order.insert_date_time的差来判断过了多久。
但如果order.insert_date_time的值为0,那么程序就会认为已经下单很久还没有成交,造成重复下单的问题。
这个坑一定需要避开。
order.insert_date_time值为0,是因为交易所还没有“确认”该笔order。注意是没有确认,并不是这个order是错单。错单也是有正常的order.insert_date_time。
所以,说order.insert_date_time值为0并不准确,应该说该值为空。
那么什么原因可能造成交易所还没有“确认”该笔order呢?
可能包括:1)insert_order后,没有调用wait_update,订单没有发出;
2)调用了wait_update,但在路上,交易所还没有收到;
3)交易所收到了,但正在处理,还没有返回。特别是交易量大的品种、合约,交易所需要处理时间。
4)返回了,但在返回的路上,程序没有收到。
虽然这些过程的时间很短,1秒左右。但如果处理不当,足以让程序产生误判,并重复下单。
解决办法包括:
- insert_order后,及时调用wait_update;另外,可以考虑在wait_update处暂停2秒,预留成交时间。(也可不暂停)
- 使用order.insert_date_time前做一个条件判断,即 if order.insert_date_time > 0 。
李思恒 已回答的问题 2024年6月25日