1

I am trying to design a simple FIX message encoder and decoder to encode (convert to FIX) and decode (convert from FIX) my business domain Order objects. I have designed something, but I am not able to achieve the beautiful design I want. Wanted to see if others who have experience building this kind of things have any better design ideas.

This is what I roughly have: a business Object Order, QuickFIX object Message. I need to generate NewOrder/Cancel/Replace messages and the message could be different for different exchanges. I can have ReplaceEncoder --> NewOrderEncoder --> AbstractEncoder, CancelEncoder --> AbstractEncoder. But if I want another dimension to this, like having custom message generation for different exchanges, then it results in too many combinations of hierarchies.

Is my only bet is to mundanely write different code for different exchanges? How others achieve this? Thanks.

4

4 回答 4

2

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

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

于 2012-10-11T14:29:13.993 回答
2

我唯一的赌注是为不同的交易所编写不同的代码吗?

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

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

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

于 2012-10-11T14:26:45.907 回答
1

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

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

事实上,交易对手 A 可能已经将一些字段整块添加并添加进来。对于任何新的交易对手,您都有可能遇到以前从未见过的字段。

我已经为几个不同的交换编写了一些适配器,不幸的是,你真的被迫单独处理它们。您可能能够利用一些共性,但在您查看他们的 FIX 接口规范之前,您不能对此做出任何假设。

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

我唯一的赌注是为不同的交易所编写不同的代码吗?

是的,差不多。

于 2012-10-11T20:04:00.723 回答
0

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

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

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

高盛股权

高盛期权

摩根大通股票

摩根大通期权

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

于 2012-10-19T17:38:11.227 回答