【问题标题】:QuickFIX/J: Not receiving ExecutionReport messagesQuickFIX/J:未收到 ExecutionReport 消息
【发布时间】:2016-03-04 17:47:36
【问题描述】:

在与我们的经纪公司开立订单后,我们希望从ExecutionReport 消息中获取执行价格。您将在下面找到使用的回调代码。

MarketDataSnapshotFullRefresh 消息被正确接收,但第二个if 块从未被触发。奇怪的是,对应的messages.log文件确实包含多条35=8消息。

我们使用 QuickFIX/J 作为 FIX 引擎。

@Override
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
    if (message instanceof MarketDataSnapshotFullRefresh) {
        // do stuff with MarketDataSnapshotFullRefresh
    }

    if(message instanceof ExecutionReport) {
        // do stuff with ExecutionReport
    }

【问题讨论】:

    标签: fix-protocol quickfixj


    【解决方案1】:

    消息处理最好由quickfix.MessageCracker 完成,尽管有时在fromApp 中处理它们是可行的方法。

    您可以在此处阅读有关消息破解的更多信息:QuickFIX/J User Manual - Receiving Messages

    我将概述两种方式:


    1. fromApp

      fromApp 中的消息不是 QuickFIX/J 库中定义的特定消息类型,而是quickfix.Message 类型。如果您想以现在的方式处理它们(来自fromApp),则必须手动检查MsgType

      MsgType msgType = (MsgType) message.getHeader( ).getField( new MsgType( ) );
      

      根据检索到的类型,您将调用特定消息类型的处理程序方法:

      if( msgType.valueEquals( MsgType.MARKET_DATA_SNAPSHOT_FULL_REFRESH ) )
          handleMarketDataSnapshotFullRefresh( message, sessionID );
      else if ...
      
      ...
      
      private void handleMarketDataSnapshotFullRefresh( quickfix.Message msg, SessionID sessionID ) {
          // handler implementation
      }
      

    1. 使用MessageCracker

      如前所述处理传入消息的另一种方法是通过MessageCracker。你会例如用quickfix.MessageCracker 扩展实现quickfix.Application 的类。

      添加一个带有两个参数的onMessage 方法,第一个是消息类型,第二个是SessionID。从fromApp 方法调用crack,该方法将路由到相应的处理程序。

      import quickfix.*;
      
      public class MyApplication extends MessageCracker implements Application
      {
          public void fromApp(Message message, SessionID sessionID)
                throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
                crack(message, sessionID);
          }
      
          @Handler
          public void onMessage(quickfix.fix44.MarketDataSnapshotFullRefresh mdsfr, SessionID sessionID) {
               // handler implementation
          }
      }
      

    【讨论】:

      【解决方案2】:

      为什么你在错误的地方进行消息处理?如果您查看 Quickfix 推荐的内容,您会看到他们建议在 onMessage 中进行消息处理(您可能尚未实现)。而且fromApp方法中应该只存在一个消息破解器。

      否则,您的 fromApp 方法将成为一大堆代码,而下一个处理您的代码的人将不会是一个快乐的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2022-10-19
        相关资源
        最近更新 更多