最近在做公司交易系统时,接到需求要做条件订单,组合订单。同时条件的触发要基于监听实时行情,如果满足条件就触发下单送交易所。此类订单对于系统设计和性能都有一定的复杂性,故记录一些思考。条件单类型有触及限价单,触及市价单,多条件单。而需求二级还要支持组合策略订单。OCO,OTO,OTOCO,止盈止损单等,其中组合订单中主单或是子单也可以是条件订单。其中比较麻烦的就是多条件订单。所谓多条件,即用户在下单时可以设置多个触发条件,条件的判断因子可以是 >,>=,=,<=,<。条件的字段因子可以是实时行情价,当时的成交量,行情振幅。条件与条件之间的关系可以是AND和OR的组合逻辑关系。
对于表设计我用了两个表,一个是条件表 order_condition 和 order_condition_formula。其中order_condition 用于保存订单条件,order_condition_formula用于保存条件的关系,此处我用EL逻辑表达式来保存关系
整体服务之间交互如下图
行情波动很快,因此当订单数据量很大时,这里可能会有性能问题(虽然行情监听计算服务都是基于内存处理),目前实现暂时是轮询所有订单,但这显然是不合理的,在订单量少的时候没有什么影响,但订单量如果达到几万单,甚至几十万单时,每次行情触发都要去轮询所有订单条件,然后计算匹配。这显然会做很多无用功。所以需要构造一种数据结构,来快速判断行情是否满足触发条件。