QuickFix资料收集

来源:互联网 发布:linux下查看文件大小 编辑:程序博客网 时间:2024/06/06 00:41

项目地址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


原创粉丝点击