与我们的经纪公司开立订单后,我们希望从ExecutionReport
消息中获取成交价。您将在下面找到使用的回调代码。
正确接收MarketDataSnapshotFullRefresh
消息,但永远不会触发第二个if
块。奇怪的是,相应的消息.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.MessageCracker
完成,尽管有时在fromApp
中处理它们是要走的路。
您可以在此处阅读有关消息破解的更多信息:QuickFIX/J 用户手册 - 接收消息。
我将概述两种方式:
-
在
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
的类。添加具有两个参数的
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 } }
为什么你在错误的地方进行消息处理?如果您检查 Quickfix 的建议,您将看到他们建议在 onMessage
中进行消息处理(您可能尚未实现)。并且应该只存在一个消息破解程序 from App方法。
否则,您的fromApp方法将成为代码的大杂烩,下一个处理您的代码的人不会是一个快乐的灵魂。