背景
近期有客户遇到这样一个问题:他的期货量化策略出现重复下单的情况,导致原本只交易1手股指期货,却买了三四手。
这个问题比较常见,很多用户有遇到,特别是期货用户遇到的多,为此这里记录一下。
问题分析
首先,这个策略的信号是持续性;像有些策略做突破,策略信号只在突破那一瞬间产生,突破后是不会产生信号的;但客户的这个策略信号是持续性的,只要还处在突破后的状态,他就会产生交易信号。
其次,在代码的设计上,他的策略是有持仓判断的,有持仓的时候是不会开新仓的,没有持仓的情况下才会触发下单委托。但为什么这个设计没有生效呢?
这主要是因为行情速度远快于持仓信息的更新。
先来补充一些行情知识。
知识点1:股票的tick行情是3秒一个数据,但期货的tick行情是0.5秒一个数据。
知识点2:下单委托从终端发出,会到券商/期货商,再传到交易所柜台,交易所进行撮合后,再将撮合结果推送到券商/期货商,最后由券商/期货商将撮合结果推送到我们的终端。这需要一个时间,要是网络慢一点,或者成交不活跃的,可能需要几秒钟时间甚至更长。
而这个客户用的就是期货的tick行情,行情推送的速度太快了,下单委托的结果还没收到就遇到了新的行情,而这个交易信号还是满足的,所以就会导致重复下单。
所以期货高频策略可能比较常遇到,股票策略比较少,毕竟3秒才一个tick数据,这个时间往往能够收到委托信号了,持仓也就更新了。
解决方法
那期货高频策略该怎么处理这个问题呢?创建一个变量,来控制交易进程,实现交易锁的功能。
这个变量可以通过字典数据来实现,初始化时,将每个标的,每个开仓方向作为一个关键词,False为值,创建一组键值对;触发信号时,同时判断这个键的值,False时允许开仓,True时不允许开仓;当下单之后,这个值就修改为True,等下单委托返回时才重新赋值为False。
效果
帮客户优化了策略一周多以来,再也没有遇到重复下单的问题了。完美解决问题~
策略遇到了什么问题,需要优化的,或者需要代写策略的,私聊我哈~