我有兴趣用重复组解析 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}
我有兴趣用重复组解析 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}
因此,重复组解析起来并不便宜,这是 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 标记定义的重复组Symbol
,FutSettDate
和SecurityDesc
。由于这个重复组,其他消息类型在解析器中不会有任何开销。您可以在此处阅读有关上述源代码的更多信息。
现在,当涉及到实现细节时,您需要递归,尤其是处理重复组内的重复组。递归使实现更加清晰易懂。这也可以通过迭代来完成,但代码变得过于复杂,只需要一点性能(纳米)。如果您在重复组中有太多重复组,则会产生更大的不同。当涉及到 FIX 重复组时,我尤其只看到了 2 级嵌套,但该协议允许任何级别的嵌套。
免责声明:我是 CoralFIX 的开发者之一。