08
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
LATEST ENTRY
CATEGORY
ARCHIVE
PROFILE
SEARCH
RECENT COMMENT
  • 【情報】Excel で スクレイピング 【ぶっこ抜き】
    縫部尚登 (06/17)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/05)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    まこ (05/05)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/03)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    まこ (05/03)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/03)
  • エクセルファイルのパスワードを忘れたら・・・
    里奈 (09/09)
MOBILE
qrcode
OTHERS
<< 【QUICKFIX】 FX自動売買への道 14 【独自テーブルへのINSERT&SELECT】 | top | 【QUICKFIX】 FX自動売買への道 16 【通信系の試験(正常系)】 >>
スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |
【QUICKFIX】 FX自動売買への道 15 【受信メッセージをとりあえず受ける口を作る】

プログラムに組み込んでいないパターンのメッセージを受信すると
こちらから < j > Business Message Reject とかを送っちゃったりするので、
今後受信する可能性のあるメッセージをとりあえず受け取るようにしときます。
 
※追記:Applicationメッセージではなく Adminメッセージについても追加しちゃってました。。
 これ、いらないし紛らわしいので紫色で消しときます。。


プログラムに組み込む予定のあるメッセージから
こちらからしか送信しないタイプのもの(受信しない予定のもの)と
こちらからは明示的に送信処理を行わない受信のみのタイプのものを分けてみます。

明示的に送信するメッセージ
    < 1 > Test Request
    < q > Order Mass Cancel Request
    < x > Security List Request
    < D > New Order Single
    < F > Order Cancel Request
    < G > Order Cancel/Replace Request
    < H > Order Status Request
    < V > Market Data Request
    < AF > Order Mass Status Request
    < AN > Request For Positions


受信するメッセージ(明示的に送信しない)
    < 2 > Resend Request
    < 3 > Reject
    < 4 > Sequence Reset

    < 8 > Execution Report
    < 9 > Order Cancel Reject
    < h > Trading Session Status
    < j > Business Message Reject
    < r > Order Mass Cancel Report
    < y > Security List
    < C > Email
    < N > List Status
    < X > Market Data - Incremental Refresh
    < Y > Market Data Request Reject
    < AO > Request for Positions Ack
    < AP > Position Report
    < AZ > Collateral Response
    < BA > Collateral Report
    < CG > Party Details List Report
    < PU > Order Rate Update


いっぱいですね。。
作りきれるかな。。。


