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自動売買への道 12 【Trading Session Status の組み込み】 | top | 【QUICKFIX】 FX自動売買への道 14 【独自テーブルへのINSERT&SELECT】 >>
スポンサーサイト

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

スポンサードリンク | - | | - | - |
【QUICKFIX】 FX自動売買への道 13 【Application.cpp の分割】
FIXのメッセージに対応するために、Application.cpp に TestRequest<1> や Trading Session Status<h>を
組み込んできましたが、今後新しいメッセージに対応する度にどんどん追記すると
ファイルが肥大化しちゃうのでメッセージごとにソースを分割しときます。

 

今後対応予定のメッセージはすでに組み込み済みも含むと以下29種類
    < 1 > Test Request
    < 2 > Resend Request
    < 3 > Reject
    < 4 > Sequence Reset
    < 8 > Execution Report
    < 9 > Order Cancel Reject
    < h > Trading Session Status
    < j > Business Message Reject
    < q > Order Mass Cancel Request
    < r > Order Mass Cancel Report
    < x > Security List Request
    < y > Security List
    < C > Email
    < D > New Order Single
    < F > Order Cancel Request
    < G > Order Cancel/Replace Request
    < H > Order Status Request
    < N > List Status
    < V > Market Data Request
    < X > Market Data - Incremental Refresh
    < Y > Market Data Request Reject
    < AF > Order Mass Status Request
    < AN > Request For Positions
    < AO > Request for Positions Ack
    < AP > Position Report
    < AZ > Collateral Response
    < BA > Collateral Report
    < CG > Party Details List Report
    < PU > Order Rate Update


Application.cpp が肥大化する前に対策しときます。


■ファイルの分割
分割方針
・ヘッダーファイルは Application.h に集約
・1メッセージ1ソースファイル
というわけで、すでに組み込んでしまっているTestRequestやらを分割します。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
tradeclient]# cp -p Application.cpp TestRequest.cpp
tradeclient]# vi TestRequest.cpp
        #ifdef _MSC_VER
        #pragma warning( disable : 4503 4355 4786 )
        #else
        #include "config.h"
        #endif

        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

        /* < 1 > */
        void Application::TestRequest( const char* sessionType )
        {
          FIX44::TestRequest message((FIX::TestReqID)sessionType);
          SetMessageHeader( message, sessionType );
          FIX::Session::sendToTarget( message );
        }


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
tradeclient]# cp -p Application.cpp TradingSessionStatus.cpp
tradeclient]# vi TradingSessionStatus.cpp
        #ifdef _MSC_VER
        #pragma warning( disable : 4503 4355 4786 )
        #else
        #include "config.h"
        #endif

        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

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


デバッグフラグ「Debug_h_TradingSessionStatus」がある時だけXMLを吐き出すようにしときました。


−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
tradeclient]# vi Application.cpp
        #ifdef _MSC_VER
        #pragma warning( disable : 4503 4355 4786 )
        #else
        #include "config.h"
        #endif

        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

        void Application::onLogon( const FIX::SessionID& sessionID )
        { std::cout << std::endl << "Logon - " << sessionID << std::endl; }

        void Application::onLogout( const FIX::SessionID& sessionID )
        { std::cout << std::endl << "Logout - " << sessionID << std::endl; }

        void Application::fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
        throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType )
        {
          std::cout << std::endl << "IN: " << message << std::endl;
          crack( message, sessionID );
        }

        void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID )
        {
          if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
          {
            const FIX::Dictionary& dic = m_settings.get( sessionID );
            if (dic.has("Password"))
              message.getHeader().setField(FIX::Password(dic.getString("Password")));
          }
        }

        void Application::toApp( FIX::Message& message, const FIX::SessionID& sessionID )
        throw( FIX::DoNotSend )
        {
          try
          {
            FIX::PossDupFlag possDupFlag;
            message.getHeader().getField( possDupFlag );
            if ( possDupFlag ) throw FIX::DoNotSend();
          }
          catch ( FIX::FieldNotFound& ) {}

          std::cout << std::endl << "OUT: " << message << std::endl;
        }

        void Application::run()
        {
          while ( true )
          {
            try
            {
              char action;
              std::cout << std::endl
                << "1) TestRequest Trade"  << std::endl
                << "2) TestRequest Ratefeed"  << std::endl
                << "q) Quit"  << std::endl
                << "Action: ";
              std::cin >> action;

              if      ( action == '1' ) TestRequest( SessionTypeTrade );
              else if ( action == '2' ) TestRequest( SessionTypeRatefeed );
              else if ( action == 'q' )
                break;
            }
            catch ( std::exception & e )
            {
              std::cout << "Message Not Sent: " << e.what();
            }
          }
        }

        void Application::SetMessageHeader( FIX::Message& message, const char* sessionType )
        {
          const std::set <FIX::SessionID> session = m_settings.getSessions();
          for (std::set<FIX::SessionID>::iterator it = session.begin(); it != session.end(); ++it)
          {
            const FIX::Dictionary dic = m_settings.get( *it );
            if (dic.getString("SessionType") == sessionType)
            {
              message.getHeader().setField((FIX::SenderCompID)dic.getString("SenderCompID"));
              message.getHeader().setField((FIX::TargetCompID)dic.getString("TargetCompID"));
            }
          }
        }





