クイックフィックス ライブラリを使用するプログラムを作成しています。ドキュメンテーションは非常に貧弱なので、SOフェローの助けを求めています。
Group クラスにイテレータがあることがわかりました。したがって、繰り返しグループを解析するSTL風の方法があると思います。私が間違っている?誰かがそれを行うための簡単な例を提供できますか?
事前にどうもありがとうございました。
FIXメッセージの作成方法に関するドキュメントと一緒にQuickfixライブラリを使用してください。そうでなければ、メッセージがどのように編成されているかを解読することは非常に困難です。
メッセージはMarketDataSnapshotFullRefreshクラスオブジェクトです。
FIX::NoMDEntries noMDEntries;
message.get(noMDEntries); ->
繰り返しグループの数、すべてのエントリを取得するためにオブジェクトメッセージを反復処理する必要がある回数を取得します。FIX::NoMDEntriesはフィールドであることを忘れないでください。
FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; ->
これは少し注意が必要です。あなたはグループを取得するためにメッセージの中に入ります。ここで、NoMDEntriesは、MarketDataSnapshotFullRefreshクラス内の囲まれたクラスです。これはあなたにデータを与えるクラスであることを思い出してください。ここで、ループを実行するか、同じコードを複数回記述して、各グループ内のすべてのフィールドを抽出します。getGroupは、フィールドを抽出するグループを提供します。getFieldはフィールドデータを提供します。Quickfixの命名法のほとんどはFIXメッセージです。したがって、 FiximateのようなFIXメッセージのWebサイトを参照すると、作業がはるかに簡単になります。
FIX::MDEntryType MDEntryType;
FIX::MDEntryPx MDEntryPx;
FIX::MDEntrySize MDEntrySize;
FIX::OrderID orderID;
message.getGroup(1, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);
group.get(orderID);
message.getGroup(2, group);
group.get(MDEntryType);
group.get(MDEntryPx);
group.get(MDEntrySize);
group.get(orderID);
and クラスFieldMap
のスーパークラスであるクラスにはイテレータがあります。Message
Group
繰り返しグループを解析することで何を意味するのかわかりません。
修正エンジンは、未加工の修正メッセージが到着すると解析し、コールバックが解析された FIX メッセージを取得します。これには、メッセージのヘッダー、本文、および末尾のタグのタグ (キー/値) の内部マップがあります。
1.13.2 バージョンのコードを見ると、エンジンがネットワークから新しい文字列メッセージを取得すると、最終的Message
には文字列を渡すメッセージが作成されます。コンストラクターは、受信した文字列を効果的に解析し、タグのマップを作成するそれ自体をMessage
呼び出します。setString()
見るMessage::setString
と、最初に新しいフィールドが追加され、次にsetGroup
フィールドがグループの一部であるかどうかがチェックされることがわかります。その場合、このメソッド はsetGroup
、これらのタグがグループの一部である間、次のタグの解析を引き継ぎます。グループの一部ではないタグに遭遇すると、グループの解析を停止し、戻ってメッセージからフィールドの解析を続行します。
これはすべて、受信したメッセージを処理するアプリへのコールバックの前に内部的に発生します。
メッセージ内のフィールドを反復処理する方法があります。ヘッダー、本文、またはグループ (および各グループ) のフィールドを反復処理できます。
const FIX40::ExecutionReport& msg; // new incoming message
// iterate over header
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.getHeader().begin();
FIX::FieldMap::iterator e = msg.getHeader().end();
for(it = b; it != e; ++it)
{
switch(it->first)
{
case FIX::FIELD::MsgSeqnum:
/* it->second.getString() - do something with tag data*/ ;
break;
...
}
}
本体についても同様です。
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
また、グループ イテレータ ( FieldMap::g_begin/g_end
) もあるので、メッセージまたはヘッダー内のグループを反復処理でき、同様に各グループ内のタグを反復処理または検索できます。
Group と Message は FieldMap を拡張するため、すべての getField/setField 機能が共有されます。
内部 ... 詳細が多すぎる場合はスキップします。
上記の例では、このコード:
message.getGroup(1, group);
group.get(MDEntryType);
message.getGroup(1, group)
-> FieldMap::getGroup(1, group.field(), group)
-> getGroupRef(num,field)
- >からの呼び出しを効果的m_groups.find(field)
に渡します。これにより、グループのベクトル ( vector<FieldMap*>
) が返され、num
要素、num
つまりメッセージからのグループ (a FieldMap
) が返されます。
group.get(field)
として効果的に変換される各タグのマクロを使用して作成され(map).getField(field)
ます。初期化中、グループの(マップ)は、タグがメンバーであるオブジェクトへの参照であるため、特定のグループからタグを返します(src/C++/fix44/NewOrderSingle.h
グループを拡張する内部クラスがいくつかある例を参照)
意味があることを願っています。