2017-02-16 9 views
0

Я новичок с быстрым исправлением, но, поверьте мне, я тщательно изучил все форумы и не нашел решения для этого сценария. Я использую quick fix 1.6 libs. У меня есть сообщение FIX, в котором есть повторяющаяся группа. Когда я отправляю это сообщение с помощью метода sendToTarget(), сообщение отправляется на сервер FIX без проблем, но поля получают переупорядочивание, из-за которого обмен отклоняет его. Читая сообщения, я узнал, что использование словаря данных решит проблему. Но когда я использую словарь данных с тем же сообщением, я получаю «быстрое исправление .InvalidMessage: знак равенства не найден в поле« исключение. Я знаю, что это достоверное сообщение в словаре данных. Ниже приведены сообщение и код. Может кому-то помочь. Заранее спасибо.quickfix.InvalidMessage исключение, заброшенное даже с допустимым сообщением

FIX Сообщение: 8 = FIXT.1.1 | 9 = 00331 | 35 = АЕ | 49 = AAA_FIX | 56 = BBB_FIX | 34 = 29 | 52 = 20170124-09: 47: 14 | = firm_trade_id_07 тысячу сорок-одна | 48 = XS0102233434 | 22 = 4 | 25004 = GBP | 470 = ZZ | 32 = 100 | 31 = 6.33 | 15 = GBP | 64 = 20170125 | 60 = 20170124-09: 47: 14 | 1430 = O | = 1 574 | 487 = 0 | 552 = 2 | 54 = 1 | 528 = Р | 29 = 4 | 581 = 3 | 453 = 1 | 448 = H7XNBB4851XX0REQ1F70 | 447 = Н | 452 = 1 | 54 = 2 | 453 = 1 | 448 = 549300F2CCROIO4RRZ97 | 447 = Н | 452 = 17 | 10 = 189 |


Код:

BufferedReader reader = new BufferedReader(new FileReader ("Message.txt")); 
String line = null; 
StringBuilder stringBuilder = new StringBuilder(); 
String ls = System.getProperty("line.separator"); 

while((line = reader.readLine()) != null) { 
    stringBuilder.append(line); 
    stringBuilder.append(ls); 
} 

String messageString = stringBuilder.toString(); 
messageString = messageString.replace('|','\u0001'); 
Message FIXOrder = new Message(messageString, new DataDictionary("DD.xml")); 

-Cheers MJ

+0

Что происходит с переупорядочиванием? Теги в повторяющейся группе должны быть в фиксированном порядке. – user1717259

+0

теги переставляются в возрастающем порядке, если не использовать DataDictionary. И при использовании DataDictionary с ошибкой выше. –

+1

Этот синтаксический разбор в порядке, указанном вами, так что я подозреваю, что проблема в вашем файле Message.txt. Не могли бы вы добавить System.out.println (messageString); так что мы действительно знаем, какая строка разбирается? Два других замечания: * то, как вы читаете файл, выглядит нечетным; в чем цель stringBuilder.append (ls); в вашей петле? * повторяющаяся группа 453 появляется дважды в сообщении FIX. Он должен появляться один раз: 453 = 2 | 448 = H7XNBB4851XX0REQ1F70 | 447 = N | 452 = 1 | 448 = 549300F2CCROIO4RRZ97 | 447 = N | 452 = 17 | –

ответ

1

У меня было то же самое исключение и удалось найти основную причину этого.

Скорее всего, это связано с тем, что строка сообщения FIX была загружена из файла и, возможно, имеет: или \r\n в конце строки.

Затем ... при разборе «прицепа» последние символы терпят неудачу из-за того, что = не найден.

Equal sign not found in field

попробовать: public static final String NEW_LINE = System.getProperty("line.separator");

  1. удалить все строки-сепаратор обеспечивает: String msgText= loadedText.replace(NEW_LINE, "");
  2. изменения разделитель SOH (если требуется) msgText = msgText.replace(';', '\001');
  3. Затем используйте QuickFix fromString: message.fromString(msgText, dataDictionary, false);