ошибка при получении значения из marketdataincremental refresh - PullRequest
0 голосов
/ 01 апреля 2020

Я получил ошибку в моем приложении quickfixj. Сначала я получил такую ​​ошибку:

Out of order repeating group members

После этого я добавил этот текст в свой initiator.config:

ValidateUserDefinedFields=N
ValidateIncomingMessage=N

Но теперь я получил еще одну ошибку в своем приложении:

quickfix.FieldNotFound: Field was not found in message, field=55
        at quickfix.FieldMap.getField(FieldMap.java:223)
        at quickfix.FieldMap.getString(FieldMap.java:237)
        at com.dxtr.fastmatch.marketdatarequestapps.TestMarketdataRequest.fromApp(TestMarketdataRequest.java:38)
        at quickfix.Session.fromCallback(Session.java:1847)
        at quickfix.Session.verify(Session.java:1791)
        at quickfix.Session.verify(Session.java:1862)
        at quickfix.Session.next(Session.java:1047)
        at quickfix.Session.next(Session.java:1204)
        at quickfix.mina.SingleThreadedEventHandlingStrategy$SessionMessageEvent.processMessage(SingleThreadedEventHandlingStrategy.java:163)
        at quickfix.mina.SingleThreadedEventHandlingStrategy.block(SingleThreadedEventHandlingStrategy.java:113)
        at quickfix.mina.SingleThreadedEventHandlingStrategy.lambda$blockInThread$1(SingleThreadedEventHandlingStrategy.java:145)
        at quickfix.mina.SingleThreadedEventHandlingStrategy$ThreadAdapter$RunnableWrapper.run(SingleThreadedEventHandlingStrategy.java:267)
        at java.lang.Thread.run(Thread.java:748)

Мой код для получения значения символов:

public void fromApp(quickfix.Message message, SessionID sessionID)
            throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
         try {
                String symbol = message.getString(Symbol.FIELD);
                    System.out.println(" FromApp " + message);
                    message.getString(TransactTime.FIELD);
//                  String seqNo = message.getString(MsgSeqNum.FIELD);
                    double bid = message.getDouble(MDEntryPx.FIELD);
                    double ask = message.getDouble(MDEntryPx.FIELD);


//                  System.out.println(seqNo + " " + message);


            } catch (FieldNotFound fieldNotFound) {
                fieldNotFound.printStackTrace();
            }
        }

Я также использовал этот код

    public void onMessage (MarketDataIncrementalRefresh message, SessionID sessionID) throws FieldNotFound{
     try
       {
           MDReqID mdreqid = new MDReqID();
           SendingTime sendingtime = new SendingTime();
           NoMDEntries nomdentries = new NoMDEntries();
           quickfix.fix42.MarketDataIncrementalRefresh.NoMDEntries group
               = new quickfix.fix42.MarketDataIncrementalRefresh.NoMDEntries();
           MDUpdateAction mdupdateaction = new MDUpdateAction();
           DeleteReason deletereason = new DeleteReason();
           MDEntryType mdentrytype = new MDEntryType();
           MDEntryID mdentryid = new MDEntryID();
           Symbol symbol = new Symbol();
           MDEntryOriginator mdentryoriginator = new MDEntryOriginator();
           MDEntryPx mdentrypx = new MDEntryPx();
           Currency currency = new Currency();
           MDEntrySize mdentrysize = new MDEntrySize();
           ExpireDate expiredate = new ExpireDate();
           ExpireTime expiretime = new ExpireTime();
           NumberOfOrders numberoforders = new NumberOfOrders();
           MDEntryPositionNo mdentrypositionno = new MDEntryPositionNo();

           message.getField(nomdentries);
           message.getField(sendingtime);

           message.getGroup(1, group);

           int list = nomdentries.getValue();
           for (int i = 0; i < list; i++)
           {
               message.getGroup(i + 1, group);
               group.get(mdupdateaction);
               if (mdupdateaction.getValue() == '2')
                System.out.println("Enter");
               group.get(deletereason);
               group.get(mdentrytype);
               group.get(mdentryid);
               group.get(symbol);
               group.get(mdentryoriginator);
               if (mdupdateaction.getValue() == '0')
                   group.get(mdentrypx);
               group.get(currency);
               if (mdupdateaction.getValue() == '0')
                   group.get(mdentrysize);
           }

           System.out.printf("Got Symbol {0} Price {1}", 
       symbol.getValue(), mdentrypx.getValue());

}catch (Exception ex)
       {
    System.out.println("error" + ex);

}

, но я также получаю сообщение об ошибке, подобное этому

quickfix.FieldNotFound: Field was not found in message, field=55
        at quickfix.FieldMap.getField(FieldMap.java:223)
        at quickfix.FieldMap.getString(FieldMap.java:237)
        at com.dxtr.fastmatch.marketdatarequestapps.TestMarketdataRequest.fromApp(TestMarketdataRequest.java:39)
        at quickfix.Session.fromCallback(Session.java:1847)
        at quickfix.Session.verify(Session.java:1791)
        at quickfix.Session.verify(Session.java:1862)
        at quickfix.Session.next(Session.java:1047)
        at quickfix.Session.next(Session.java:1204)
        at quickfix.mina.SingleThreadedEventHandlingStrategy$SessionMessageEvent.processMessage(SingleThreadedEventHandlingStrategy.java:163)
        at quickfix.mina.SingleThreadedEventHandlingStrategy.block(SingleThreadedEventHandlingStrategy.java:113)
        at quickfix.mina.SingleThreadedEventHandlingStrategy.lambda$blockInpacket_write_wait: Connection to 3.13.235.241 port 22: Broken pipe

, и вот значение, которое я проверяю в своем message.log 8=FIX.4.2^A9=0217^A35=X^A34=7291^A49=Fastmatch1^A52=20200401-10:47:59.833^A56=MDValueTrade2UAT1^A262=VT_020^A268=02^A279=2^A55=GBP/CHF^A269=0^A278=1140851192^A270=1.19503^A271=02000000^A279=0^A55=GBP/CHF^A269=0^A278=1140851194^A270=1.19502^A271=06000000^A10=114^A мой брокер прислал мне цену и т. д. Мой вопрос: как решить эту проблему из этого код?

1 Ответ

1 голос
/ 01 апреля 2020

Во-первых, я получил такую ​​ошибку:

Out of order repeating group members

Ваш словарь данных не соответствует контрагенту. Исправьте это, и это будет go прочь.

После этого я добавил этот текст в свой initiator.config:

ValidateUserDefinedFields=N
ValidateIncomingMessage=N

Это ничего не исправило - оно скрывает вашу реальную проблему и заставляет вас искать новую фальшивую проблему.

Что вам нужно сделать:

Ваша конфигурация имеет это , верно?

UseDataDictionary=Y
DataDictionary=path/to/FIXnn.xml
# or if FIX5:
AppDataDictionary=path/to/FIX5n.xml
TransportDataDictionary=path/to/FIXT.xml

Найдите документацию вашего контрагента и убедитесь, что сообщения и поля вашего файла xml соответствуют тому, что, как они говорят, они собираются вам отправить. Убедитесь, что все повторяющиеся группы имеют одинаковые поля в одинаковом порядке .

Вот некоторая документация о том, как структурирован файл словаря данных xml. Это довольно просто.

...