Повторяющиеся группы в quickfix / c ++ - PullRequest
4 голосов
/ 13 декабря 2010

Я пишу программу, которая использует библиотеку быстрого исправления. Документация очень плохая, поэтому я обращаюсь за помощью к ТАК.

Я видел в классе Group, что есть итераторы. Итак, я полагаю, что существует некоторый STL-иш способ разбора повторяющихся групп Я ошибся? Кто-нибудь может привести простой пример для этого?

Большое спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

Используйте библиотеку Quickfix вместе с документацией о том, как создаются сообщения FIX. В противном случае было бы очень трудно понять, как организованы сообщения.

Это пример с веб-сайта Quickfix

Ваше сообщение является объектом класса 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);
2 голосов
/ 04 января 2011

В классе FieldMap есть итераторы, которые являются суперклассами классов Message и Group.

Я не уверен, что вы подразумеваете под анализом повторяющихся групп .

Механизм исправления анализирует необработанные сообщения исправления для вас, когда они приходят, и ваш обратный вызов получает проанализированное сообщение FIX, которое содержит внутренние карты тегов (ключ / значение) для тегов в заголовке сообщения, теле и хвосте.

Глядя на версию кода 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), чтобы вы могли перебирать группы в сообщениях или заголовках, и вы можете аналогичным образом перебирать или искать теги в каждой группе.

Группа, а также Message расширяет FieldMap, поэтому все функции getField / setField являются общими для всех.

Internals ... пропустите, если слишком много деталей.

В приведенном выше примере этот код:

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, то есть num группа из сообщения (a FieldMap).

group.get(field) создается с использованием макросов для каждого тега, который фактически переводится как (map).getField(field). Во время инициализации (map) для группы является ссылкой на объект, членом которого является тег, поэтому он возвращает тег из определенной группы (см. Пример src/C++/fix44/NewOrderSingle.h, у него есть пара внутренних классов, расширяющих группу)

Надеюсь, что это имеет какой-то смысл.

...