在quickfix / c ++中重复组

时间:2010-12-12 21:58:47

标签: c++ stl quickfix

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

我在Group类中看到有迭代器。所以我认为有一些STL-ish方法可以解析重复组。我错了吗? 有人可以提供一个简单的例子吗?

非常感谢你。

2 个答案:

答案 0 :(得分:3)

使用Quickfix库以及如何构造FIX消息的文档。否则,解读消息的组织方式将非常困难。

这是 Quickfix website

的示例

您的消息是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类中有一些迭代器,它是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) - &gt;有效传递来电FieldMap::getGroup(1, group.field(), group) - &gt; getGroupRef(num,field) - &gt; m_groups.find(field)为您提供了一组(vector<FieldMap*>)向量,并从消息(num)返回num元素,即FieldMap组。< / p>

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

希望它有道理。