CTP2资金/持仓管理

order_insert/insert_order、order_action/insert_order_action/handle_exchange_order、ntf_exchange_order/handle_exchange_order、ntf_exchange_trade/ntf_trade、quote_insert/quote_insert分别是报单录入、报单操作录入、交易所报单回报、交易所成交回报以及报价录入的基础业务处理入口及其调用的函数,它们的共同点是均调用了函数handle_order以冻结或解冻资金/持仓,当报单未成交时对报单所对应的资金和持仓进行冻结处理是为了保证在报单成交时存在足够的资金或持仓用于实质转换,函数handle_order的特点是入口参数包括一个旧状态的报单记录和一个新状态的报单记录,先根据报单新旧状态下的剩余数量关系更新冻结持仓量,然后根据最新冻结持仓量信息更新冻结金额、冻结保证金、冻结手续费等资金信息,将冻结资金信息汇总至交易账户并确认是否有足够的资金用于该项冻结。

1. 对于郑商所报单录入,如果找到了原来的报单会报错:ERROR_DUPLICATE_ORDER_REF,所以旧的报单为空,新报单为插入的(并且经过检验不重复)报单,然后调用handle_order,这样不管是多头冻结也好,空头冻结也罢,都是肯定要增加冻结的。

 

2. 对于郑商所报单操作录入,入口参数含有一条报单记录和一条报单操作记录,需要检查报单记录的报单类型(若是报价衍生则必须等交易所回报后即OrderSysID有效才能撤),检查报单记录的报单状态(若是全部成交或者撤销则报错不能再撤)

 

3. 对于处理郑商所交易所报单回报,首先可以肯定的是交易所发来了最新的报单信息,然后需要根据报单回报包含的信息寻找原来的报单,结合最新的报单回报信息和找到的原来的报单就可以产生一个新的报单记录,现在有了新报单和原来的报单就可以handle_order了,但是还不能直接调用handle_order,而是:如果未成交数量变化量大于0(即新状态下的未成交数量较大)就handle_order增加冻结,如果未成交数量变化量小于0(说明新状态下的未成交数量较小),第一反应肯定是减少冻结,  但注意仅仅是在新报单的报单状态为“撤单”或者“未成交不在队列中”时才handle_order减少冻结,因为在“部分成交”或者“全部成交”的情形下,状态的更新在成交回报中体现,这里就不体现了;当然,如果一开始就没找到原来的报单,而仅仅根据交易所发来的报单回报信息是无法产生一个完整的新的报单记录的,那么就需要去新增一个,其一部分字段来自报单回报,另一部分字段来自其它相关的表,至于原始的报单自然就是空了,然后就可以直接调用handle_order了。值得注意的是,无论是否找到原来的报单,做了资金/持仓的冻结或解冻后(即调用了handle_order),最后都要更新(或插入)郑商所报单表,这样处理的结果才能保存下来。

 

4. 对于处理郑商所交易所成交回报,简单来说是进行资金和持仓的成交转换,首先查找相应的合约持仓记录,根据合约成交数量对实际持仓量进行更新,然后根据成交类型更新相应的资金信息。如果成交类型为组合衍生成交则单独处理,否则按一般情况处理:首先可以肯定的是交易所发来了最新的成交信息,然后需要根据成交回报包含的信息去寻找原来的报单,结合最新的成交回报信息和找到的原来的报单就可以产生一个新的报单记录(通过函数modify_order_by_trade完成),现在有了新报单和原来的报单就可以直接调用handle_order了,冻结/解冻结束后更新到郑商所报单表;当然,如果一开始没找到原来的报单,那么就新增一个(通过函数make_order_by_trade完成)并插入到郑商所报单表。最后执行handle_trade函数:如果产品的成交处理类型是投机平仓优先而且成交的开平标志不是开仓则查找投机持仓、查找套保持仓、根据特殊品种成交计算持仓,否则find_position、change_trade_position,

 

5. 对于郑商所报价录入衍生买/卖单,如果找到了原来的报价会报错:ERROR_DUPLICATE_EXECORDER_REF,所以郑商所报价不支持抢单,也就不存在旧的衍生报单,新报单即为新插入报价的衍生买/卖单,这样不管是多头冻结也好,空头冻结也罢,都是肯定要增加冻结的。

posted @ 2018-01-10 11:20  SAPCE  阅读(1147)  评论(0编辑  收藏  举报