2010-12-12 4 views
4

저는 quickfix 라이브러리를 사용하는 프로그램을 작성하고 있습니다. 문서는 매우 열악하므로 SO 동료의 도움을 요청합니다.quickfix/C++의 그룹 반복

그룹 클래스에서 반복자가 있음을 확인했습니다. 그래서 반복되는 그룹을 파싱하는 STL-ish 방법이 있다고 가정합니다. 내가 잘못? 누구나 간단한 예제를 제공 할 수 있습니까?

대단히 감사합니다.

+0

HEADS UP : FAQ에 다른 quickfix (1.13.3 현재)가 데이터 사전이없는 반복 그룹을 만들지 않더라도. 알고있는 그룹에 대해 던져지는 FieldNotFound 예외가 표시되면 설정을 다시 확인하십시오. – poindexter

답변

2

MessageGroup 클래스의 슈퍼 클래스입니다 FieldMap 클래스의 반복자가 있습니다.

나는 을 반복 그룹으로 구문 분석하여 무엇을 의미하는지 모르겠습니다..

수정 엔진이 도착하여 콜백이 구문 분석 된 고정 메시지를 구문 분석합니다. 메시지 헤더, 본문 및 꼬리의 태그에 대한 내부 맵 (키/값)이있는 고정 메시지입니다.

코드의 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(); 

을 그리고 당신은 MSG 또는 헤더에서 그룹을 반복 할 수 및 유사하게 반복 할 수 또는 검색 있도록뿐만 아니라 그룹 (FieldMap::g_begin/g_end를) 반복자가, 태그 내에서 각 그룹.

Group뿐만 아니라 Message도 FieldMap을 확장하므로 모든 getField/setField 기능이 공유됩니다.

내부 ... 너무 자세히 입력하면 건너 뜁니다. 위의 예에서

이 코드 : 효과적으로 message.getGroup(1, group)에서 호출을 전달

message.getGroup(1, group); 
group.get(MDEntryType); 

->FieldMap::getGroup(1, group.field(), group) ->getGroupRef(num,field) - 당신에게 그룹의 벡터 (vector<FieldMap*>)를 제공하고 num 요소를 반환>m_groups.find(field), 메시지에서 num 그룹 (a FieldMap).

group.get(field)(map).getField(field)으로 효과적으로 번역되는 각 태그에 대한 매크로를 사용하여 생성됩니다. 그룹 초기화 제 (MAP) 중 태그 그래서이 특정 그룹의 태그를 반환의 구성원 인 객체에 대한 참조 (예 src/C++/fix44/NewOrderSingle.h 참조는 그룹을 확장 내부 클래스 커플 가짐)

희망 그것은 다소 의미가 있습니다.

3

FIX 메시지 작성 방법에 대한 문서와 함께 Quickfix 라이브러리를 사용하십시오. 그렇지 않으면 메시지 구성 방법을 해독하기가 매우 어려울 것입니다.

Quickfix website

귀하의 메시지가 MarketDataSnapshotFullRefresh 클래스 객체 인에서 예입니다.

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

모든 항목을 얻으려면 오브젝트 메시지를 반복 할 횟수를 알아야합니다. FIX :: NoMDEntries는 필드라는 것을 기억하십시오.

FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; -> 

이것은 약간 까다 롭습니다. 당신은 메시지를 들으면 그룹을 얻습니다. 여기서 NoMDEntries는 MarketDataSnapshotFullRefresh 클래스의 동봉 된 클래스입니다. 이 클래스는 데이터를 제공하는 클래스입니다. 이제 루프를 돌리거나 동일한 코드를 여러 번 작성하여 각 그룹 내의 모든 필드를 추출하십시오. getGroup은 필드를 추출 할 그룹을 제공합니다. getField가 필드 데이터를 제공합니다. Quickfix의 명명법 대부분은 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); 
+0

귀하의 lonk가 +1 할 +1. 그러나, 당신은 반복기 (나는 이미 Quickfix 문서를 읽었습니다)에 대한 내 질문에 대답하는 것 같지 않습니다. –

+0

@ 루카 마티니 (Luca Martini) - 내부 반복자, 주로 필드 반복자를 사용하는 것이 더 쉬울 것입니다. 어떤 필드가 어느 위치에 있는지를 아는 오버 헤드가 필요합니다. 공용 함수를 사용하여 제공된 함수를 사용하여 메시지를 구문 분석하여 그룹을 반환 할 수 있습니다. get 및 set 함수는 라이브러리를 변경하기 전까지는 메시지를 구문 분석하는 데 사용해야하는 함수 여야합니다. – DumbCoder