2017-06-29 7 views
1

Je travaille sur les marchés boursiers et boursiers. J'ai une situation comme: Je dois prendre une chaîne du journal et la convertir en objet de type "Message". Selon this link j'ai essayé d'utiliser toutes les trois méthodes de la classe "MessageUtils" dans JAVA. Mais ma chaîne est supprimée dans un objet de type de classe Message avec des balises uniques. Mais comme ma chaîne est "MarketDataIncrementalRefresh", je veux que chaque balise soit présente dans le message. Par exemple: Je fournis la chaîne suivante à la méthode "MessageUtils.parse()".Comment convertir une chaîne en MarketDataIncrementalRefresh en QUICKFIX en Java?

8 = FIX.4.2 | 9 = 00795 | 35 = W | 49 = TT_PRICE | 56 = SAP0094X | 34 = 2392 | 52 = 20170623-04: 41: 33,375 | 55 = CL | 48 = 00A0HR00CLZ | 10455 = CLQ7 | 167 = FUT | 207 = CME | 15 = USD | 262 = MDRQ-751 | 200 = 201708 | 18210 = 1 | 387 = 12292 | 268 = 24 | 269 = 0 | 290 = 1 | 270 = 4290 | 271 = 33 | 269 = 0 | 290 = 2 | 270 = 4289 | 271 = 34 | 269 = 0 | 290 = 3 | 270 = 4288 | 271 = 40 | 269 = 0 | 290 = 4 | 270 = 4287 | 271 = 38 | 269 = 0 | 290 = 5 | 270 = 4286 | 271 = 46 | 269 = 0 | 290 = 6 | 270 = 4285 | 271 = 53 | 269 = 0 | 290 = 7 | 270 = 4284 | 271 = 46 | 269 ​​= 0 | 290 = 8 | 270 = 4283 | 271 = 66 | 269 = 0 | 290 = 9 | 270 = 4282 | 271 = 48 | 269 = 0 | 290 = 10 | 270 = 4281 | 271 = 64 | 269 = 1 | 290 = 1 | 270 = 4291 | 271 = 21 | 269 = 1 | 290 = 2 | 270 = 4292 | 271 = 40 | 269 = 1 | 290 = 3 | 270 = 4293 | 271 = 48 | 269 = 1 | 290 = 4 | 270 = 4294 | 271 = 83 | 269 = 1 | 290 = 5 | 270 = 4295 | 271 = 62 | 269 = 1 | 290 = 6 | 270 = 4296 | 271 = 46 | 269 = 1 | 290 = 7 | 270 = 4297 | 271 = 34 | 269 = 1 | 290 = 8 | 270 = 4298 | 271 = 55 | 269 = 1 | 290 = 9 | 270 = 4299 | 271 = 31 | 269 = 1 | 290 = 10 | 270 = 4300 | 271 = 128 | 269 = 2 | 270 = 4291 | 271 = 1 | 269 = 4 | 270 = 4280 | 269 = 7 | 270 = 4292 | 269 = 8 | 270 = 4277 | 10 = 044 |

Mais ce que je reçois est ceci:

8 = FIX.4.2 | 9 = 192 | 35 = W | 34 = 2 | 49 = TT_PRICE | 52 = 20170622-14: 16: 23.685 | 56 = SAP0094X | 15 = USD | 48 = 00A0HR00GCZ | 55 = GC | 167 = FUT | 200 = 201708 | 207 = CME | 262 = MDRQ-21 | 268 = 25 | 269 = 0 | 270 = 12510 | 271 = 24 | 290 = 1 | 387 = 121890 | 10455 = GCQ7 | 18210 = 1 | 10 = 036 |

Comme vous pouvez le constater, seules les balises uniques sont présentes dans la chaîne. Mais je veux chaque étiquette, peu importe combien de fois il existe dans la chaîne fournie.

S'il vous plaît quelqu'un peut-il m'aider à le faire en Java. Ce sera vraiment appréciable.

est en dessous du code que je utilise pour convertir:

  MessageUtils mu = new MessageUtils(); 
     Session session = Session.lookupSession(sessionID); 
     Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str); 
    // Message msg = new Message(str, false); //This can also be used for converting 
     System.out.println(msg.toString()); 
+0

Pourriez-vous poster le message FIX avec le caractère 'SOH' remplacé par le symbole de tuyau (' | ')? Comme c'est le cas maintenant, le message est trop difficile à lire et à interpréter (les séparateurs de champs sont invisibles). –

+0

Merci. bien mis à jour. –

Répondre

1

Je pense que le problème est le suivant. Il y a un groupe qui se répète qui commence par l'étiquette 286 (NoMDEntries). L'ordre des champs dans un groupe récurrent doit être strict, c'est-à-dire le même ordre que la définition du groupe répété. Voir Market Data - Snapshot/Full Refresh ou le dictionnaire de données fourni par QuickFIX/J (FIX42.xml). L'étiquette 268 devrait être suivie par 269 puis 270. Je vois dans votre chaîne de message: |268=24|269=0|290=1|270=4290| qui est l'ordre incorrect des étiquettes. C'est probablement la raison pour laquelle le message est tronqué par MessageUtils.parse.

En tant que test, vous pouvez essayer de corriger manuellement l'ordre dans la chaîne et essayer d'analyser cela pour voir si cela donne le bon message.

+0

Merci beaucoup. Le problème est avec l'ordre des tags. Merci beaucoup. –

+0

Y at-il un moyen de former la chaîne même si les étiquettes ne sont pas dans le bon ordre? –

+0

@hemachandra Définissez peut-être l'indicateur 'ValidateUnorderedGroupFields' sur' N' dans la configuration de la session. Voir [Configuration de QuickFIX/J] (http://www.quickfixj.org/quickfixj/usermanual/1.6.3/usage/configuration.html) pour plus de détails. Je ne sais pas si cela fonctionnera, mais vous pourriez essayer. –

2

L'autre fil dit:

MessageUtils.parse(MessageFactory messageFactory, DataDictionary dataDictionary, java.lang.String messageString) 

Et votre code dit:

Message msg = MessageUtils.parse(new DefaultMessageFactory(), null, str); 

Vous devez corriger votre dictionnaire de données et le transmettre à la méthode d'analyse au lieu de passer « null »

+0

Cela pourrait très bien fonctionner mieux, mais en parcourant le code sur GitHub (['MessageUtils'] (https://github.com/quickfix-j/quickfixj/blob/e2a0fc0636b70d2f735815c6773b5f8dbb993d16/quickfixj-core/src/main/java/ quickfix/MessageUtils.java) et ['Message'] (https://github.com/quickfix-j/quickfixj/blob/master/quickfixj-core/src/main/java/quickfix/Message.java)) I ' Je pense que MessageUtils fera aussi la validation (le message est invalide en raison d'une commande incorrecte). En regardant 'Message.fromString', je vois un paramètre' doValidation' qui, s'il est défini sur false, pourrait encore faire l'affaire. –

+1

En plus de mon commentaire précédent, 'MessageUtils.parse' délègue à' Message.fromString' avec le paramètre 'doValidation' défini sur' dataDictionary! = Null'. –