2010-12-12 74 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