交易所系统所维护的合法报单,当其由于某些事件(报单、成交或撤单等)导致该报单状态发生改变时,交易所均会以报单回报的形式将报单的最新状态反馈至交易系统CTP2,交易系统CTP2则需根据报单回报信息,更新与该报单相关的系统信息。
一次报单回报的历程如下:
step1. 报盘前置建立的与交易所的会话OfferConnection从交易所收到响应报文EDTP_TID_NtfExchangeOrder
在on_ntf_exchange_order里对报文格式进行转换,构造一个ntf_exchange_order::Parameters变量,并参与排队
step2. 交易引擎执行基础业务处理入口函数ntf_exchange_order
交易引擎读取排队机流水,根据ntf_exchange_order::PROCEDURE_ID执行基础业务处理入口交易所报单回报ntf_exchange_order,在其内部,将分交易所执行不同交易所版本的ntf_exchange_order,下面以郑商所版本的ntf_exchange_order为例介绍后续步骤:
以<郑商所交易所报单>中包含的合约在交易所的代码为合约代码查找郑商所合约表找到相应的原来的合约,链接产品和行情后返回,以该合约为参数执行handle_exchange_order,在这个函数里:
(1)寻找原始的报单
根据<郑商所交易所报单>中包含的“会员代码”查找“郑商所会员编码与经纪公司编码对照“表得到BrokerID,根据该BrokerID结合<郑商所交易所报单>中包含的TraderID、OrderSysID、OrderLocalID、Direction等参数查找郑商所报单表得到原来的<郑商所报单>。
(2)检查数据同步状态
(3)设置新报单信息
如果可以找到原来的郑商所报单
设置old_order,new_order,upd_order
如果找不到原来的郑商所报单
那就不存在旧报单,new_order拷贝自交易所报单,另外某些字段直接手动赋值。
设置报单的报单提交状态OrderSubmitStatus为“已经接受OSS_Accepted”。
(4)统一计算成交量(针对中金所和郑商所回报中没有成交数量的情况)
新报单的数量VolumeTotalOriginal减去新报单的剩余数量VolumeTotal即为新报单的今成交数量VolumeTraded
(5)修改持仓及资金
如果可以找到原来的郑商所报单:
则分别根据新报单及原始报单的报单状态OrderStatus、报单提交状态OrderSubmitStatus、原始报单数量VolumeTotalOriginal及剩余数量VolumeTotal,计算新报单、原始报单的未成交数量,及二者的差值。
(只要是未知单且不是报单已经被拒绝,那么未成交数量就是原始报单数量,否则未成交数量就是0或者剩余数量)
如果变化量>0,则表示是冻结的操作,需要调用handle_order增加资金/持仓的冻结量,更新郑商所报单表;
如果变化量=0,则表示报单状态未发生实质性变化,无需对资金/持仓的冻结信息进行更新;
如果变化量<0,而且如果新报单的报单状态为“未成交不在队列中”或者“撤单”,需要调用handle_order减少资金/持仓的冻结量,并调整今成交数量VolumeTraded和剩余数量VolumeTotal,更新郑商所报单表;如果是部分或者全部成交,状态的更新在成交回报中体现,这里不作处理。
如果找不到原来的郑商所报单:
直接handle_order做资金/持仓的冻结,当然旧报单为空,新报单还是来自于郑商所交易所报单。