客户端通过接口报单时,需要填写23个字段
///经纪公司代码
TThostFtdcBrokerIDType BrokerID;
///投资者代码
TThostFtdcInvestorIDType InvestorID;
///合约代码
TThostFtdcInstrumentIDType InstrumentID;
///报价引用
TThostFtdcOrderRefType QuoteRef;
///用户代码
TThostFtdcUserIDType UserID;
///卖价格
TThostFtdcPriceType AskPrice;
///买价格
TThostFtdcPriceType BidPrice;
///卖数量
TThostFtdcVolumeType AskVolume;
///买数量
TThostFtdcVolumeType BidVolume;
///请求编号
TThostFtdcRequestIDType RequestID;
///业务单元
TThostFtdcBusinessUnitType BusinessUnit;
///卖开平标志
TThostFtdcOffsetFlagType AskOffsetFlag;
///买开平标志
TThostFtdcOffsetFlagType BidOffsetFlag;
///卖投机套保标志
TThostFtdcHedgeFlagType AskHedgeFlag;
///买投机套保标志
TThostFtdcHedgeFlagType BidHedgeFlag;
///衍生卖报单引用
TThostFtdcOrderRefType AskOrderRef;
///衍生买报单引用
TThostFtdcOrderRefType BidOrderRef;
///应价编号
TThostFtdcOrderSysIDType ForQuoteSysID;
///交易所代码
TThostFtdcExchangeIDType ExchangeID;
///投资单元代码
TThostFtdcInvestUnitIDType InvestUnitID;
///交易编码
TThostFtdcClientIDType ClientID;
///IP地址
TThostFtdcIPAddressType IPAddress;
///Mac地址
TThostFtdcMacAddressType MacAddress;
到了交易前置,添加了两个参数:
com_front_id
com_session_id
接着到了排队机;
然后就到了交易引擎,根据ExchangeID按不同交易所执行宏ORDER_INSERT,在宏里调用了相应交易所版本的quote_insert函数,以郑商所的quote_insert为例:
1)同步状态检查
2)合约检查
3)买卖数量应该一致,指AskVolume与BidVolume
4)郑商所只能是投机,指AskHedgeFlag与BidHedgeFlag
5)设置报价的ExchangeID、ExchangeInstID、TradingDay、SettlementID
6)会话检查
检查是超级会话还是普通会话,如果是普通会话需要校验会话合法性、校验是否在本中心有交易权限。
7)检查报价是否是已接受过的(不支持抢)
通过FrontID+SessionID+InstrumentID+QuoteRef查找郑商所报价表,找到了就是抢!
8)检查报价的买卖价格是否在行情中包含的涨停板价、跌停板价之间
9)经纪公司检查
10)投资者检查
11)取交易编码
来自“郑商所交易编码”表中包含的ClientID
12)交易权限检查
13)报价状态设置
14)交易所会话检查
TraderID、InstallID、ParticipantID、BussinessUnit、QuoteLocalID
15)QuoteRef
不管是超级会话还是普通会话,只要报单引用为空,就需要调用宏GET_SESSION_REF生成一个
16)handle_quote
如果找不到旧的报价
衍生卖单的一些字段根据报价来设置,包括OrderRef、OrderLocalID、OrderStatus、OrderSubmitStatus、OrderSysID(只不过为空而已)、OrderType、OrderPriceType、ContingentCondition、TimeCondition、VolumeCondition等重要的字段,然后如果衍生卖单的卖数量AskVolume大于0,则调用handle_order进行资金/持仓的冻结,最后更新郑商所报单表;
衍生买单直接拷贝自衍生卖单,当然了要改变一些字段:方向Direction、价格LimitPrice、数量VolumeTotalOriginal、剩余数量VolumeTotal、买开平标志BidOffsetFlag、买投机套保标志BidHedgeFlag,然后如果衍生买单的买数量BidVolume大于0,则调用handle_order进行资金/持仓的冻结,最后更新郑商所报单表;
如果可以找到旧的报价
根据旧报价分别寻找原来的卖单和买单,如果找不到就不用处理了。
可以肯定的是quote_insert期间调用的handle_quote肯定不会有旧的报价,但是在别的场景下也有调用handle_quote,比如ntf_exchange_quote_error,quote_action