QuickFix资料收集

项目地址http://www.quickfixengine.org/


开源库,支持所有Fix协议。

1.开始:

1.1接受消息:

大多数我们关系的消息都会到达我们重载的fromApp函数中。你可以从具有不同类型(type)安全度的消息中得到field。这里的type指的是Fix消息的type。当程序传给你一个Message类,C++ type checker不知道它是神马特定的Fix消息,你必须动态决定。然而,这里有个办法使C++知道类型信息。首先,我们会介绍如何从消息中动态查询fields,然后我们将展示更好的类型安全方式。记住:所有消息都有头header和尾trailer。如果你想在里面看他们的fields,你必须首先调用getHeader() or getTrailer()来获取他们。否则没戏。

1.2最弱类型安全:

这种收集数据的方法被强烈建议不去使用,而且只在为一些其他语言或者中间件写底层接口时有用。

这里有一些收集数据的代码片段:

    void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
      throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
    {
      // retreive value into string with integer field ID
      std::string value;
      value = message.getField(44);

      // retrieve value into a field base with integer field ID
      FIX::FieldBase field(44, "");
      message.getField(field);

      // retreive value with an enumeration, a little better
      message.getField(FIX::FIELD::Price);
    }


1.3 高类型安全:

一种增加一些类型安全的方法是用一个field类来表示所有的Fix定义Fields。这在程序中有时有用,但只在无版本依赖的代码片段中有用。比如,我们的session类在这用的最多。在多数程序中不推荐用它。这也将得到一些field,不只是string。

    void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
      throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
    {
      // retreive value into field class
      FIX::Price price;
      message.getField(price);

      // another field...
      FIX::ClOrdID clOrdID;
      message.getField(clOrdID);
    }

1.4 最高安全(这样做)

QuickFIX有用来收集协议定义的所有消息的消息类。他们就如同field类,由Fix协议直接产生。利用这种优势,你必须用提供的MessageCracker来分解出消息。而且我们不在用泛型消息类,现在我们用using来代替getField。记住:你仍能像这些类从消息导出数据一样用getField来导出数据。

    void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
      throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
    {
      crack(message, sessionID);
    }

    void onMessage( const FIX42::NewOrderSingle& message, const FIX::SessionID& )
    {
      FIX::ClOrdID clOrdID;
      message.get(clOrdID);

      FIX::ClearingAccount clearingAccount;
      message.get(clearingAccount);
    }

    void onMessage( const FIX41::NewOrderSingle& message, const FIX::SessionID& )
    {
      FIX::ClOrdID clOrdID;
      message.get(clOrdID);

      // compile time error!! field not defined in FIX41
      FIX::ClearingAccount clearingAccount;
      message.get(clearingAccount);
    }

    void onMessage( const FIX42::OrderCancelRequest& message, const FIX::SessionID& )
    {
      FIX::ClOrdID clOrdID;
      message.get(clOrdID);

      // compile time error!! field not defined for OrderCancelRequest
      FIX::Price price;
      message.get(price);
    }

你必须用MessageCracker作为maxin来用上面的方法。它将为你提供crack函数,允许你重载这个消息函数。任何你没有重载的函数将会利用default ,而且遇到未定义类型会抛出异常。

你可以这样定义你的程序:

    #include "quickfix/Application.h"
    #include "quickfix/MessageCracker.h"

    class MyApplication
    : public FIX::Application,
      public FIX::MessageCracker


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值