Как преобразовать строку в MarketDataIncrementalRefresh в QUICKFIX на Java?

Я работаю на фондовых и биржевых рынках. У меня такая ситуация: мне нужно взять строку из журнала и преобразовать ее в объект типа «Сообщение». В соответствии с этой ссылкой я попытался использовать все три метода "MessageUtils "класс в JAVA. Но моя строка разделяется на объект типа класса Message с уникальными тегами. Но поскольку моя строка имеет тип «MarketDataIncrementalRefresh», я хочу, чтобы каждый тег присутствовал в сообщении.

Например: я предоставляю следующую строку методу «MessageUtils.parse()».

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|

Но я получаю следующее:

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|

Как видите, в String присутствуют только уникальные теги. Но мне нужен каждый тег, независимо от того, сколько раз он существует в предоставленной строке.

Пожалуйста, помогите мне сделать это в JAVA. Это будет действительно заметно.

Ниже приведен код, который я использую для преобразования:

         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());

person hema chandra    schedule 29.06.2017    source источник
comment
Не могли бы вы опубликовать сообщение FIX с заменой символа SOH на символ вертикальной черты (|)? В нынешнем виде сообщение слишком сложно читать и интерпретировать (разделители полей невидимы).   -  person TT.    schedule 29.06.2017
comment
Спасибо . конечно обновился.   -  person hema chandra    schedule 29.06.2017


Ответы (2)


Думаю проблема в следующем. Есть повторяющаяся группа, которая начинается с тега 286 (NoMDEntries). Порядок полей в повторяющейся группе должен быть строгим, т.е. таким же, как в определении повторяющейся группы. См. Рыночные данные — снимок/полное обновление или словарь данных, предоставленный QuickFIX/J (FIX42.xml).

За тегом 268 должно следовать 269, а затем 270. Я вижу в строке вашего сообщения: |268=24|269=0|290=1|270=4290|, что является неправильным порядком тегов. Это, вероятно, причина, по которой сообщение усекается на MessageUtils.parse.

В качестве теста вы можете попытаться вручную исправить порядок в строке и попытаться проанализировать ее, чтобы увидеть, дает ли это правильное сообщение.

person TT.    schedule 29.06.2017
comment
Спасибо большое. Проблема с порядком тегов. Огромное спасибо. - person hema chandra; 29.06.2017
comment
Есть ли способ сформировать строку, даже если теги не в правильном порядке? - person hema chandra; 29.06.2017
comment
@hemachandra Возможно, установите флаг ValidateUnorderedGroupFields на N в конфигурации сеанса. Дополнительные сведения см. в разделе QuickFIX/J. Я понятия не имею, сработает ли это, но вы можете попробовать. - person TT.; 29.06.2017
comment
@hemachandra Если это не сработает, возможно, предоставьте свой собственный DataDictionary. Или измените FIX42.xml и перестройте QuickFIX/J, чтобы отразить измененный порядок (см. Когда следует перестраивать QuickFIX/J и Инструкции по перестроению QuickFIX/J). - person TT.; 29.06.2017
comment
Спасибо. Это не сработало. Я попрошу свою команду перестроить FIX42.xml. Еще раз, спасибо - person hema chandra; 30.06.2017
comment
@hemachandra Пересборка QuickFIX/J после изменения порядка полей в FIX42.xml определенно должна работать, поскольку это предписанный способ работы. Я надеюсь, что вы добились успеха, если нет, вы всегда можете задать новый вопрос здесь, в Stack Overflow, за помощью. - person TT.; 30.06.2017

В другой ветке написано:

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

И ваш код говорит:

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

Поэтому вам нужно исправить свой словарь данных и передать его методу синтаксического анализа вместо передачи 'null'

person rupweb    schedule 30.06.2017
comment
Это могло бы работать лучше, но просмотр кода на GitHub (MessageUtils и Message) Я думаю, что MessageUtils также выполнит проверку (сообщение недействительно из-за неправильного порядка). Глядя на Message.fromString, я вижу параметр doValidation, который, если он установлен в false, все еще может помочь. - person TT.; 30.06.2017
comment
В дополнение к моему предыдущему комментарию MessageUtils.parse делегирует Message.fromString с параметром doValidation, установленным на dataDictionary != null. - person TT.; 30.06.2017