■とにかくヘッダーを全部取り込んでおく
今後対応する毎にヘッダーを取り込んでもよいけど。。
まぁ全部Application.hに取り込んどきます。
対象のヘッダーファイルはこんな感じで探したり
        fix44]# for i in ¥
        > 1  ¥
        > q  ¥
        > x  ¥
        > D  ¥
        > F  ¥
        > G  ¥
        > H  ¥
        > V  ¥
        > AF  ¥
        > AN  ¥
        >   2  ¥
        >   3  ¥
        >   4  ¥
        >   8  ¥
        >   9  ¥
        >   h  ¥
        >   j  ¥
        >   r  ¥
        >   y  ¥
        >   C  ¥
        >   N  ¥
        >   X  ¥
        >   Y  ¥
        >   AO  ¥
        >   AP  ¥
        >   AZ  ¥
        >   BA  ¥
        >   CG  ¥
        >   PU  ¥

        >
        > do
        > grep ¥"${i}¥"¥)  *.h
        > done
        TestRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("1"); }
        OrderMassCancelRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("q"); }
        SecurityListRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("x"); }
        NewOrderSingle.h:    static FIX::MsgType MsgType() { return FIX::MsgType("D"); }
        OrderCancelRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("F"); }
        OrderCancelReplaceRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("G"); }
        OrderStatusRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("H"); }
        MarketDataRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("V"); }
        OrderMassStatusRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("AF"); }
        RequestForPositions.h:    static FIX::MsgType MsgType() { return FIX::MsgType("AN"); }
        ResendRequest.h:    static FIX::MsgType MsgType() { return FIX::MsgType("2"); }
        Reject.h:    static FIX::MsgType MsgType() { return FIX::MsgType("3"); }
        SequenceReset.h:    static FIX::MsgType MsgType() { return FIX::MsgType("4"); }

        ExecutionReport.h:    static FIX::MsgType MsgType() { return FIX::MsgType("8"); }
        OrderCancelReject.h:    static FIX::MsgType MsgType() { return FIX::MsgType("9"); }
        TradingSessionStatus.h:    static FIX::MsgType MsgType() { return FIX::MsgType("h"); }
        BusinessMessageReject.h:    static FIX::MsgType MsgType() { return FIX::MsgType("j"); }
        OrderMassCancelReport.h:    static FIX::MsgType MsgType() { return FIX::MsgType("r"); }
        SecurityList.h:    static FIX::MsgType MsgType() { return FIX::MsgType("y"); }
        Email.h:    static FIX::MsgType MsgType() { return FIX::MsgType("C"); }
        ListStatus.h:    static FIX::MsgType MsgType() { return FIX::MsgType("N"); }
        MarketDataIncrementalRefresh.h:    static FIX::MsgType MsgType() { return FIX::MsgType("X"); }
        MarketDataRequestReject.h:    static FIX::MsgType MsgType() { return FIX::MsgType("Y"); }
        RequestForPositionsAck.h:    static FIX::MsgType MsgType() { return FIX::MsgType("AO"); }
        PositionReport.h:    static FIX::MsgType MsgType() { return FIX::MsgType("AP"); }
        CollateralResponse.h:    static FIX::MsgType MsgType() { return FIX::MsgType("AZ"); }
        CollateralReport.h:    static FIX::MsgType MsgType() { return FIX::MsgType("BA"); }



どうやら、 < CG > Party Details List Report と < PU > Order Rate Update は標準ではないようですね。。
とりあえずは無視で。。
必要になった時に作りましょう。


■ヘッダーファイルに追記(Application.h)
メッセージのヘッダー追加と、送信用関数宣言、受信用関数宣言しときます。
tradeclient]# vi Application.h
ーーーーー全文ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
        #ifndef TRADECLIENT_APPLICATION_H
        #define TRADECLIENT_APPLICATION_H

        #include "quickfix/Application.h"
        #include "quickfix/MessageCracker.h"
        #include "quickfix/MySQLConnection.h"
        #include "quickfix/MySQLStore.h"
        #include "quickfix/Values.h"
        #include "quickfix/Mutex.h"

        #include "quickfix/fix44/TestRequest.h"                     // < 1 >
        #include "quickfix/fix44/OrderMassCancelRequest.h"          // < q >
        #include "quickfix/fix44/SecurityListRequest.h"             // < x >
        #include "quickfix/fix44/NewOrderSingle.h"                  // < D >
        #include "quickfix/fix44/OrderCancelRequest.h"              // < F >
        #include "quickfix/fix44/OrderCancelReplaceRequest.h"       // < G >
        #include "quickfix/fix44/OrderStatusRequest.h"              // < H >
        #include "quickfix/fix44/MarketDataRequest.h"               // < V >
        #include "quickfix/fix44/OrderMassStatusRequest.h"          // < AF >
        #include "quickfix/fix44/RequestForPositions.h"             // < AN >


        #include "quickfix/fix44/ResendRequest.h"                   // < 2 >
        #include "quickfix/fix44/Reject.h"                          // < 3 >
        #include "quickfix/fix44/SequenceReset.h"                   // < 4 >

        #include "quickfix/fix44/ExecutionReport.h"                 // < 8 >
        #include "quickfix/fix44/OrderCancelReject.h"               // < 9 >
        #include "quickfix/fix44/TradingSessionStatus.h"            // < h >
        #include "quickfix/fix44/BusinessMessageReject.h"           // < j >
        #include "quickfix/fix44/OrderMassCancelReport.h"           // < r >
        #include "quickfix/fix44/SecurityList.h"                    // < y >
        #include "quickfix/fix44/Email.h"                           // < C >
        #include "quickfix/fix44/ListStatus.h"                      // < N >
        #include "quickfix/fix44/MarketDataIncrementalRefresh.h"    // < X >
        #include "quickfix/fix44/MarketDataRequestReject.h"         // < Y >
        #include "quickfix/fix44/RequestForPositionsAck.h"          // < AO >
        #include "quickfix/fix44/PositionReport.h"                  // < AP >
        #include "quickfix/fix44/CollateralResponse.h"              // < AZ >
        #include "quickfix/fix44/CollateralReport.h"                // < BA >
                                                                    // CG
                                                                    // PU


        #include <queue>
        #include <syslog.h>

        const char SessionTypeTrade[] = "Trade";
        const char SessionTypeRatefeed[] = "Ratefeed";

        class Application :
              public FIX::Application,
              public FIX::MessageCracker
        {
        public:
          Application( const FIX::SessionSettings& settings )
          : m_settings( settings )
          { openlog("QuickFIX", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
            MySQLConnect();
          }

          ~Application()
          { if (m_sql) delete m_sql; }

          void run();

        private:
          FIX::SessionSettings m_settings;
          FIX::MySQLConnection *m_sql;

          void onCreate( const FIX::SessionID& ) {}
          void onLogon( const FIX::SessionID& sessionID );
          void onLogout( const FIX::SessionID& sessionID );
          void toAdmin( FIX::Message&, const FIX::SessionID& );
          void toApp( FIX::Message&, const FIX::SessionID& )
          throw( FIX::DoNotSend );
          void fromAdmin( const FIX::Message&, const FIX::SessionID& )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::RejectLogon ) {}
          void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType );

          /* 2  */ void onMessage( const FIX44::ResendRequest&,                const FIX::SessionID& );
          /* 3  */ void onMessage( const FIX44::Reject&,                       const FIX::SessionID& );
          /* 4  */ void onMessage( const FIX44::SequenceReset&,                const FIX::SessionID& );

          /* 8  */ void onMessage( const FIX44::ExecutionReport&,              const FIX::SessionID& );
          /* 9  */ void onMessage( const FIX44::OrderCancelReject&,            const FIX::SessionID& );
          /* h  */ void onMessage( const FIX44::TradingSessionStatus&,         const FIX::SessionID& );
          /* j  */ void onMessage( const FIX44::BusinessMessageReject&,        const FIX::SessionID& );
          /* r  */ void onMessage( const FIX44::OrderMassCancelReport&,        const FIX::SessionID& );
          /* y  */ void onMessage( const FIX44::SecurityList&,                 const FIX::SessionID& );
          /* C  */ void onMessage( const FIX44::Email&,                        const FIX::SessionID& );
          /* N  */ void onMessage( const FIX44::ListStatus&,                   const FIX::SessionID& );
          /* X  */ void onMessage( const FIX44::MarketDataIncrementalRefresh&, const FIX::SessionID& );
          /* Y  */ void onMessage( const FIX44::MarketDataRequestReject&,      const FIX::SessionID& );
          /* AO */ void onMessage( const FIX44::RequestForPositionsAck&,       const FIX::SessionID& );
          /* AP */ void onMessage( const FIX44::PositionReport&,               const FIX::SessionID& );
          /* AZ */ void onMessage( const FIX44::CollateralResponse&,           const FIX::SessionID& );
          /* BA */ void onMessage( const FIX44::CollateralReport&,             const FIX::SessionID& );
          // CG
          // PU


          /* 1  */ void TestRequest(const char* );
                   void InsertTestRequest( const FIX::Message& );
          /* q  */ void OrderMassCancelRequest();
          /* x  */ void SecurityListRequest();
          /* D  */ void NewOrderSingle();
          /* F  */ void OrderCancelRequest();
          /* G  */ void OrderCancelReplaceRequest();
          /* H  */ void OrderStatusRequest();
          /* V  */ void MarketDataRequest();
          /* AF */ void OrderMassStatusRequest();
          /* AN */ void RequestForPositions();


          std::string YmdHMSs();
          void SetMessageHeader( FIX::Message&, const char* );
          void MySQLConnect();
          FIX::MySQLQuery MySQLExec( const std::string& );
        };

        #endif

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
青字:送信メッセージ用
赤字:受信メッセージ用


