2014-07-23 1 views
2

Je suis intéressé par l'analyse des messages FIX avec des groupes répétitifs. Quelqu'un peut-il fournir des exemples de la façon dont cela est fait au niveau de l'API avec les principaux moteurs FIX et discuter de la façon dont cela peut être fait efficacement au niveau de l'implémentation?Comment analyser des groupes répétitifs efficacement en Java avec le protocole FIX?

À titre d'exemple, je suis fournit un FIX groupe répéter:

453 NoPartyIDs 
448 PartyID 
447 PartyIDSource 
452 PartyRole 

453=3 {448=a&447=1&452=11, 448=b&447=2&452=22, 448=c&447=3&452=33} 
+1

http://www.quickfixj.org/quickfixj/usermanual/1.5.3/usage/repeating_groups.html –

Répondre

1

Donc groupes répétitifs ne sont pas pas cher pour analyser et il est une faiblesse connue du protocole FIX. Heureusement, la plupart des messages FIX sensibles (comme ExecutionReport) ne contiendront aucun groupe répétitif. Cela devient encore pire quand vous avez des groupes répétés à l'intérieur des groupes de répétition. L'astuce consiste à essayer d'analyser les groupes répétitifs uniquement pour les types de message que vous connaissez peuvent contenir des groupes répétitifs, en ignorant les groupes récurrents pour tous les autres types de message lorsqu'il s'agit d'analyser.

Ci-dessous un exemple de la façon dont vous pouvez analyser les groupes répéter avec CoralFIX:

FixParser parser = new FixParser(); 

    // define a repeating group for a message type: 
    parser.addGroupTemplate(QuoteStatusRequest, NoRelatedSym, 
          Symbol, FutSettDate, SecurityDesc); 

    FixMessage fixMsg = parser.parse(byteBufferWithFixMessage); 

    fixGroup = fixMsg.getGroup(NoRelatedSym); 

    System.out.println(fixGroup.getNumberOfElements()); // => 4 

    // you can also print the whole fix group for debugging purposes: 
    System.out.println(fixGroup); 
    // Symbol(55)=AAPL FutSettDate(64)=1 SecurityDesc(107)=blah1 | Symbol(55)=IBM FutSettDate(64)=2 SecurityDesc(107)=blah2 | Symbol(55)=LDK FutSettDate(64)=3 SecurityDesc(107)=blah3 | Symbol(55)=FB FutSettDate(64)=4 SecurityDesc(107)=blah4 

    System.out.println(); 

    Iterator<FixGroupElement> iter = fixGroup.iterator(); 

    while(iter.hasNext()) { 

     FixGroupElement elem = iter.next(); 

     // fetch fix tag values as usual: 
     System.out.println(elem.getString(Symbol)); 
     System.out.println(elem.getInt("FutSettDate")); 
     System.out.println(elem.getString(107)); 

     // you can also print the whole element for debugging purposes: 
     System.out.println(elem); 
     System.out.println(); 
    } 
} 

Ainsi, vous pouvez voir ci-dessus que nous indiquons explicitement à l'analyseur que le type de message QuoteStatusRequest peut contenir un groupe répétitif défini par tag NoRelatedSym et les étiquettes de correction Symbol, FutSettDate et SecurityDesc. Les autres types de message n'auront aucun surcoût dans l'analyseur en raison de ce groupe répétitif. Vous pouvez en savoir plus sur le code source ci-dessus here. Maintenant, en ce qui concerne les détails d'implémentation, vous avez besoin de la récursivité, en particulier pour gérer les groupes répétitifs à l'intérieur de groupes répétitifs. La récursivité rend la mise en œuvre beaucoup plus claire à suivre et à comprendre. Cela peut aussi être fait par itération mais le code devient trop compliqué pour juste un peu plus de performance (nanos). Cela ferait plus de différence si vous aviez trop de groupes répétitifs à l'intérieur de groupes répétitifs. J'ai particulièrement vu seulement 2 niveaux d'imbrication quand il s'agit de groupes répétitifs FIX, mais le protocole permet n'importe quel niveau d'imbrication.

Avertissement: Je suis l'un des développeurs de CoralFIX.

Questions connexes