"group" 和 "component" 在 QuickFIX/J 中的区别

Difference between "group" and "component" in QuickFIX/J

我是 FIX 世界的新手。我正在编写一个应用程序来处理 Java 中的 FIX 消息,为此我正在使用 QuickFIX/J。我已经从主页 (http://quickfixengine.org/) 下载了 DataDictionary。我使用的是 4.4 版本。

在 XML 文件中存在组和组件。但是组件又可以包含组。

它们之间的确切区别是什么?

来自FIXWiki for Components

Component blocks are sets of related data fields grouped together and are referenced by the component block name in messages that they are used in. Sometimes they are referred to as "Groups".

组件块很实用,可以定义,然后在不同的消息类型中重复使用。有时,重复组仅针对一条特定消息,因此未将其定义为组件块。

将组件块视为字段的可重用定义。这样的组件块可能包含也可能不包含重复的字段组。

例如,以用于许多不同消息类型的 Parties component block 为例(请参阅该页面上的 "Used In")。易于定义一次并在消息的许多定义中使用。

组件并不是真正的……东西。它们就像 FIX DataDictionary (DD) 中的宏。许多消息需要相同的字段集,因此 DD 没有在每条消息中指定相同的字段,而是定义了一个其他消息可以包含的组件。

另一方面,群组是非常真实的东西。它是一个重复的字段序列,将在消息中出现 0 次或多次。

QuickFIX 的 (QF) 编程接口在很大程度上忽略了组件这个概念。您不能从消息中提取组件,因为组件不是 QF 中的概念;您只需像提取任何其他字段一样提取字段。

一个假设的例子:下面两个消息定义是完全一样的

  1. 有组件

    <message name="Automobile" msgtype="X" msgcat="app">
      <field name="Wheel" required="Y"/>
      <field name="Bumper" required="Y"/>
      <component name="Dashboard" required="Y"/>
    </message>
    
    <component name="Dashboard">
      <field name="Radio" required="Y"/>
      <field name="AirConditioner" required="Y"/>
      <field name="Heater" required="Y"/>
    </component>
    
  2. 没有组件

    <message name="Automobile" msgtype="X" msgcat="app">
      <field name="Wheel" required="Y"/>
      <field name="Bumper" required="Y"/>
      <field name="Radio" required="Y"/>
      <field name="AirConditioner" required="Y"/>
      <field name="Heater" required="Y"/>
    </message>
    

看到了吗?一个组件几乎就是一个宏。

无论以何种方式定义,您最终都会调用 msg.GetHeater()(或其他)。

只是想添加一些信息,因为接受的答案缺少这些信息(可能是因为它现在已经有五年了)。

在QuickFIX/J中,您实际上可以获取和设置组件。因此,例如,您可以简单地将 Instrument 组件从一条消息复制到另一条消息。

    @Test
    public void testComponent() throws Exception {
        final Instrument instrument = new Instrument();
        instrument.set(new Symbol("DELL"));
        instrument.set(new CountryOfIssue("USA"));
        instrument.set(new SecurityType(SecurityType.COMMON_STOCK));

        final quickfix.fix44.NewOrderSingle newOrderSingle = new quickfix.fix44.NewOrderSingle();
        newOrderSingle.set(instrument);

        final quickfix.fix44.ExecutionReport executionReport = new quickfix.fix44.ExecutionReport();
        executionReport.setComponent(newOrderSingle.getInstrument());

        System.out.println("NOS: " + newOrderSingle.toString().replace('[=10=]1', '|'));
        System.out.println("ER:  " + executionReport.toString().replace('[=10=]1', '|'));
    }

输出:

NOS: 8=FIX.4.4|9=28|35=D|55=DELL|167=CS|470=USA|10=233|
ER:  8=FIX.4.4|9=28|35=8|55=DELL|167=CS|470=USA|10=221|

也许这在其他 QuickFIX 语言变体中也是可能的。