저는 quickfix 라이브러리를 사용하는 프로그램을 작성하고 있습니다. 문서는 매우 열악하므로 SO 동료의 도움을 요청합니다.quickfix/C++의 그룹 반복
그룹 클래스에서 반복자가 있음을 확인했습니다. 그래서 반복되는 그룹을 파싱하는 STL-ish 방법이 있다고 가정합니다. 내가 잘못? 누구나 간단한 예제를 제공 할 수 있습니까?
대단히 감사합니다.
저는 quickfix 라이브러리를 사용하는 프로그램을 작성하고 있습니다. 문서는 매우 열악하므로 SO 동료의 도움을 요청합니다.quickfix/C++의 그룹 반복
그룹 클래스에서 반복자가 있음을 확인했습니다. 그래서 반복되는 그룹을 파싱하는 STL-ish 방법이 있다고 가정합니다. 내가 잘못? 누구나 간단한 예제를 제공 할 수 있습니까?
대단히 감사합니다.
는 Message
및 Group
클래스의 슈퍼 클래스입니다 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
참조는 그룹을 확장 내부 클래스 커플 가짐)
희망 그것은 다소 의미가 있습니다.
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);
귀하의 lonk가 +1 할 +1. 그러나, 당신은 반복기 (나는 이미 Quickfix 문서를 읽었습니다)에 대한 내 질문에 대답하는 것 같지 않습니다. –
@ 루카 마티니 (Luca Martini) - 내부 반복자, 주로 필드 반복자를 사용하는 것이 더 쉬울 것입니다. 어떤 필드가 어느 위치에 있는지를 아는 오버 헤드가 필요합니다. 공용 함수를 사용하여 제공된 함수를 사용하여 메시지를 구문 분석하여 그룹을 반환 할 수 있습니다. get 및 set 함수는 라이브러리를 변경하기 전까지는 메시지를 구문 분석하는 데 사용해야하는 함수 여야합니다. – DumbCoder
HEADS UP : FAQ에 다른 quickfix (1.13.3 현재)가 데이터 사전이없는 반복 그룹을 만들지 않더라도. 알고있는 그룹에 대해 던져지는 FieldNotFound 예외가 표시되면 설정을 다시 확인하십시오. – poindexter