关于QuickFIX消息破解的问题

时间:2012-11-13 21:18:25

标签: c++ quickfix

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

查看http://www.quickfixengine.org上的文档并阅读stackoverflow上的帖子,我看到很多关于消息'破解'的讨论。我想我有点想法,但觉得我还不完全清楚。

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

谢谢!

2 个答案:

答案 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()做的是:

  1. 将您的Message转换为正确的子类(例如NewOrderSingleExecutionReport等)
  2. 如果已定义,则调用用户定义的onMessage(subtype)回调。如果未定义,则会引发UnsupportedMessageType异常,您的应用会自动向对方发送BusinessMessageReject(35 = j)。
  3. 那么,你想处理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。破解使用和接口将破解的消息返回到接口实现。实现者将覆盖接口的方法,以便它可以单独处理每种消息类型。

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