■とりあえずのプログラムソースを生成
送信用はこんな感じでメッセージ名部分を変更してどんどん生成
−−−−
tradeclient]# vi OrderMassCancelRequest.cpp
        #include "config.h"
        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>


        /* < q > */
        void Application::OrderMassCancelRequest()
        {
          FIX44::OrderMassCancelRequest msg;

          SetMessageHeader( msg, SessionTypeTrade );
          FIX::Session::sendToTarget( msg );
        }

−−−−


受信用はこんな感じで同じくメッセージ名部分を変更してどんどん生成
ーーーー
tradeclient]# vi ResendRequest.cpp
        #include "config.h"
        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

        /* < 2 > */
        void Application::onMessage( const FIX44::ResendRequest& message, const FIX::SessionID& sessionID )
        {
          const FIX::Dictionary& dic = m_settings.get( sessionID );
          if (dic.has("Debug_2_ResendRequest"))
            std::cout << message.toXML() << std::endl;
        }

ーーーー


■Makefile の生成
Makefile.am に作ったソースファイル名を追記して、Makefile を生成する
tradeclient]# vi Makefile.am
ーー全文ーーーーーーーーーーーーーーーーーーーーーーーーーーー
        noinst_PROGRAMS = tradeclient

        tradeclient_SOURCES = ¥
                tradeclient.cpp ¥
                TestRequest.cpp                ¥
                OrderMassCancelRequest.cpp     ¥
                SecurityListRequest.cpp        ¥
                NewOrderSingle.cpp             ¥
                OrderCancelRequest.cpp         ¥
                OrderCancelReplaceRequest.cpp  ¥
                OrderStatusRequest.cpp         ¥
                MarketDataRequest.cpp          ¥
                OrderMassStatusRequest.cpp     ¥
                RequestForPositions.cpp        ¥

                  ResendRequest.cpp                ¥
                  Reject.cpp                       ¥
                  SequenceReset.cpp                ¥

                  ExecutionReport.cpp              ¥
                  OrderCancelReject.cpp            ¥
                  TradingSessionStatus.cpp         ¥
                  BusinessMessageReject.cpp        ¥
                  OrderMassCancelReport.cpp        ¥
                  SecurityList.cpp                 ¥
                  Email.cpp                        ¥
                  ListStatus.cpp                   ¥
                  MarketDataIncrementalRefresh.cpp ¥
                  MarketDataRequestReject.cpp      ¥
                  RequestForPositionsAck.cpp       ¥
                  PositionReport.cpp               ¥
                  CollateralResponse.cpp           ¥
                  CollateralReport.cpp             ¥

                Application.h  ¥
                Application.cpp

        tradeclient_LDADD = $(top_builddir)/src/C++/libquickfix.la

        INCLUDES = -I$(top_builddir)/include -I..

        all-local:
                rm -f ../../bin/tradeclient
                ln -s ../examples/tradeclient/tradeclient ../../bin/tradeclient

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

