4

我正在编写一个使用 quickfix 库的程序。文档很差,所以我请求SO研究员的帮助。

我在 Group 类中看到有迭代器。所以我想有一些 STL 式的解析重复组的方式。我错了吗?任何人都可以提供一个简单的例子吗?

非常感谢您提前。

4

2 回答 2

3

使用 Quickfix 库以及如何构建 FIX 消息的文档。否则,将很难破译消息是如何组织的。

这是来自Quickfix 网站的示例

您的消息是 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);
于 2010-12-13T14:58:49.037 回答
2

类中有迭代器,它是和 类FieldMap的超类。MessageGroup

我不确定解析重复组是什么意思。

修复引擎在它们到达时为您解析原始修复消息,并且您的回调得到解析的 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消息中的组 (a FieldMap)。

group.get(field)是使用每个标记的宏创建的,有效地翻译为(map).getField(field). 在初始化期间,组的(映射)是对标签所属对象的引用,因此它从特定组返回标签(参见示例src/C++/fix44/NewOrderSingle.h,它有几个扩展组的内部类)

希望它有一些意义。

于 2011-01-04T04:06:24.327 回答