QuickFIX/J: 未收到 ExecutionReport 消息

QuickFIX/J: Not receiving ExecutionReport messages

在与我们的经纪公司建立订单后,我们希望从 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
    }

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

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

消息处理最好由 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 的 class

    添加一个带有两个参数的 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
        }
    }