我对使用重复组解析FIX消息感兴趣。有人可以提供在主要FIX引擎的API级别中如何完成此操作的示例,并讨论如何在实现级别中有效地完成此操作?
举个例子,我提供了一个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}
答案 0 :(得分: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
消息类型可以包含由标记NoRelatedSym
定义的重复组以及修复标记Symbol
,{{ 1}}和FutSettDate
。由于此重复组,其他消息类型在解析器中不会有任何开销。您可以详细了解here上方的源代码。
现在谈到实现细节,您需要递归,尤其是处理重复组内的重复组。递归使得实现更加清晰,可以遵循和理解。这也可以通过迭代来完成,但代码变得太复杂,只需要更多的性能(nanos)。如果在重复组中有太多重复组,那将会产生更大的不同。当涉及到FIX重复组时,我特别只看到了2级嵌套,但协议允许任何级别的嵌套。
免责声明:我是CoralFIX的开发者之一。