C++ quickfix/c+中的重复组+;
我正在编写一个使用quickfix库的程序。文件很差,因此我请求so研究员的帮助 我在Group类中看到了迭代器。因此,我假设有某种类似STL的方法来解析重复组。我错了吗? 有人能提供一个简单的例子来说明这一点吗C++ quickfix/c+中的重复组+;,c++,stl,quickfix,C++,Stl,Quickfix,我正在编写一个使用quickfix库的程序。文件很差,因此我请求so研究员的帮助 我在Group类中看到了迭代器。因此,我假设有某种类似STL的方法来解析重复组。我错了吗? 有人能提供一个简单的例子来说明这一点吗 非常感谢您的光临。请使用Quickfix库以及有关如何构造修复消息的文档。否则很难破译这些信息是如何组织的 这是我们的一个例子 您的消息是MarketDataSnapshotFullRefresh类对象 FIX::NoMDEntries noMDEntries; message.ge
非常感谢您的光临。请使用Quickfix库以及有关如何构造修复消息的文档。否则很难破译这些信息是如何组织的 这是我们的一个例子 您的消息是MarketDataSnapshotFullRefresh类对象
FIX::NoMDEntries noMDEntries;
message.get(noMDEntries); ->
您将获得重复组的计数,即需要迭代对象消息多少次才能获得所有条目。记住FIX::NoMDEntries是一个字段
FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; ->
这有点棘手。你进入一条信息中,以获取群组。这里,NoMDEntries是MarketDataSnapshotFullRefresh类中的一个封闭类。请记住,这是将为您提供数据的类。现在,要么运行循环,要么多次编写相同的代码,以提取每个组中的所有字段。getGroup提供从中提取字段的组。getField将为您提供字段数据。Quickfix的大多数术语都是修复消息。因此,参考一个像这样的修复信息网站,你的生活就会轻松得多
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);
FieldMap
类中有迭代器,它是Message
和Group
类的超类
我不知道你所说的解析重复组是什么意思
当原始修复消息到达时,修复引擎会为您解析它们,您的回调会得到已解析的修复消息-它具有消息头、正文和尾部中标记的内部标记映射(键/值)
查看1.13.2版本的代码,当引擎从网络获取新的字符串消息时,它最终将创建一条消息
并将字符串传递给它<代码>消息构造函数然后对自身调用setString()
,该构造函数有效地解析接收到的字符串并创建标记映射
如果查看Message::setString
可以看到,首先添加了新字段,然后在setGroup
中检查字段是否是组的一部分。如果是,则此方法,setGroup
,将接管以下标记的解析,而这些标记是组的一部分。一旦遇到不属于组的标记,它就会停止解析组,返回并继续解析消息中的字段
现在,这一切都发生在你处理收到的消息的应用程序回调之前
有一种方法可以迭代消息中的字段。您可以迭代标题、正文或组(以及每个组)的字段
身体也是如此:
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
还有组迭代器(FieldMap::g_begin/g_end
),因此您可以在msg或header中对组进行迭代,也可以在每个组中迭代或搜索标记
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;
...
}
}
组以及消息扩展了FieldMap,因此所有的getField/setField功能都可以在多个应用程序之间共享
内部。。。如果细节太多,请跳过。
在上面的示例中,此代码:
message.getGroup(1, group);
group.get(MDEntryType);
有效地传递来自message.getGroup(1,group)
->FieldMap::getGroup(1,group.field(),group)
->getGroupRef(num,field)
->m\u groups.find(field)
,它提供组向量(vector
),并返回num
元素,aka消息中的num
组(aFieldMap
)
group.get(field)
是使用宏为每个标记创建的,这些标记被有效地转换为(map).getField(field)
。
在初始化期间,组的(映射)是对标记所属对象的引用,因此它从特定组返回标记(参见示例src/C++/fix44/neworderssingle.h
它有两个扩展组的内部类)
希望它有一定的意义。+1让您的lonk修复。但是,您似乎没有回答我关于迭代器的问题(我已经阅读了Quickfix文档)。@Luca Martini-您不使用内部迭代器,主要是字段迭代器会更容易。它们需要知道哪些字段位于哪个位置的开销。使用公共函数来解析消息,使用提供的函数返回组。get和set函数应该是您应该用来解析消息的函数,除非您正在对库进行更改。提醒:即使FAQ声明不同的quickfix(从1.13.3开始)在没有数据字典的情况下也不会执行重复组。如果看到已知存在的组引发FieldNotFound异常,请仔细检查配置。