来自 FIX 新手的非常基本的问题
查看文档 http://www.quickfixengine.org并在 stackoverflow 上阅读此处的帖子,我看到很多关于消息“破解”的讨论。我想我有点明白了,但我觉得我还是不完全清楚。
有人可以大致解释一下这到底是什么(为什么有必要?这听起来像是 hack),为什么它似乎只与接收到的 FIX 消息有关,而在使用 Python 时根本不使用?
谢谢!
最佳答案
在实践中,您需要知道的是:
您的 fromApp()
回调获取一个 Message
对象。该消息实际上是 NewOrderSingle 或 ExecutionReport 之类的。 QF 不是让您弄明白,而是让您从 MessageCracker
继承。要使用它,请在您的 fromApp()
中调用 crack()
,如下所示:
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 不处理 session 级(也称为“管理员”)消息。如果您想为登录或心跳消息等添加自定义处理,则必须在 fromAdmin()
中明确执行(有关详细信息,请参阅 this question)。
关于c++ - 关于QuickFIX报文破解的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368975/