我正在尝试设计一个简单的FIX消息编码器和解码器来编码(转换为FIX)和解码(从FIX转换)我的业务域Order对象。我设计了一些东西,但我无法实现我想要的漂亮设计。想知道是否有其他有经验的人有更好的设计理念。
这是我大致拥有的:业务对象订单,QuickFIX对象消息。 我需要生成NewOrder / Cancel / Replace消息,并且消息可能因不同的交换而不同。 我可以有ReplaceEncoder - > NewOrderEncoder - > AbstractEncoder,CancelEncoder - > AbstractEncoder。 但是,如果我想要另一个维度,比如为不同的交换生成自定义消息,那么它会产生太多的层次结构组合。
我唯一的赌注是为不同的交易平常编写不同的代码吗?别人怎么做到这一点?感谢。
答案 0 :(得分:2)
我唯一的选择是为不同的交易平常编写不同的代码吗?
当然不是。在FIX消息中,有强制和非强制字段。您无法在必填字段上进行协商,因为您无法保证邮件的真实性和完整性。现在我并不是说这是不可能的,许多对手方都有自己的特定用户级别协议,并与他们自己的特定消息进行交换。
使用Quickfix,引擎确认消息完整性的XML数据字典就在您手中。根据自己的要求调整它。你肯定会有多个会话。我不确定这是否可行,自己没有尝试过,不同的会话是否允许不同的数据字典?如果是,则将它们用于不同的对方。如果这是不可能的,那么我想到的一种方法是添加额外的代码来处理特定字段,而不是整个消息,在某些对方的预期消息中。
我工作的地方,我们在这些线路上使用了一些东西。接收您可能的任何版本,但收到消息后,将其转换为特定版本的FIX消息,该消息仅存在于您的系统中。因此,您的引擎基本上只读取1个FIX版本的消息。但增加的复杂性是你必须编码转换器。我不确定这对你有多可行。
答案 1 :(得分:2)
我想你可能会遇到类似的问题。这就是每个FIX实现都不同。有些使用4.2其他4.4,有些使用一些标签,其他人忽略它们,有些使用许多自己的标签,其他人使用很少。我们所做的是创建具有FIX 4.2和4.4的子类的一般FIX会话,然后为每个特定会话(即单个代理)创建子类。这为我们提供了合理数量的代码重用,用于发送和接收FIX消息。只更改了处理帐户名和密码等内容的细节。
对于消息生成,我们有一个返回和适配器的工厂方法。所有适配器都具有相同的API,它将我们的业务订单对象转换为FIX消息对象。当然,每个适配器都特定于代理的API。我想我们可能会在适配器之间重用一些代码,但目前我们没有。
答案 2 :(得分:1)
在消息定义方面,FIX是一个非常滑的协议。
实际上,提供FIX接口的每个机构都对默认消息集进行了修改。这意味着,例如,交易对手A的FIX4.4 NewOrderSingle消息可能与交易对手B的消息不同。
事实上,交易对手A可能已经整理了一些领域并将其添加进去。对于任何新的交易对手,您可能会遇到以前从未见过的领域。
我为几个不同的交易所写了几个适配器,不幸的是,你真的被迫单独处理它们。您可能能够利用一些共性,但在您查看其FIX界面规范之前,您无法做出任何假设。
所以,简短回答你的问题:
我唯一的选择是为不同的交易平常编写不同的代码吗?
是的,差不多。
答案 3 :(得分:0)
我们最终做的是编写一个只应用所需修复标记的基础修复图层。在修订规范中,某些标记被标记为每种消息类型所需。
创建此消息后,我们将过滤器应用于特定于代理和工具类型的消息。
即如果您与Goldman和JPMorgan交易期权和股票,您可以编写以下过滤器:
高盛股权
Goldman-option
摩根-权益
摩根选项
每个都会将供应商和工具特定字段应用于基本消息。