2010-12-12 6 views
4

J'écris un programme qui utilise la bibliothèque quickfix. La documentation est très pauvre, donc je demande l'aide des boursiers de SO.Répétition de groupes dans quickfix/C++

J'ai vu dans la classe Group qu'il existe des itérateurs. Donc, je suppose qu'il y a une façon STL-ish d'analyser les groupes qui se répètent. Ai-je tort? Quelqu'un peut-il donner un exemple simple pour cela?

Merci beaucoup d'avance.

+0

HEADS UP: même si la FAQ indique un correctif différent (à partir de 1.13.3), il ne s'agira pas de groupes répétitifs sans dictionnaire de données. Si vous voyez des exceptions FieldNotFound lancées pour des groupes que vous connaissez, vérifiez votre configuration. – poindexter

Répondre

2

Il y a itérateurs dans FieldMap classe qui est une super-classe de la classe Message et Group.

Je ne suis pas sûr de savoir ce que vous voulez dire par l'analyse des groupes répétitifs. Le moteur de correction analyse les messages de correctif brut lorsqu'ils arrivent et que le rappel est analysé. Message FIX - qui contient des mappes internes de balises (clé/valeur) pour les balises dans l'en-tête, le corps et la queue du message. En regardant la version 1.13.2 du code, quand le moteur reçoit un nouveau message de chaîne à partir du réseau, il créera éventuellement un Message lui passant la chaîne. Message constructeur appelle ensuite setString() sur lui-même qui analyse efficacement la chaîne reçue et crée une carte d'étiquettes.

Si vous regardez Message::setString, vous pouvez voir que le nouveau champ est ajouté en premier, puis en setGroup il vérifie si le champ fait partie du groupe. Si c'est alors cette méthode, setGroup, prend en charge l'analyse des balises suivantes alors que ces balises font partie du groupe. Une fois qu'il rencontre une balise qui ne fait pas partie du groupe, elle arrête l'analyse du groupe, elle renvoie et continue d'analyser les champs du message.

Maintenant tout cela se produit en interne avant le rappel à votre application où vous gérez le message reçu.

Il existe un moyen d'itérer sur les champs d'un message. Vous pouvez itérer sur des champs d'en-tête, de corps ou de groupes (et sur chaque groupe).

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; 
     ... 
    } 
} 

Et de même pour le corps:

FIX::FieldMap::iterator it; 
FIX::FieldMap::iterator b = msg.begin(); 
FIX::FieldMap::iterator e = msg.end(); 

Et il y a des groupes iterator (FieldMap::g_begin/g_end) et pour que vous puissiez itérer groupes msg ou en-tête et vous pouvez de la même itérer, ou la recherche, les étiquettes dans les chaque groupe. Le groupe ainsi que le message étend FieldMap afin que toutes les fonctionnalités getField/setField soient partagées.

Internes ... ignorer si trop de détails.

Dans l'exemple ci-dessus ce code:

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

passe efficacement l'appel de message.getGroup(1, group) ->FieldMap::getGroup(1, group.field(), group) ->getGroupRef(num,field) ->m_groups.find(field) qui vous donne un vecteur de groupes (vector<FieldMap*>) et renvoie l'élément num, alias le groupe num du message (un FieldMap).

group.get(field)group.get(field) est créé en utilisant des macros pour chaque étiquette qui est effectivement traduit par (map).getField(field). Lors de l'initialisation le (map) pour le groupe est une référence à l'objet dont la balise est membre afin qu'elle renvoie la balise du groupe spécifique (voir l'exemple src/C++/fix44/NewOrderSingle.h il a deux classes internes qui étendent le groupe)

Hope ça a du sens.

3

Utilisez la bibliothèque Quickfix avec la documentation de la construction des messages FIX. Sinon, il serait très difficile de déchiffrer comment les messages sont organisés.

Voici un exemple de Quickfix website

Votre message est l'objet de classe MarketDataSnapshotFullRefresh.

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

Vous obtenez le nombre de groupes répétitifs, combien de fois vous devez itérer sur le message d'objet pour obtenir toutes les entrées. Rappelez-vous FIX :: NoMDEntries est un champ.

FIX42::MarketDataSnapshotFullRefresh::NoMDEntries group; -> 

Ceci est un peu difficile. Vous allez dans un message pour obtenir les groupes. Ici, NoMDEntries est une classe incluse dans la classe MarketDataSnapshotFullRefresh. Rappelez-vous ceci est la classe qui vous donnera les données. Maintenant, soit vous exécutez une boucle ou écrivez le même code plusieurs fois pour extraire tous les champs à l'intérieur de chaque groupe. getGroup vous donne le groupe à partir duquel vous extrayez les champs. getField vous donnera les données de terrain. La plupart des nomenclatures de Quickfix sont des messages FIX. Alors, référez-vous à un site Web de message FIX comme Fiximate et votre vie sera beaucoup plus facile.

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 pour votre appartenance à Fiximate. Cependant, vous ne semblez pas répondre à ma question sur l'itérateur (j'ai déjà lu les documents Quickfix). –

+0

@Luca Martini - Il vous sera plus facile de ne pas utiliser les itérateurs internes, principalement les itérateurs de champ. Ils auront besoin des frais généraux de savoir quels champs sont à quelle position. Utilisez les fonctions publiques pour analyser vos messages à l'aide des fonctions fournies pour vous renvoyer les groupes. Les fonctions get et set doivent être les fonctions que vous devez utiliser pour analyser les messages, à moins que vous n'effectuiez des modifications dans la bibliothèque. – DumbCoder