QuickFix / J中“组”和“组件”之间的区别

时间:2015-04-21 12:39:57

标签: quickfix fix-protocol quickfixj

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

在xml文件中存在组和组件。但是组件可以再次包含组。

它们之间的确切差异是什么?

感谢您的帮助!!

3 个答案:

答案 0 :(得分:15)

组件不是真的......事情。它们就像FIX DataDictionary中的宏一样。许多消息需要相同的字段集,因此DD不是在每条消息中指定相同的字段,而是定义其他消息可以包含的组件。

另一方面,一个集团是一个非常真实的事情。它是一个重复的字段序列,在消息中出现0次或更多次。

QuickFIX的编程接口在很大程度上忽略了组件作为一个概念。您无法从消息中提取组件,因为组件不是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()(或其他)。

答案 1 :(得分:3)

来自FIXWiki for Components

  

组件块是一组相关的数据字段,它们组合在一起,并在它们所使用的消息中由组件块名称引用。有时它们被称为“组”。

组件块可以定义,然后在不同的消息类型中重用。有时,重复组仅用于一个特定的消息,然后它不被定义为组件块。

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

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

答案 2 :(得分:1)

由于接受的答案缺少此信息,因此仅添加一些信息(可能是由于该信息已经存在大约五年了)。

在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('\001', '|'));
        System.out.println("ER:  " + executionReport.toString().replace('\001', '|'));
    }

输出:

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语言版本中也是可能的。