交易所系统所维护的合法报单,当其由于某些事件(报单、成交或撤单等)导致该报单状态发生改变时,交易所均会以报单回报的形式将报单的最新状态反馈至交易系统。交易系统则需根据报单回报信息,更新与该报单相关的系统信息
一次报单回报的历程如下:
step1. 报盘前置会话从交易所收到响应报文EDTP_TID_NtfExchangeOrder
在on_ntf_exchange_order里,转换报文格式构造了ntf_exchange_order::Parameters变量参与排队
step2. 交易引擎执行基础业务处理入口函数ntf_exchange_order
基础业务处理入口交易所报单回报ntf_exchange_order里分交易所执行不同版本的ntf_exchange_order,下面以郑商所版本的ntf_exchange_order为例介绍后续步骤:
以郑商所交易所报单中包含的合约在交易所的代码为合约代码查找郑商所合约表找到相应的原来的合约,链接产品和行情后返回,以该合约为参数执行handle_exchange_order,在这个函数里:
(1)根据郑商所交易所报单中包含的“会员代码”查找“郑商所会员编码与经纪公司编码对照“表得到BrokerID,根据该BrokerID结合郑商所交易所报单中包含的TraderID、OrderSysID、OrderLocalID、Direction等参数查找原来的报单。
(2)检查数据同步状态
(3)设置新报单(新报单拷贝自交易所报单)信息,如:NotifySequence、今成交数量VolumeTraded、OrderSubmitStatus、StatusMsg
(4)修改持仓及资金
如果可以找到原来的报单:
则分别根据新报单及原始报单的报单状态、报单提交状态、原始报单数量、剩余数量计算新报单及原始报单的未成交数量x和x0,以及变化量x-x0
如果变化量大于0,则表示是冻结的操作,需要增加资金和持仓的冻结量(通过调用handle_order实现);
如果变化量小于0,而且如果新报单的报单状态为“未成交不在队列中”或者“撤单”,则需要更新报单状态并进行冻结(通过调用handle_order实现)。
如果找不到原来的报单: