套利瘸腿要出人命?快来看看如何用撤单函数优化套利交易的成交
在网购时代我们都有下单后又反悔的经历。好在淘宝之类的电商网站有完善的“申请退款”机制,使得我们不至于因为买了太多并不需要的商品而“剁手”。
期货交易所也有类似的机制。虽然交易所并不会因为我们不喜欢现有的持仓(比如不赚钱的头寸,特别是套利交易中如烫手山芋一般的瘸腿头寸)而允许“全额退款”,但我们还是可以在委托没成交的时候反悔,去迅速撤单。
为了解交易所是怎样处理我们的交易委托的,我们可以先了解一下中国期货交易所与交易者之间的信息交互机制。
交易所和投资者的信息交互模式分为三种:
1, 对话通讯模式
2, 私有通讯模式
3, 广播通讯模式
对话通讯模式:
在对话通讯模式中,投资者向交易所发送各种请求(比如账户登录、账户信息查询、交易委托、撤单等等),交易所收到请求后返回响应信息,可以有一条或多条响应(在真格量化系统日志中可以经常看到一条委托发出后,系统返回的多条回报信息)。
为了区分不同的“请求”,每一条客户请求都会一个唯一的“编号”,比如下单委托对应的“委托编号”。
这个模式下,投资者“发问”,交易所才会“回答”,“不问就不回答”。而且投资者“发问”时,如果通讯线路中断,那交易所可能就收不到问题,投资者也就无法收到预期的“回答”,哪怕通讯线路稍后已恢复。
私有通讯模式:
在私有通讯模式中,交易所主动向投资者发送各种信息,比如委托回报、成交回报、错单回报。交易所会确保这些信息送达投资者。哪怕在交易所信息发出时,通讯线路中断,一旦连接重建,交易所会校验信息接收状态,如果投资者未收到信息,交易所会向投资者再次发送这些信息。私有通讯模式是比对话通讯模式“更可靠”的通讯模式。
广播通讯模式:
在广播通讯模式下,交易所向所有投资者发送相同的信息,比如市场行情、交易所通知、开收盘信息等。与私有通讯模式类似,只要线路连接建立,交易所就会确保投资者收到这些“广播”,只不过这些信息不是针对某个投资者的特定信息,而是面向所有投资者的“公有信息”。
在期货交易中,我们接收行情是通过广播通讯模式,发送委托是通过对话通讯模式,接收到委托状态的信息是通过私有通讯模式。
当我们发出委托后,无论成交或不成交,交易所一定会给出一个“回报”。我们收到了回报,比如在真格量化中通过OnOrderChange函数接收到了回报信息,就可以做很多事情,比如撤单。
也就是说,我们依靠交易所的回报信息来“驱动”撤单功能的实现。类似地,真格量化中依靠行情广播驱动的OnQuote、OnBar、OnExchangeOpen函数,依靠成交状态回报驱动的OnTradeDeal函数也都体现了这个”事件驱动“的设计思想。我们编写策略时,也应当将这个设计思想融入到策略设计中。
真格量化中OnOrderChange函数的格式如下:
其中
context:上下文信息,用于存储编写之前用户设置好的交易账号或者存储在其他事件中要用的变量。
AccountName:账号名称
order:委托对象,包含了委托的各种信息。
一旦委托发送,OnOrderChange函数会自动获得这个委托编号。将委托编号传入GetOrder函数,我们可以得到委托对象。有了委托对象,我们可以查询这个委托的一系列信息,比如合约、价格、数量、委托状态、是否可撤等等。如果委托状态为可撤,我们就可以通过CancelOrder函数来撤单。
以下是一个简单的例子:
当委托发出后,我们可以查到委托对象的各种信息,并根据这些信息,比如委托是否可撤,来决定策略的下一步操作:
比如,在套利交易中,一旦价差达到交易条件,我们可以先用对手价发出成交不够活跃的那一腿的委托,然后判断其状态,决定是否发出成交更活跃的第二腿的委托(对于交易活跃的合约一般可以用市价):
这相比两腿委托同时发出,能避免很多因为两个合约交易活跃程度不一样,造成的单腿暴露风险。您如果还在纠结如何优化套利交易的成交,不妨试试这个方法。
— — — — — — E N D — — — — — —
往期文章:
真格量化可访问:
https://51zhenge.com
真格量化微信公众号,长按关注:
遇到了技术问题?欢迎加入真格量化Python技术交流QQ群 726895887
网友评论