Java 固定消息编解码器的设计

Java 固定消息编解码器的设计,java,quickfix,trading,fix-protocol,Java,Quickfix,Trading,Fix Protocol,我正在尝试设计一个简单的FIX消息编码器和解码器来编码(转换为FIX)和解码(从FIX转换)我的业务域订单对象。我设计了一些东西,但我无法实现我想要的美丽设计。想看看有建造这种东西经验的人是否有更好的设计想法 这就是我大致拥有的:业务对象顺序、QuickFIX对象消息。 我需要生成NewOrder/Cancel/Replace消息,对于不同的交换,消息可能不同。 我可以使用ReplaceEncoder-->NewOrderEncoder-->AbstractEncoder,CancelEncod

我正在尝试设计一个简单的FIX消息编码器和解码器来编码(转换为FIX)和解码(从FIX转换)我的业务域订单对象。我设计了一些东西,但我无法实现我想要的美丽设计。想看看有建造这种东西经验的人是否有更好的设计想法

这就是我大致拥有的:业务对象顺序、QuickFIX对象消息。 我需要生成NewOrder/Cancel/Replace消息,对于不同的交换,消息可能不同。 我可以使用ReplaceEncoder-->NewOrderEncoder-->AbstractEncoder,CancelEncoder-->AbstractEncoder。 但是,如果我想从另一个角度来考虑,比如为不同的交换生成自定义消息,那么就会导致太多层次结构的组合

我唯一的赌注是为不同的交换编写不同的代码吗?其他人是如何做到这一点的?谢谢。

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

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

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

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

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

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

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


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

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


对于消息生成,我们有一个返回和适配器的工厂方法。所有适配器都具有相同的API,该API将我们的业务订单对象转换为修复消息对象。当然,每个适配器都特定于代理的API。我想我们可能可以在适配器之间重用一些代码,但目前我们没有。我想您可能会遇到与我们类似的问题。也就是说,每个修复实现都是不同的。一些人使用4.2其他人使用4.4,一些人使用一些标签其他人忽略它们,一些人使用他们自己的许多标签其他人使用很少。我们所做的是为Fix4.2和4.4创建带有子类的通用修复会话,然后为每个特定会话创建子类(即单个代理)。这使我们能够合理地重用代码来发送和接收修复消息。只是更改了处理帐户名和密码等方面的细节


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

在消息定义方面,FIX是一个非常棘手的协议

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