■Makeファイルの生成
いろいろ方法はありますが。。今回はQuickFIXでそもそも用意されてる仕組みをそのまま使わせてもらいます。
tradeclient]# vi Makefile.am
        noinst_PROGRAMS = tradeclient

        tradeclient_SOURCES = ¥
                tradeclient.cpp ¥
                TestRequest.cpp ¥
                TradingSessionStatus.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

                
分割したファイルを追記して
Makefile を再生成
tradeclient]# cd ../..
quickfix]# ./bootstrap
quickfix]# ./configure   --with-mysql


■コンパイル
そして、コンパイル
quickfix]# cd examples/tradeclient
tradeclient]# make clean
tradeclient]# make
g++ -DHAVE_CONFIG_H -I. -I../.. -I../../include -I..    -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 -MT tradeclient.o -MD -MP -MF .deps/tradeclient.Tpo -c -o tradeclient.o tradeclient.cpp
mv -f .deps/tradeclient.Tpo .deps/tradeclient.Po
g++ -DHAVE_CONFIG_H -I. -I../.. -I../../include -I..    -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 -MT TestRequest.o -MD -MP -MF .deps/TestRequest.Tpo -c -o TestRequest.o TestRequest.cpp
mv -f .deps/TestRequest.Tpo .deps/TestRequest.Po
g++ -DHAVE_CONFIG_H -I. -I../.. -I../../include -I..    -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 -MT TradingSessionStatus.o -MD -MP -MF .deps/TradingSessionStatus.Tpo -c -o TradingSessionStatus.o TradingSessionStatus.cpp
mv -f .deps/TradingSessionStatus.Tpo .deps/TradingSessionStatus.Po
g++ -DHAVE_CONFIG_H -I. -I../.. -I../../include -I..    -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 -MT Application.o -MD -MP -MF .deps/Application.Tpo -c -o Application.o Application.cpp
mv -f .deps/Application.Tpo .deps/Application.Po
/bin/sh ../../libtool  --tag=CXX   --mode=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 tradeclient tradeclient.o TestRequest.o TradingSessionStatus.o Application.o ../../src/C++/libquickfix.la  -lpthread   -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl
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 TradingSessionStatus.o Application.o  ../../src/C++/.libs/libquickfix.so -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl -Wl,-rpath -Wl,/usr/local/lib
rm -f ../../bin/tradeclient
ln -s ../examples/tradeclient/tradeclient ../../bin/tradeclient


・・ちゃんと分割したファイルもコンパイルされてます。


■設定ファイルにデバッグフラグを追加
tradeclient]# cd ..
examples]# vi tradeclient.cfg
 −−−抜粋ーーーーーーーーーーーーーーーーーーーー
        [SESSION]
        BeginString=FIX.4.4
        SenderCompID=CAXDemo_Account_Trd
        TargetCompID=CNX
        SocketConnectHost=127.0.0.1
        SocketConnectPort=9999
        HeartBtInt=30
        Password=Pass1234
        SessionType=Trade
        Debug_h_TradingSessionStatus=true

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

セッションが _Trd トレード用の場合のみ、< h > Trading Session Status のメッセージをXML表示する。


■動作確認
Stunnel が起動してなければ起動してから、クライアントを起動
# stunnel
examples]# ./tradeclient/tradeclient tradeclient.cfg
        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
        Action:
        Logon - FIX.4.4:CAXDemo_Account_Str->CNX

     IN: 8=FIX.4.49=8035=h34=249=CNX52=20160328-13:04:07.99156=CAXDemo_Account_Str336=0340=210=087

        Logon - FIX.4.4:CAXDemo_Account_Trd->CNX

     IN: 8=FIX.4.49=8035=h34=249=CNX52=20160328-13:04:07.99356=CAXDemo_Account_Trd336=0340=210=074
        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[80]]></field>
            <field number="35"><![CDATA[h]]></field>
            <field number="34"><![CDATA[2]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160328-13:04:07.993]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Trd]]></field>
          </header>
          <body>
            <field number="336"><![CDATA[0]]></field>
            <field number="340"><![CDATA[2]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[074]]></field>
          </trailer>
        </message>
        1

     TestRequest: 8=FIX.4.49=7835=134=249=CAXDemo_Account_Trd52=20160328-13:04:11.96756=CNX112=Trade10=199

        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
        Action: 2

     TestRequest: 8=FIX.4.49=8135=134=249=CAXDemo_Account_Str52=20160328-13:04:14.55756=CNX112=Ratefeed10=254

        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
        Action: q

        Logout - FIX.4.4:CAXDemo_Account_Str->CNX

        Logout - FIX.4.4:CAXDemo_Account_Trd->CNX


−−−−
 .譟璽藩僖▲ウント Account_Str の時には < h > でXML表示をしてなくて
◆.肇譟璽浜僖▲ウント Account_Trd の時には < h > でXML表示をしている
   −> デバッグフラグがきちんと機能してる確認ができました。

、ぁ(割した TestRequest もちゃんと機能してます。



以上
Application.cpp の分割完了です。



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









Trackback
URL: