2010-12-12 54 views
4

我正在编写使用quickfix库的程序。文件非常差,所以我要求SO研究员的帮助。在quickfix/C++中重复组

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

非常感谢您提前。

+0

HEADS UP:即使FAQ指出不同的quickfix(从1.13.3开始)也不会做没有数据字典的重复组。如果您看到FieldNotFound异常被抛出,您知道存在的组,请仔细检查您的配置。 – poindexter 2011-07-26 17:58:00

回答

2

有在FieldMap类,这是一个超类MessageGroup类的迭代器。

我不确定你的意思是什么,解析重复组

修复引擎在您到达并解析您的回调时为您解析原始修复消息修复消息 - 其中包含标记的内部映射(键/值),用于消息头,主体和尾部中的标记。

查看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元件,又名消息(FieldMap)中的num组。

group.get(field)是使用每个标签的宏创建的,该标签有效地翻译为(map).getField(field)。 在初始化过程中,组的(映射)是对标签所属对象的引用,所以它返回特定组中的标签(参见示例src/C++/fix44/NewOrderSingle.h它具有扩展组的两个内部类)

Hope这是有道理的。

3

使用Quickfix库以及如何构建FIX消息的文档。否则,要破译消息的组织方式是非常困难的。

这是从 Quickfix website

您的消息是MarketDataSnapshotFullRefresh类对象的例子。

FIX::NoMDEntries noMDEntries; 
message.get(noMDEntries); -> 

你得到了重复组的数量,你需要多少次迭代对象消息才能获得所有条目。记住FIX :: NoMDEntries是一个字段。

FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; -> 

这有点棘手。你进入一个消息来获取组。这里NoMDEntries是MarketDataSnapshotFullRefresh类中的封闭类。记住这是会给你数据的班级。现在要么通过循环运行,要么多次写入相同的代码来提取每个组内的所有字段。 getGroup为您提供从中提取字段的组。 getField会为您提供现场数据。 Quickfix的大多数命名是FIX消息。所以请参考一个FIX消息网站,如 Fiximate,你的生活将会更容易。

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); 
+0

+1为你的孤独Fiximate。但是,你似乎没有回答我关于迭代器的问题(我已经阅读过Quickfix文档)。 – 2010-12-13 17:23:55

+0

@Luca Martini - 不使用内部迭代器,主要是Field迭代器会更容易。他们将需要知道哪些字段在哪个位置的开销。使用公共功能使用提供的功能解析您的消息以返回组。 get和set函数应该是你应该用来解析消息的函数,除非你正在对库进行更改。 – DumbCoder 2010-12-13 17:43:19