我正在编写一个使用quickfix库的程序。文档很差,所以我要求SO研究员的帮助。
我在Group类中看到有迭代器。所以我认为有一些STL-ish方法可以解析重复组。我错了吗? 有人可以提供一个简单的例子吗?
非常感谢你。
答案 0 :(得分:3)
使用Quickfix库以及如何构造FIX消息的文档。否则,解读消息的组织方式将非常困难。
的示例您的消息是MarketDataSnapshotFullRefresh类对象。
FIX::NoMDEntries noMDEntries;
message.get(noMDEntries); ->
您将获得重复组的计数,您需要迭代对象消息以获取所有条目的次数。记住FIX :: NoMDEntries是一个字段。
FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; ->
这有点棘手。你进入一条消息来获取组。这里NoMDEntries是MarketDataSnapshotFullRefresh类中的封闭类。记住这是给你数据的类。现在,要么运行循环,要么多次编写相同的代码,以提取每个组内的所有字段。 getGroup为您提供从中提取字段的组。 getField将为您提供现场数据。 Quickfix的大多数命名法都是FIX消息。所以请参考像 Fiximate 这样的FIX消息网站,你的生活会更容易。
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);
答案 1 :(得分:2)
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
),因此您可以迭代msg或标头中的组,并且您可以类似地迭代或搜索每个组中的标签。
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
元素,即FieldMap
组。< / p>
group.get(field)
是使用每个标记的宏创建的,有效地翻译为(map).getField(field)
。
在初始化期间,group的(map)是对标记所属对象的引用,因此它返回特定组的标记(参见示例src/C++/fix44/NewOrderSingle.h
它有几个扩展Group的内部类)
希望它有道理。