почему поля FIX, использующие quickfix, пусты?

Я новичок в ФИКС. У меня есть сообщение FIX:

8=FIX.4.4|9=122|35=D|34=215|49=CLIENT12|52=20100225-19:41:57.316|56=B|1=Marcel|11=13346|21=1|40=2|44=5|54=1|59=0|60=20100225-19:39:52.020|10=072|

и я использую quickfixJ. Вот мой код класса:

    public String getYear(Message aMessage, SessionID aSessionID){
        try {
            crack(aMessage, aSessionID);
        } catch (Exception e) {
           e.printStackTrace();
        }

        String year = String.valueOf(mUTCCal.get(Calendar.YEAR));
        String begin = String.valueOf(BeginString);
        return year + " " + begin;
    }

и когда я вызываю этот метод, я получаю ноль 2012 года, я пробовал всевозможные методы для разных полей и получаю ноль. Я не понимаю, почему я не получаю значение null для даты и как мне заставить его правильно интерпретировать другие поля?

    quickfix.fix44.NewOrderSingle message;
    message = new quickfix.fix44.NewOrderSingle();
    SessionID session = new SessionID("beginString", "senderCompID", "targetCompID");
    MyApp app = new MyApp("", "", "");
    String result = app.myMessage(message, session);
    System.out.println(result);

Я не понимаю, куда вводить строку, которая у меня есть (вверху), в сообщение

    public void onMessage(Message message, SessionID sessionID) throws FieldNotFound {
        Header header = message.getHeader();
        String FIX = header.getString(8);

        System.out.println(FIX);
    }

    public void onMessage(quickfix.fix44.NewOrderSingle message, SessionID sessionID) throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
    Header header = message.getHeader();
    String FIX = header.getString(8);
            String a = message.getString(1);

            System.out.println(a);
            System.out.println(FIX);}

person jon    schedule 13.11.2012    source источник


Ответы (1)


Для корректного получения и разбора FIX-сообщений через QuickFIX необходимо:

  • Создайте свое приложение: http://www.quickfixengine.org/quickfix/doc/html/application.html
  • Реализовать метод FromApp (сообщение сообщения, SessionID sessionID)
  • Внедрите взломанный метод для ВСЕХ типов сообщений, которые вы получите от контрагента.

Метод FromApp может быть очень простым:

public void fromApp(Message message, SessionID sessionID)
{
  crack(message, sessionID);
}

Теперь в вашем примере у вас есть сообщение FIX 4.4 типа 35=D [NewOrderSingle]

Следовательно, вы ДОЛЖНЫ реализовать метод следующим образом:

    public override void onMessage(QuickFix44.NewOrderSingle message, SessionID session)
    {
        base.onMessage(message, session);
    }

Теперь в вашем методе вы можете легко работать со всеми нужными вам полями:

    public override void onMessage(QuickFix44.NewOrderSingle message, SessionID session)
    {
        base.onMessage(message, session);

        ClOrdID ordid = new ClOrdID();
        message.get(ordid);
    }

Также загляните сюда: http://www.quickfixengine.org/quickfix/doc/html/receive_messages.html

person stexcec    schedule 13.11.2012
comment
Большое тебе спасибо! Ваш ответ очень помог. Это сработало. Я прочитал страницу получения сообщений и теперь понимаю версию FIX и тип сообщения. Спасибо. У вас есть простой пример кода в main, который будет печатать ordid? - person jon; 13.11.2012
comment
Получив ordid в методе onMessage, вы можете сохранить его в переменной класса или использовать в том же методе. - person stexcec; 13.11.2012
comment
Я не понимаю метод переопределения. Является ли сообщение quickfix.fix44.NewOrderSingle тем же сообщением, что и в методе fromApp? Я смотрю здесь quickfixj.org/quickfixj/usermanual/1.5. 1/использование/ . Объекты quickfix.fix44.NewOrdersingle не принимают никаких входных данных, так как мне создать этот объект с моей строкой в ​​качестве входных данных? Есть ли документация по этому методу проверки? Единственное, что я видел, это то, что любая функция, которую вы не перегружаете, по умолчанию выдает исключение UnsupportedMessageType. - person jon; 13.11.2012
comment
onMessage() предназначен для обработки полученных сообщений, а не отправленных сообщений. Метод Crack() в fromApp() возьмет исходное сообщение, приведет его к правильному типу и вызовет соответствующее переопределение onMessage(); если нет подходящего переопределения, то выдается исключение. Если вы хотите создать и отправить NewOrderSingle, см. эти документы. - person Grant Birchmeier; 14.11.2012
comment
По какой-то причине мой обработчик onMessage (сообщение quickfix.fix44.NewOrderSingle, сеанс SessionID) пропускается. Я не получаю никаких ошибок. Приложение распознает его как обработчик, но когда я запускаю его после того, как он запускает кряк (сообщение, сеанс), оно завершается и не переходит к обработчику. Вы знаете, что может быть причиной? Я также пытался реализовать с помощью @Handler, но это не помогло. - person jon; 22.11.2012
comment
@jon: Это очень странно. Вы написали, что успешно внедрили кряк 13 ноября. что вы изменили? ПОЖАЛУЙСТА, попробуйте реализовать другой обработчик для другого сообщения FIX и дайте мне знать. - person stexcec; 22.11.2012
comment
Я никогда не реализовывал обработчик для получения сообщений, используя сообщение QuickFix44.NewOrderSingle в качестве входного аргумента, только сообщение Message. Я разместил свой код вверху. Первый метод onMessage работает, второй нет, вроде бы пропускается. Я пробовал также с сообщениями Fix 4.2 и не добился успеха. - person jon; 23.11.2012
comment
Я получаю эту ошибку при попытке message.getField(1); в onMessage( Сообщение сообщения... Метод getField(int) из типа FieldMap не виден - person jon; 23.11.2012
comment
Привет @jon: вы должны реализовать обработчик для каждого типа сообщений, которые вы хотите использовать. Пожалуйста, попробуйте реализовать обработчик для определенного типа сообщений. Когда обработчик срабатывает, у вас есть правильное FIX-сообщение, и вы можете начать с ним работать. ИЗБЕГАЙТЕ использовать метод getField(), вместо этого используйте предложенный метод, который вы можете найти в документации. - person stexcec; 27.11.2012
comment
Привет @stexcec: я хотел бы реализовать обработчик для определенного типа сообщения и версии FIX, но мои обработчики не вызываются методом отражения взлома. Никаких действий не предпринимается. Кроме того, в документации quickfix предлагается создать объект типа Account account = new Account(); сообщение.получить(аккаунт); можете ли вы позвонить toString(message.get(account)); ? - person jon; 06.12.2012