そのため、繰り返しグループの解析は安価ではなく、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
FutSettDate
SecurityDesc
実装の詳細に関しては、特に繰り返しグループ内で繰り返しグループを処理するために、再帰が必要です。再帰により、実装がより明確になり、理解することが容易になります。これは繰り返しによって行うこともできますが、コードが複雑になりすぎて、パフォーマンスが少し向上します (ナノ)。繰り返しグループ内に繰り返しグループが多すぎると、さらに違いが生じます。FIX 繰り返しグループに関しては、特に 2 レベルのネスティングしか見たことがありませんが、プロトコルではあらゆるレベルのネスティングが可能です。
免責事項:私は CoralFIX の開発者の 1 人です。