来自 FIX 新手的非常基本的问题
查看http://www.quickfixengine.org上的文档并阅读 stackoverflow 上的帖子,我看到很多关于消息“破解”的讨论。我想我有点明白这个想法,但感觉我仍然不完全清楚。
有人可以大致解释一下这到底是什么(为什么有必要?这听起来像一个黑客),为什么它似乎只与收到的 FIX 消息有关,而在使用 Python 时根本不使用?
谢谢!
来自 FIX 新手的非常基本的问题
查看http://www.quickfixengine.org上的文档并阅读 stackoverflow 上的帖子,我看到很多关于消息“破解”的讨论。我想我有点明白这个想法,但感觉我仍然不完全清楚。
有人可以大致解释一下这到底是什么(为什么有必要?这听起来像一个黑客),为什么它似乎只与收到的 FIX 消息有关,而在使用 Python 时根本不使用?
谢谢!
在实践中,您需要知道的是:
你的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()
没有正文的调用。)
这是否清楚一点?也许现在QF 文档中的这个页面可能会更容易阅读——底部部分讨论了 MessageCracker。
注意: MessageCracker 不处理会话级(又名“管理员”)消息。如果您想为登录或心跳消息添加自定义处理,则必须在其中明确执行fromAdmin()
(有关更多信息,请参阅此问题)。
我将 quickfixj 用于 Java。破解使用和接口将破解的消息返回给接口实现。实现者将覆盖接口的方法,以便它可以单独处理每种消息类型。
消息破解者接受一条普通消息并将该消息作为特定类型的消息返回。这样做的好处是字典将限制消息的字段,以便更容易查找每个字段。