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