CTP-API开发系列之七:报撤单及回报顺序
- 前情回顾
- 相关函数
- 相关术语
- 报单回报
- 成交回报
- 错单响应
- 错单回报
- 重要序号
- RequestID
- FrontID+SessionID
- OrderRef
- ExchangeID + TraderID + OrderLocalID
- ExchangeID + OrderSysID
- 报单场景
前情回顾
CTP-API开发系列之一:各版本更新说明(持续更新)
CTP-API开发系列之二:问题汇总(持续更新)
CTP-API开发系列之三:柜台系统简介
CTP-API开发系列之四:接口对接准备
CTP-API开发系列之五:SimNow环境介绍
CTP-API开发系列之六:交易登录及查询流程
相关函数
/// 1.报单录入请求
virtual int ReqOrderInsert(CThostFtdcInputOrderField *pInputOrder, int nRequestID) = 0;
/// 2.报单失败响应
virtual void OnRspOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
/// 3.报单录入错误回报
virtual void OnErrRtnOrderInsert(CThostFtdcInputOrderField *pInputOrder, CThostFtdcRspInfoField *pRspInfo) {};/// 4.报单操作请求(撤单)
virtual int ReqOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, int nRequestID) = 0;
/// 5.报单操作请求响应
virtual void OnRspOrderAction(CThostFtdcInputOrderActionField *pInputOrderAction, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast) {};
/// 6.报单操作错误回报
virtual void OnErrRtnOrderAction(CThostFtdcOrderActionField *pOrderAction, CThostFtdcRspInfoField *pRspInfo) {};/// 7.报单回报通知(私有流回报)
virtual void OnRtnOrder(CThostFtdcOrderField *pOrder) {};
/// 8.成交回报通知,报单发出后有成交则通过此接口返回(私有流回报)
virtual void OnRtnTrade(CThostFtdcTradeField *pTrade) {};
相关术语
报单回报
指报单的状态回报,有未知单报单回报、未成交报单回报、部分成交报单回报、全部成交报单回报和撤单回报。对应回调函数OnRtnOrder,以OrderStatus字段区分。
成交回报
指报单成交后推送的成交回报,对应回调函数OnRtnTrade。
错单响应
指报单被CTP拒绝后返回的响应通知,对应回调函数OnRspOrderInsert,其中ErrorID和ErrorMsg指明了错误原因。
错单回报
指报单被CTP或交易所拒绝后的报单的状态回报。对应回调函数OnErrRtnOrderInsert
重要序号
RequestID
每个请求函数都有一个RequestID,由客户端自行维护,ReqOrderInsert中的RequestID与OnRtnOrder中的相对应,可以用于跟踪报单回报的整个生命周期,但无法跟踪成交回报,因为成交回报里没有这个字段。
FrontID+SessionID
CTP-API建立的是TCP长链接,通过这两个字段就可以区分不同的链接,这两个字段由CTP柜台系统生成,并在登录成功后通过OnRspUserLogin函数返回给用户。
///前置编号
TThostFtdcFrontIDType FrontID;
///会话编号
TThostFtdcSessionIDType SessionID;
OrderRef
在报单录入请求的另一个参数中pInputOrder,填入报单引用字段的值OrderRef(由客户端自行维护),在通知函数的结构体中会带回来,这样就可以与请求关联上了。
FrontID + SessionID + OrderRef
当报单报入CTP后,这组序号可以唯一定位一笔报单。可以用于跟踪报单回报的整个生命周期,但无法跟踪成交回报(OnRtnTrade),因为成交回报里没有这组序号。
ExchangeID + TraderID + OrderLocalID
当报单被CTP接受后,系统会分配OrderLocalID并发往交易所,这组序号可以用于跟踪此后报单的生命周期,包括报单回报和成交回报。
ExchangeID + OrderSysID
当报单被CTP接受后,系统会分配OrderLocalID并发往交易所,这组序号可以用于跟踪此后报单的生命周期,包括报单回报和成交回报。
当报单被CTP拒绝后,不会分配OrderLocalID,此时仍要使用【FrontID + SessionID + OrderRef】跟踪报单。
报单场景
1.报单某个合约,报入1手,到交易所先未成交,后全部成交1手。
报单:ReqOrderInsert
回调顺序:
OnRtnOrder (未知单) 此时CTP接收到交易所的未成交报单回报
OnRtnOrder (未成交) 此时CTP接收到交易所的成交回报和全部成交报单回报
OnRtnOrder (未成交)
OnRtnOrder (全部成交)
OnRtnTrade
2.报单某个合约,报入1手,到交易所先未成交,然后撤单1手。
报单:ReqOrderInsert
回调顺序:
OnRtnOrder(未知单) 此时CTP接收到交易所的未成交报单回报
OnRtnOrder(未成交)撤单:ReqOrderAction 此时CTP接收到交易所的撤单报单回报
回调顺序:
OnRtnOrder(未成交)
OnRtnOrder(已撤单)
3.报单某个合约,报入10手,到交易所先未成交,然后成交3手,然后剩余全部成交7手。
报单:ReqOrderInsert
回调顺序:
OnRtnOrder (未知单) 此时CTP接收到交易所的未成交报单回报
OnRtnOrder (未成交) 此时CTP接收到交易所的成交回报和部分成交报单回报
OnRtnOrder (未成交)
OnRtnOrder (部分成交)OnRtnTrade 此时CTP接收到交易所的成交回报和全部成交报单回报
OnRtnOrder (部分成交)
OnRtnOrder (全部成交)
OnRtnTrade
4.报单某个合约,报入10手,到交易所先未成交,然后成交4手,然后剩余全部撤单6手。
报单:ReqOrderInsert
回调顺序:
OnRtnOrder (未知单)此时CTP接收到交易所的未成交报单回报
OnRtnOrder (未成交)此时CTP接收到交易所的成交回报和部分成交报单回报
OnRtnOrder (未成交)
OnRtnOrder (部分成交)
OnRtnTrade撤单:ReqOrderAction
此时CTP接收到交易所的撤单回报
OnRtnOrder(部分成交)
OnRtnOrder(已撤单)
5.对一笔已经撤单的委托单再次撤单。
对一笔已撤单再次撤单
ReqOrderAction触发撤单错误响应
OnRspOrderAction (CTP:报单已全成交或已撤销,不能再撤)
触发撤单错误回报
OnErrRtnOrderAction (CTP:报单已全成交或已撤销,不能再撤)
6.对一笔未成交委托进行撤单,因为委托号填写错误导致撤单失败
撤一笔不存在的委托
ReqOrderAction触发撤单错误响应(CTP:撤单找不到相应报单)
OnRspOrderAction
触发撤单错误回报
OnErrRtnOrderAction (CTP:撤单找不到相应报单)