因为真格量化封装了CTP API,所以许多与交易相关的流程会继承CTP本身的设计,我们有必要进行了解。
用CTP进行下单涉及到委托单的下单和撤单。
一,委托请求
1、普通委托下单(交易时段内下单,即预埋单时段以外时段)
其C++代码:
对应真格量化的Python代码:
2,普通委托撤单
其C++代码:
对应真格量化的Python代码:
二、委托回报:
一笔委托下单,如果成功,CTP平台会产生数笔回报;如果CTP平台如果校验出错,会返回一笔回报。不同委托下单,回报接口不一样。
在C++中:
1、预埋单委托
ReqParkedOrderInsert:
OnRspParkedOrderInsert
2、预埋单撤单
ReqParkedOrderAction:
OnRspParkedOrderAction
3、预埋单删除
ReqRemoveParkedOrder:
OnRspRemoveParkedOrder
4、删除预埋撤单请求
ReqRemoveParkedOrderAction:
OnRspRemoveParkedOrderAction
5、普通委托
ReqOrderInsert:
OnRspOrderInsert
6、普通委托撤单
ReqOrderAction:
OnRspOrderAction
在真格量化中,统一用OnOrderChange来监听委托回报:
三、委托指令的传输流程
对于委托报单流程,可参考这个示意图:
\1. 交易终端通过交易接口向交易前置提交投资者的报单申请。
\2. 主排队机从前置机订阅交易申请报文。
\3. 主排队机将发布的交易序列报文发送给从排队机要求确认。
\4. 从排队机收到待确认报文后将相关报文写入流水文件,并立即返回报文确认信息。
\5. 交易核心从主排队机订阅交易序列报文。
\6. 交易核心对收到的交易序列报文做合法性检查,检查出错误的交易申请报文后就会返回给交易前置一个
包含错误信息的报单响应报文,交易前置立即将该报文信息转发给交易终端。如果检出为合法的交易申
请报文,交易核心也会返回一个报单响应报文到交易前置,但是该报文不会被交易前置返回给交易终端。
\7. 两种情况:1,交易前置从交易核心订阅到错误的报单响应报文,以对话模式将该报文转发给交易终端。
2,交易核心返回给交易前置的响应报文是正确的,交易前置立即以私有模式返回对应报单的报单回报到
交易终端(图中前置机到交易终端8)。
\8. 两个过程:1,交易前置在订阅到交易核心的报单回报后,以私有模式将该报单回报发送到交易终端。2,
交易核心向交易前置发送了第一个报单回报后,立即产生向交易所申请该报单插入的申请报文,该报文
被报盘管理订阅。
\9. 报盘管理订阅到交易所报盘插入申请报文后,将该报文转发到对应报盘接口。
\10. 报盘收到报盘管理的报单申请报文后,通过交易所提供的交易接口将该笔报单发送到交易所。
\11. 报盘通过交易接口从交易所前置接收报单回报以及成交回报或出错的报单响应报文。
\12. 报盘将从交易所接收到的报单回报及成交回报或报单响应汇总到报盘管理。
\13. 主排队机从报盘管理订阅从交易所返回的报单信息。
\14. 主排队机将报文信息序列化后发送给从排队机进行确认。
\15. 从排队机收到待确认报文后将该报文写入流水,并立即返回报文确认信息。
\16. 交易核心从主排队机订阅所有的报单以及成交回报信息。
\17. 交易前置从交易核心订阅所有交易核心发布的交易结果数据。
\18. 交易前置将订阅到的交易结果数据分发到各交易终端。
四、委托出错
在CTP C++中:
OnErrRtnOrderInsert/OnErrRtnOrderAction
报盘将通过交易核心检查的报单发送到交易所前置,交易所会再次校验该报单。如果交易所认为该报单不合法,交易所会将该报单撤销,将错误信息返回给报盘,并返回更新后的该报单的状态。
当客户端接收到该错误信息后,就会调用OnErrRtnOrderInsert /OnErrRtnOrderAction函数, 而更新后的报单状态会通过调用函数OnRtnOrder 发送到客户端。如果交易所认为该报单合法,则只返回该报单状态(此时的状态应为:“尚未触发”)。
在真格量化中可以通过在OnOrderChange函数中检查委托对象的状态来判断委托是否出错:
五,OnOrderChange和OnTradeDeal配合控制订单流
在真格量化中对于下单流程的监控:
1,要即时查询委托或成交状态,应当在OnOrderChange或OnTradeDeal函数中查询,例如通过GetOrder或GetTradeDetail函数。
2、下单出错的话,也可以在OnOrderChange函数里处理,通过检查委托的状态status,来决定是否需要再次委托。
3、如果委托最终成交,可以在OnTradeDeal刷新持仓列表,例如通过GetPositions函数,来更新持仓信息,并通过全局变量传递给程序的其他需要用到持仓信息的部分。
— — — — — — E N D — — — — — —
真格量化可访问:
https://quant.pobo.net.cn
真格量化微信公众号,长按关注:
遇到了技术问题?欢迎加入真格量化Python技术交流QQ群 726895887
往期文章:
一个Call搅动市场?让我们温习一下波动率策略
如何用真格量化设计持仓排名跟踪策略
还不理解真格量化API设计?我们不妨参考一下CTP平台
理解同步、异步、阻塞与非阻塞
隐波相关系数和偏度——高维风险的守望者
Delta中性还不够?——看看如何设计Gamma中性期权策略
Python的多线程和多进程——从一个爬虫任务谈起
Python2和Python3的兼容写法
Python代码优化技巧
如何写出更好的Python代码?这是Python软件基金会的建议