Java 为交易系统设计订单对象
我正在尝试设计我的第一个交易系统,我正在努力设计一个包含所有Java 为交易系统设计订单对象,java,oop,trading,fix-protocol,Java,Oop,Trading,Fix Protocol,我正在尝试设计我的第一个交易系统,我正在努力设计一个包含所有FIX概念的正确的订单对象。想知道是否有经验丰富的人能提出一些想法 我创建了一个简单的Order类。 但是当生成一个NewOrderSingle(FIX)时,我需要一个ClOrdId。 然后,当我取消此订单时,我需要一个新的ClOrdId(对于生成的每个取消和替换修复消息),并设置正确的OrigClOrdId。所以我需要跟踪那些origclorids 另外,我认为我需要在我的系统内部保留一个唯一的Id来识别这个顺序,不同于ClOrdId
FIX
概念的正确的订单对象。想知道是否有经验丰富的人能提出一些想法
我创建了一个简单的Order类。
但是当生成一个NewOrderSingle
(FIX)时,我需要一个ClOrdId
。
然后,当我取消此订单时,我需要一个新的ClOrdId
(对于生成的每个取消和替换修复消息),并设置正确的OrigClOrdId
。所以我需要跟踪那些origclorids
另外,我认为我需要在我的系统内部保留一个唯一的Id来识别这个顺序,不同于ClOrdId
,后者可能会不断变化
我看不到任何好的面向对象的方法来设计这个order对象,同时保持与我的修复消息相关的各种ID的概念是分开的
在现实世界中人们是如何设计这些的?有什么建议吗?谢谢。这个类图怎么样 Cancel方法构造新的
子订单
,可用于发送取消请求。您可以为其他子订单类型添加更多构造函数方法。如果取消订单非常具体,您可以为每种订单类型装入一个类,如果它们有共同点,则可以扩展公共类,例如,AbstractOrder
。诸如此类:
我参与了几个系统的设计,这些系统完全符合您的描述。它实际上比设计类层次结构更复杂。要记住的一些事情: 根据交易地点和/或资产类别,订单的“唯一ID”实际上可能是标签的组合。例如,在纽约证交所“经典”交易时,唯一ID实际上是一个复合ID,由标记115(OnBehalfOfCompID)+标记11组成。对于其他场馆,可以是标签109+11或标签76+11 此外,您可能需要向您的唯一ID添加更多数据,以说明发送到不同场馆的ID可能是相同的。例如,一些场馆需要一个
整数
作为其ClOrdID值。在这种情况下,“唯一ID”的内部表示应该是某种类型的salt+ID数据,即DARKCROSS-1
,其中(虚拟)场地是“DARKCROSS”,而1
是标签11的值
如果多个场所有类似的策略来解析订单的唯一ID,那么您可以将该逻辑提取到ID工厂中—组合而不是继承
因此,您的抽象可以从一个AbstractOrder
开始,但是您可能会发现您需要NyseOrder
,NasdaqOrder
,等等
(请注意,我看到的一些实现有一个GenericFixOrder
类或类似的类。实际上,没有这样的东西——每个场所都有自己的特定行为,与其他场所略有不同。)
另一个主题是Good Til Cancel和Good Til Date orders,它们通常必须具有始终唯一的ID(即ID必须包含日期),并且在应用程序多次重启后仍然有效。因此,您的ID工厂必须考虑此类订单
关于ID之间的关系,它实际上是非常直接的。您有一个到订单
对象的唯一订单ID的映射。表示取消/替换或取消的类引用父订单(通过“父订单ID”字段,解析方式与上述“唯一ID”字段相同)
不必直接引用原始(“根”)新订单,事实上,当接受取消/替换时,您可能会发现将其从持有订单的地图中删除是有益的。接受取消后,您几乎可以肯定地从地图中删除它和订单
——订单完成
请注意,上面是一个通用的草图-从内存中删除订单等可能被视为过早优化。如果你的交易量很小,你可能一整天都在内存中保存你所有的交易信息。@user1364959它不完全是UML工具,但它是免费的。()QuickfixJ是一个开源库。您可以对其进行检查,并制定出自己的实施细节。