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是一个开源库。您可以对其进行检查,并制定出自己的实施细节。