tradeclient]# cd ../../
quickfix]# ./bootstrap
quickfix]# ./configure --with-mysql
quickfix]# cd ./examples/tradeclient
tradeclient]# vi Makefile
ーー抜粋ーーーーーーーーーーーーーーーーーーーーーーーーーーー
    am_tradeclient_OBJECTS = tradeclient.$(OBJEXT) TestRequest.$(OBJEXT) ¥
            OrderMassCancelRequest.$(OBJEXT) SecurityListRequest.$(OBJEXT) ¥
            NewOrderSingle.$(OBJEXT) OrderCancelRequest.$(OBJEXT) ¥
            OrderCancelReplaceRequest.$(OBJEXT) ¥
            OrderStatusRequest.$(OBJEXT) MarketDataRequest.$(OBJEXT) ¥
            OrderMassStatusRequest.$(OBJEXT) RequestForPositions.$(OBJEXT) ¥
            ResendRequest.$(OBJEXT) Reject.$(OBJEXT) ¥
            SequenceReset.$(OBJEXT) ExecutionReport.$(OBJEXT) ¥
            OrderCancelReject.$(OBJEXT) TradingSessionStatus.$(OBJEXT) ¥
            BusinessMessageReject.$(OBJEXT) ¥
            OrderMassCancelReport.$(OBJEXT) SecurityList.$(OBJEXT) ¥
            Email.$(OBJEXT) ListStatus.$(OBJEXT) ¥
            MarketDataIncrementalRefresh.$(OBJEXT) ¥
            MarketDataRequestReject.$(OBJEXT) ¥
            RequestForPositionsAck.$(OBJEXT) PositionReport.$(OBJEXT) ¥
            CollateralResponse.$(OBJEXT) CollateralReport.$(OBJEXT) ¥
            Application.$(OBJEXT)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Makefile.am に追加したファイルが対象になってます。


■コンパイル(エラーもワーニングもでないこと)
tradeclient]# make  clean
tradeclient]# make
・・最後のみ表示・・
libtool: link: g++ -g -O2 -Wall -ansi -Wpointer-arith -Wwrite-strings -Wno-overloaded-virtual -I/usr/include/mysql -m64 -fabi-version=2 -fno-omit-frame-pointer -std=c++0x -o .libs/tradeclient tradeclient.o TestRequest.o OrderMassCancelRequest.o SecurityListRequest.o NewOrderSingle.o OrderCancelRequest.o OrderCancelReplaceRequest.o OrderStatusRequest.o MarketDataRequest.o OrderMassStatusRequest.o RequestForPositions.o ResendRequest.o Reject.o SequenceReset.o ExecutionReport.o OrderCancelReject.o TradingSessionStatus.o BusinessMessageReject.o OrderMassCancelReport.o SecurityList.o Email.o ListStatus.o MarketDataIncrementalRefresh.o MarketDataRequestReject.o RequestForPositionsAck.o PositionReport.o CollateralResponse.o CollateralReport.o Application.o  ../../src/C++/.libs/libquickfix.so -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl -Wl,-rpath -Wl,/usr/local/lib

こちらもちゃんと追加したプログラムファイルがコンパイルされてリンクされとります。


コンパイルも通ったので今回はここまで。。
最後にファイルリストだけ
tradeclient]# ls *.cpp
 Application.cpp                   NewOrderSingle.cpp             RequestForPositions.cpp
 BusinessMessageReject.cpp         OrderCancelReject.cpp          RequestForPositionsAck.cpp
 CollateralReport.cpp              OrderCancelReplaceRequest.cpp  ResendRequest.cpp
 CollateralResponse.cpp            OrderCancelRequest.cpp         SecurityList.cpp
 Email.cpp                         OrderMassCancelReport.cpp      SecurityListRequest.cpp
 ExecutionReport.cpp               OrderMassCancelRequest.cpp     SequenceReset.cpp
 ListStatus.cpp                    OrderMassStatusRequest.cpp     TestRequest.cpp
 MarketDataIncrementalRefresh.cpp  OrderStatusRequest.cpp         TradingSessionStatus.cpp
 MarketDataRequest.cpp             PositionReport.cpp             tradeclient.cpp
 MarketDataRequestReject.cpp       Reject.cpp











 
まこ | FIX | 00:55 | comments(0) | trackbacks(0) |
スポンサーサイト
スポンサードリンク | - | 00:55 | - | - |
Comment









Trackback
URL: