2

我有兴趣用重复组解析 FIX 消息。有人可以提供如何在 API 级别使用主要 FIX 引擎完成此操作的示例,并讨论如何在实现级别有效地完成此操作吗?

例如,我提供了一个 FIX 重复组:

453 NoPartyIDs
448 PartyID
447 PartyIDSource
452 PartyRole

453=3 {448=a&447=1&452=11, 448=b&447=2&452=22, 448=c&447=3&452=33}  
4

1 回答 1

1

因此,重复组解析起来并不便宜,这是 FIX 协议的一个已知弱点。幸运的是,大多数时间敏感的 FIX 消息(如ExecutionReport)不会包含任何重复组。当重复组中有重复组时,情况会变得更糟。

诀窍是尝试仅解析那些您知道可以包含重复组的消息类型的重复组,在解析时忽略所有其他消息类型的重复组。

下面是如何使用CoralFIX解析重复组的示例:

    FixParser parser = new FixParser();

    // define a repeating group for a message type:
    parser.addGroupTemplate(QuoteStatusRequest, NoRelatedSym, 
                            Symbol, FutSettDate, SecurityDesc);

    FixMessage fixMsg = parser.parse(byteBufferWithFixMessage);

    fixGroup = fixMsg.getGroup(NoRelatedSym);

    System.out.println(fixGroup.getNumberOfElements()); // => 4

    // you can also print the whole fix group for debugging purposes:
    System.out.println(fixGroup);
    // Symbol(55)=AAPL FutSettDate(64)=1 SecurityDesc(107)=blah1 | Symbol(55)=IBM FutSettDate(64)=2 SecurityDesc(107)=blah2 | Symbol(55)=LDK FutSettDate(64)=3 SecurityDesc(107)=blah3 | Symbol(55)=FB FutSettDate(64)=4 SecurityDesc(107)=blah4

    System.out.println();

    Iterator<FixGroupElement> iter = fixGroup.iterator();

    while(iter.hasNext()) {

        FixGroupElement elem = iter.next();

        // fetch fix tag values as usual:
        System.out.println(elem.getString(Symbol));
        System.out.println(elem.getInt("FutSettDate"));
        System.out.println(elem.getString(107));

        // you can also print the whole element for debugging purposes:
        System.out.println(elem);
        System.out.println();
    }
}

所以你可以在上面看到,我们明确地向解析器指示QuoteStatusRequest消息类型可以包含一个由 tagNoRelatedSym和 fix 标记定义的重复组SymbolFutSettDateSecurityDesc。由于这个重复组,其他消息类型在解析器中不会有任何开销。您可以在此处阅读有关上述源代码的更多信息。

现在,当涉及到实现细节时,您需要递归,尤其是处理重复组内的重复组。递归使实现更加清晰易懂。这也可以通过迭代来完成,但代码变得过于复杂,只需要一点性能(纳米)。如果您在重复组中有太多重复组,则会产生更大的不同。当涉及到 FIX 重复组时,我尤其只看到了 2 级嵌套,但该协议允许任何级别的嵌套。

免责声明:我是 CoralFIX 的开发者之一。

于 2014-07-23T23:40:18.847 回答