14

来自 FIX 新手的非常基本的问题

查看http://www.quickfixengine.org上的文档并阅读 stackoverflow 上的帖子,我看到很多关于消息“破解”的讨论。我想我有点明白这个想法,但感觉我仍然不完全清楚。

有人可以大致解释一下这到底是什么(为什么有必要?这听起来像一个黑客),为什么它似乎只与收到的 FIX 消息有关,而在使用 Python 时根本不使用?

谢谢!

4

2 回答 2

35

在实践中,您需要知道的是:

你的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()是什么:

  1. 将您Message的转换为正确的子类(例如NewOrderSingleExecutionReport等)
  2. 调用您的用户定义的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()(有关更多信息,请参阅此问题)。

于 2012-11-14T03:57:39.260 回答
2

我将 quickfixj 用于 Java。破解使用和接口将破解的消息返回给接口实现。实现者将覆盖接口的方法,以便它可以单独处理每种消息类型。

消息破解者接受一条普通消息并将该消息作为特定类型的消息返回。这样做的好处是字典将限制消息的字段,以便更容易查找每个字段。

于 2012-11-13T21:42:13.453 回答