来自FIX新手的非常基本的问题
查看http://www.quickfixengine.org上的文档并阅读stackoverflow上的帖子,我看到很多关于消息'破解'的讨论。我想我有点想法,但觉得我还不完全清楚。
有些人可以解释一下这究竟是什么(为什么它是必要的?听起来像是一个黑客),为什么它似乎只与收到的FIX消息有关,并且在使用Python时根本不使用?
谢谢!
答案 0 :(得分:26)
在实践中,您需要知道的是:
您的fromApp()
回调获得Message
个对象。该消息实际上是NewOrderSingle或ExecutionReport或其他东西。 QF不是让你弄明白,而是让你继承MessageCracker
。要使用它,请拨打crack()
中的fromApp()
,如下所示:
void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
{
crack(message, sessionID);
}
crack()
做的是:
Message
转换为正确的子类(例如NewOrderSingle
,ExecutionReport
等)onMessage(subtype)
回调。如果未定义,则会引发UnsupportedMessageType
异常,您的应用会自动向对方发送BusinessMessageReject(35 = j)。那么,你想处理NewOrderSingle消息吗?好的,只需定义一个onMessage(NewOrderSingle)
回调。
void onMessage( const FIX42::NewOrderSingle& message, const FIX::SessionID& )
{
// Do whatever you want with your NewOrderSingle message's content.
// Note that this message and the one passed to crack() are the same, content-wise.
}
您想处理ExecutionReports吗?定义onMessage(ExecutionReport)
。等等。
但是不想要处理的那些消息类型呢?如果你必须添加处理程序来拒绝所有其他消息类型,那会很糟糕,但幸运的是,你不必这样做。正如我之前所说,如果你没有定义onMessage()
,QF会拒绝你。 (如果您想要吞下特定的消息类型并忽略它而不被拒绝,那么只需定义一个没有正文的onMessage()
调用。)
这有点清楚吗?也许现在this page in the QF docs可能会更容易阅读 - 底部会谈到MessageCracker。
注意: MessageCracker不处理会话级(也称为“admin”)消息。如果您想为Logon或Heartbeat消息添加自定义处理,则必须在fromAdmin()
中明确地执行此操作(有关详情,请参阅this question)。
答案 1 :(得分:2)
我使用quickfixj for Java。破解使用和接口将破解的消息返回到接口实现。实现者将覆盖接口的方法,以便它可以单独处理每种消息类型。
消息破解者接收一条简单消息并将消息作为特定类型的消息返回。这样做的好处是字典将限制消息的字段,以便更容易查找每个字段。