c++ - 关于QuickFIX报文破解的问题

标签 c++ quickfix

来自 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() 的作用是这样的:

  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() 调用。)

这是否澄清了一点?也许现在this page in the QF docs可能读起来更容易一些——底部部分讨论了 MessageCracker。

注意: MessageCracker 不处理 session 级(也称为“管理员”)消息。如果您想为登录或心跳消息等添加自定义处理,则必须在 fromAdmin() 中明确执行(有关详细信息,请参阅 this question)。

关于c++ - 关于QuickFIX报文破解的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368975/

相关文章:

c++ - 以没有尾随零的科学计数法打印 cpp_dec_float

c - Quickfix 不重播我的消息

c++ - QuickFIX C++ 库 - 关于 ThreadedSocketInitiator 的一般问题

c++ - decltype(auto) 类型推导 : return x vs. return (x)

c++ - 有没有一种 C++ 方法可以用任何类型的数据写入文件?

java - QuickFIXJ MBeanServerIncationHandler.newProxyInstance 参数类型错误

java - 具有不同修复版本的 Quickfix 重复代码

java - fastfix.Message 无法转换为quickfix.fix50sp2.Message

c++ - 如何防止递归函数中不必要的内存使用

c++ - 不使用数组进行计算