2

I am working on the Stock and Exchange Markets. I have a situation like : I need to take a string from the log and convert it to "Message" type Object. As per this link I have tried using all the three methods of the "MessageUtils" class in JAVA. But my String is being stripped to a Message class type object with unique tags. But as my string is "MarketDataIncrementalRefresh" type I want each every tag to be present in the Message.

For example : I am providing the following string to "MessageUtils.parse()" method.

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|

But what I am getting is this:

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|

As you can observe only unique tags are present in the String. But I want each and every tag , no matter how many times it exists in the provided string.

Please can anyone help me doing this in JAVA. It will be really appreciable.

Below is the code I am using for converting :

         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());
hema chandra
  • 402
  • 1
  • 8
  • 29
  • Could you post the FIX message with the `SOH` character replaced by the pipe symbol (`|`)? As it is now the message is too hard to read and interpret (the field separators are invisible). – TT. Jun 29 '17 at 12:03

2 Answers2

2

The other thread says:

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

And your code says:

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

So you need to fix your data dictionary and pass it to the parse method instead of passing 'null'

rupweb
  • 3,052
  • 1
  • 30
  • 57
  • This could very well work better, but browsing through the code on GitHub ([`MessageUtils`](https://github.com/quickfix-j/quickfixj/blob/e2a0fc0636b70d2f735815c6773b5f8dbb993d16/quickfixj-core/src/main/java/quickfix/MessageUtils.java) and [`Message`](https://github.com/quickfix-j/quickfixj/blob/master/quickfixj-core/src/main/java/quickfix/Message.java)) I'm thinking MessageUtils will do validation as well (the message is invalid due to incorrect ordering). Looking at `Message.fromString` through I'm seeing a parameter `doValidation` which if set to false could still do the trick. – TT. Jun 30 '17 at 07:39
  • 1
    Further to my previous comment, `MessageUtils.parse` delegates to `Message.fromString` with parameter `doValidation` set to `dataDictionary != null`. – TT. Jun 30 '17 at 07:40
1

I think the problem is as follows. There's a repeating group that starts with tag 286 (NoMDEntries). The order of fields in a repeating group should be strict, i.e. the same order as the definition of the repeating group. See Market Data - Snapshot/Full Refresh or the data dictionnary supplied by QuickFIX/J (FIX42.xml).

The 268 tag should be followed by 269 and then 270. I am seeing in your message string: |268=24|269=0|290=1|270=4290| which is the incorrect order of tags. That is probably the reason why the message is truncated by MessageUtils.parse.

As a test you could try to manually correct the order in the string and try parsing that to see if that gives the correct message.

TT.
  • 15,774
  • 6
  • 47
  • 88
  • Thank you very much. The problem is with the order of tags. Thank you very very much. – hema chandra Jun 29 '17 at 14:10
  • Is there a way to form the string even if the tags are not in the correct order? – hema chandra Jun 29 '17 at 15:24
  • @hemachandra Perhaps set the `ValidateUnorderedGroupFields` flag to `N` in configuration for the session. See [QuickFIX/J configuration](http://www.quickfixj.org/quickfixj/usermanual/1.6.3/usage/configuration.html) for details. I have no idea whether that will work, but you could give it a try. – TT. Jun 29 '17 at 16:23
  • @hemachandra If that doesn't work, perhaps provide your own DataDictionary. Or alter the FIX42.xml and rebuild QuickFIX/J to reflect the altered order (see [When should I rebuild QuickFIX/J](https://stackoverflow.com/a/29753506/243373) and [Instructions on how to rebuild QuickFIX/J](https://stackoverflow.com/a/29971247/243373)). – TT. Jun 29 '17 at 16:34
  • Thank you. It didn't work. I will ask my team to rebuild FIX42.xml. Thank you once again – hema chandra Jun 30 '17 at 04:42
  • @hemachandra Rebuilding QuickFIX/J after reordering fields in FIX42.xml should definitely work as that is the prescribed way of going about things. I hope you are successful, if not you can always ask a new question here on Stack Overflow for help. – TT. Jun 30 '17 at 07:28