繁体   English   中英

设计FIX消息编码器和解码器

[英]desiging a FIX message encoder and decoder

我正在尝试设计一个简单的FIX消息编码器和解码器,以对我的业务域Order对象进行编码(转换为FIX)和解码(从FIX转换)。 我已经设计了一些东西,但是我无法实现想要的漂亮设计。 想看看其他有构建这种东西的经验的人是否有更好的设计思路。

这是我大致拥有的:业务对象订单,QuickFIX对象消息。 我需要生成NewOrder / Cancel / Replace消息,并且该消息对于不同的交易所可能有所不同。 我可以使用ReplaceEncoder-> NewOrderEncoder-> AbstractEncoder,CancelEncoder-> AbstractEncoder。 但是,如果我要实现此目标的另一个方面,例如为不同的交换生成自定义消息,则会导致层次结构的组合过多。

我唯一的选择是平凡地为不同的交流编写不同的代码吗? 其他人如何做到这一点? 谢谢。

我唯一的选择是平凡地为不同的交流编写不同的代码吗?

当然不是。 FIX消息中包含强制字段和非强制字段。 您无法在必填字段上进行协商,因为那样便无法保证消息的真实性和完整性。 现在我并不是说这是不可能的,许多交易对手都有自己的特定用户级别协议,可以交换自己的特定消息。

借助Quickfix,您将可以从XML数据字典中找到引擎来确认消息的完整性。 根据您的要求进行调整。 您当然会有多个会话。 我不确定这是否可行,我自己还没有尝试过,不同的会话是否允许不同的数据字典? 如果是,则将它们用于不同的对手方。 如果无法做到这一点,我不禁想到的一种方法是在某些交易对手期望的消息中添加额外的代码来处理您的特定字段,而不是整个消息。

在我工作过的地方,我们在这些线上使用了一些东西。 接收可能的任何版本,但是一旦收到消息,请将其转换为特定版本的FIX消息,该消息仅存在于系统内部。 因此,您的引擎基本上只读取1个FIX版本的消息。 但是增加的复杂性是您必须编写一个转换器。 我不确定这对您是否可行。

我认为您可能会遇到我们遇到的类似问题。 那就是每个FIX实现都是不同的。 有些使用4.2,其他使用4.4,某些使用一些标签,而其他标签则忽略它们,有些使用许多自己的标签,而其他标签则很少使用。 我们所做的是创建了带有FIX 4.2和4.4子类的常规FIX会话,然后为每个特定会话(即单个代理)创建了子类。 这使我们可以合理地重用用于发送和接收FIX消息的代码。 只是更改了诸如处理帐户名和密码等内容的细节。

为了生成消息,我们有一个返回和适配器的工厂方法。 所有适配器具有相同的API,它将我们的业务订单对象转换为FIX消息对象。 当然,每个适配器都特定于代理的API。 我想我们可能可以在适配器之间重用一些代码,但是目前我们还没有。

当涉及到消息定义时,FIX是一个非常简单的协议。

实际上,每个提供FIX接口的机构都对默认消息集进行了修改。 这意味着,例如,来自交易对手A的FIX4.4 NewOrderSingle消息可能具有与交易对手B的不同的字段。

实际上,交易对手A可能已经全盘整理了一些字段并将它们添加进去。对于任何新的交易对手,您都有机会遇到从未见过的字段。

我已经为一些不同的交换编写了一些适配器,但是不幸的是,您真的不得不单独处理它们。 您也许可以利用一些共同点,但是在您阅读完其FIX接口的规格之前,您无法对此做出任何假设。

因此,请简短回答您的问题:

我唯一的选择是平凡地为不同的交流编写不同的代码吗?

是的,差不多。

我们最终要做的是编写一个仅应用必需的修订标记的基本修订层。 在修订规范中,某些标记被标记为每种消息类型所必需。

创建此消息后,我们将过滤器应用于特定于经纪人和工具类型的消息。

例如,如果您与高盛和摩根大通进行期权和股票交易,您将编写以下过滤器:

高盛股权

高盛期权

摩根大通

摩根大通期权

每个厂商都会将供应商和仪器的特定字段应用于基本消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM