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。
我将概述两种方式:
在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
}
使用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
}
}
在与我们的经纪公司建立订单后,我们希望从 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。
我将概述两种方式:
在
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 }
使用
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 } }