07
--
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
MOBILE
qrcode
OTHERS
<< 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】 | top | 【QUICKFIX】 FX自動売買への道 20 【レート要求情報の保存】 >>
【QUICKFIX】 FX自動売買への道 19 【レート情報の取得(MarketDataRequest)】
取引可能な通貨ペアを取得できたので、次は通貨ペア毎のレート情報を取得するようにしてみます。

レート情報の取得は < V > MarketDataRequest で取得

オプションが色々あって、どうやらFXでは珍しい?「板」情報も取れるみたい。。
ですが、とりあえずは使いやすい売買1値のみを取得してみます。

動くこと最優先なのでまず1通貨ペア USD/JPY のみを取得で

問題は MarketDataRequest を送ると、「STOP」メッセージを送るまで、延々とレート情報が送られてくること。
ちゃんと「STOP」まで用意してから実験することにしときましょう。

さらに、完全自動化のためには要求が拒否された時のことも考えとかないとな。。


■レート情報要求メッセージの作成 <V>(MarketDataRequest.cpp)
レート要求時のオプションには FULL(板)か、TOP(最適値)があります。
また、各注文をまとめるか(Aggregate)どうかのオプションもあります。
とりあえずは引数で変更できるようにしときました。
スプレッド情報とかセッション中の最高値、最安値の情報も取れるみたいですが
FULL(板)の時はそもそも情報が多いのでTOPの時だけ取るようにしときます。

tradeclient]# vi MarketDataRequest.cpp
        #include "config.h"
        #include "Application.h"
        #include "quickfix/Session.h"
        #include <iostream>

        /* < V > */
        void Application::MarketDataRequest(
            const std::string& target
          , const int depth
          , const bool& aggregate
          , const FIX::SubscriptionRequestType& a_subType
        )
        {
          FIX44::MarketDataRequest message;

          /* 262  */ message.set(FIX::MDReqID( target ));
          /* 263  */ message.set(FIX::SubscriptionRequestType( a_subType ));
          /* 264  */ message.set(FIX::MarketDepth( depth ));  /* 1 = Top Book, 0 = Full Book */
          /* 265  */ message.set(FIX::MDUpdateType( FIX::MDUpdateType_INCREMENTAL_REFRESH )); /* 1 Only */
          /* 266  */ message.set(FIX::AggregatedBook( aggregate )); /* true = Aggregate, false = NoAggregate */

          std::vector<char>c;
          c.push_back(FIX::MDEntryType_BID);                            /* 0 */
          c.push_back(FIX::MDEntryType_OFFER);                          /* 1 */
       if ( depth ){
            c.push_back(FIX::MDEntryType_TRADING_SESSION_HIGH_PRICE);   /* 7 */
            c.push_back(FIX::MDEntryType_TRADING_SESSION_LOW_PRICE);    /* 8 */
            c.push_back(FIX::MDEntryType_TRADING_SESSION_VWAP_PRICE);   /* 9 */
          }


          for(auto i: c){
            /* 267  */ FIX44::MarketDataRequest::NoMDEntryTypes entryType;
            /* 269  */ entryType.set(FIX::MDEntryType(i));
            message.addGroup( entryType );
          }

          /* 146  */ FIX44::MarketDataRequest::NoRelatedSym symbolGroup;
          /* 55   */ symbolGroup.set( FIX::Symbol(target) );
          message.addGroup( symbolGroup );

       FIX::Session::sendToTarget( message, m_sendercomp_ratefeedID, m_targetcompID );
        }

−−−−−−
TOP の時だけ、High、Low、Spread情報を取得です。
レート取得用アカウントです。



■呼び出し部分作成
tradeclient]# vi Application.cpp
−−−−−抜粋ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
        void Application::run()
        {
          while ( true )
          {
            try
            {
              std::string action;
              std::cout << std::endl
                << "x) Security List Request"                   << std::endl
                <<                                                 std::endl
                << "an1) Request For Positions(Snapshot)"       << std::endl
                << "an2) Request For Positions(Historical)"     << std::endl
                <<                                                 std::endl
                << "Vj) MarketDataRequest USD/JPY TOP  Aggr"    << std::endl
                << "Ve) MarketDataRequest EUR/USD TOP  Aggr"    << std::endl
                <<                                                 std::endl
                << "Vjq) MarketDataRequest USD/JPY STOP"        << std::endl
                << "Veq) MarketDataRequest EUR/USD STOP"        << std::endl
                <<                                                 std::endl
                << "test1) TestRequest Trade"                   << std::endl
                << "test2) TestRequest Ratefeed"                << std::endl
                <<                                                 std::endl
                << "q) Quit"                                    << std::endl
                << "Action: ";
              std::cin >> action;

              if      ( action == "x" ) SecurityListRequest();

              else if ( action == "an1" ) RequestForPositions();
              else if ( action == "an2" ) RequestForPositions(YmdHMSs().substr(0,8));

              else if ( action == "Vj" ) MarketDataRequest("USD/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "Ve" ) MarketDataRequest("EUR/USD", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );

              else if ( action == "Vjq" ) MarketDataRequest("USD/JPY", 0, false, FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST );
              else if ( action == "Veq" ) MarketDataRequest("EUR/USD", 0, false, FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST );

              else if ( action == "test1" ) TestRequest( m_sendercomp_tradeID );
              else if ( action == "test2" ) TestRequest( m_sendercomp_ratefeedID );
              else if ( action == "q" )
                break;
            }
            catch ( std::exception & e )
            {
              std::cout << "Message Not Sent: " << e.what();
            }
          }
        }

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

ヘッダーも
tradeclient]# vi Application.h
−−−−抜粋ーーーーーーーーーーーーーーーーーーーー
          /* V  */ void MarketDataRequest(const std::string&, int, const bool&, const FIX::SubscriptionRequestType& );
ーーーーーーーーーーーーーーーーーーーーーーーーーー

■コンパイル(エラーもワーニングも出ないこと)
tradeclient]# make
tradeclient]# cd ..


■デバッグ設定追加
examples]# vi tradeclient.cfg
−−−−抜粋ーーーーーーーーーーーーーーーーーーーーー

    # -- Debug ------
    Debug_j_BusinessMessageReject=true
    Debug_X_MarketDataIncrementalRefresh=true
    Debug_Y_MarketDataRequestReject=true


−−−−−−ーーーーーーーーーーーーーーーーーーーーー
レート情報の <X> と、拒否された時の <Y> を組み込んでおきます。



■実行
まずは USD/JPY の情報を取得して、すぐにSTOP要求を投げます。

examples]# ./tradeclient/tradeclient tradeclient.cfg
        x) Security List Request

        an1) Request For Positions(Snapshot)
        an2) Request For Positions(Historical)

        Vj) MarketDataRequest USD/JPY TOP  Aggr
        Ve) MarketDataRequest EUR/USD TOP  Aggr

        Vjq) MarketDataRequest USD/JPY STOP
        Veq) MarketDataRequest EUR/USD STOP

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

        q) Quit
        Action:
        Logon - FIX.4.4:CAXDemo_Account_Str->CNX

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160410-22:58:20.96856=CAXDemo_Account_Str336=0340=210=087

        Logon - FIX.4.4:CAXDemo_Account_Trd->CNX

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160410-22:58:21.01756=CAXDemo_Account_Trd336=0340=210=058
        Vj

        OUT: 8=FIX.4.49=15735=V34=249=CAXDemo_Account_Str52=20160410-22:58:25.52656=CNX146=155=USD/JPY262=USD/JPY263=1264=1265=1266=Y267=5269=0269=1269=7269=8269=910=214

        x) Security List Request

        an1) Request For Positions(Snapshot)
        an2) Request For Positions(Historical)

        Vj) MarketDataRequest USD/JPY TOP  Aggr
        Ve) MarketDataRequest EUR/USD TOP  Aggr

        Vjq) MarketDataRequest USD/JPY STOP
        Veq) MarketDataRequest EUR/USD STOP

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

        q) Quit
        Action: <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[326]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[3]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160410-22:58:25.615]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
            <field number="262"><![CDATA[USD/JPY]]></field>
            <field number="268"><![CDATA[5]]></field>
            <group>
              <field number="279"><![CDATA[0]]></field>              New
              <field number="269"><![CDATA[0]]></field>           BID情報
              <field number="278"><![CDATA[1]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.239]]></field>
              <field number="271"><![CDATA[1700000]]></field>        市場の厚み?情報
              <field number="346"><![CDATA[1]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[1]]></field>           Offer情報
              <field number="278"><![CDATA[2]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.254]]></field>
              <field number="271"><![CDATA[1500000]]></field>        市場の厚み?情報
              <field number="346"><![CDATA[1]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[7]]></field>           High情報
              <field number="278"><![CDATA[3]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.763]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[8]]></field>           Low情報
              <field number="278"><![CDATA[4]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.239]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[9]]></field>           Spread情報
              <field number="278"><![CDATA[5]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[1.5000]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[089]]></field>
          </trailer>
        </message>

        IN: 8=FIX.4.49=32635=X34=349=CNX52=20160410-22:58:25.61556=CAXDemo_Account_Str262=USD/JPY268=5279=0269=0278=155=USD/JPY270=108.239271=1700000346=1279=0269=1278=255=USD/JPY270=108.254271=1500000346=1279=0269=7278=355=USD/JPY270=108.763279=0269=8278=455=USD/JPY270=108.239279=0269=9278=555=USD/JPY270=1.500010=089
        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[326]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[4]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160410-22:58:25.900]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
            <field number="262"><![CDATA[USD/JPY]]></field>
            <field number="268"><![CDATA[5]]></field>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[0]]></field>
              <field number="278"><![CDATA[1]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.239]]></field>
              <field number="271"><![CDATA[2700000]]></field>
              <field number="346"><![CDATA[1]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[1]]></field>
              <field number="278"><![CDATA[2]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.254]]></field>
              <field number="271"><![CDATA[1000000]]></field>
              <field number="346"><![CDATA[1]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[7]]></field>
              <field number="278"><![CDATA[3]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.763]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[8]]></field>
              <field number="278"><![CDATA[4]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.239]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[9]]></field>
              <field number="278"><![CDATA[5]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[1.5000]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[083]]></field>
          </trailer>
        </message>

        IN: 8=FIX.4.49=32635=X34=449=CNX52=20160410-22:58:25.90056=CAXDemo_Account_Str262=USD/JPY268=5279=0269=0278=155=USD/JPY270=108.239271=2700000346=1279=0269=1278=255=USD/JPY270=108.254271=1000000346=1279=0269=7278=355=USD/JPY270=108.763279=0269=8278=455=USD/JPY270=108.239279=0269=9278=555=USD/JPY270=1.500010=083


〜〜〜省略〜〜〜〜
        Vjq

        OUT: 8=FIX.4.49=13935=V34=349=CAXDemo_Account_Str52=20160410-22:58:30.10956=CNX146=155=USD/JPY262=USD/JPY263=2264=0265=1266=N267=2269=0269=110=125

        x) Security List Request

        an1) Request For Positions(Snapshot)
        an2) Request For Positions(Historical)

        Vj) MarketDataRequest USD/JPY TOP  Aggr
        Ve) MarketDataRequest EUR/USD TOP  Aggr

        Vjq) MarketDataRequest USD/JPY STOP
        Veq) MarketDataRequest EUR/USD STOP

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

        q) Quit
        Action: <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[145]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[10]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160410-22:58:30.200]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
            <field number="262"><![CDATA[USD/JPY]]></field>
            <field number="268"><![CDATA[2]]></field>
            <group>
              <field number="279"><![CDATA[2]]></field>              Delete
              <field number="269"><![CDATA[0]]></field>
              <field number="278"><![CDATA[1]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[2]]></field>              Delete
              <field number="269"><![CDATA[1]]></field>
              <field number="278"><![CDATA[2]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[073]]></field>
          </trailer>
        </message>

        IN: 8=FIX.4.49=14535=X34=1049=CNX52=20160410-22:58:30.20056=CAXDemo_Account_Str262=USD/JPY268=2279=2269=0278=155=USD/JPY279=2269=1278=255=USD/JPY10=073



−−−−
とりあえずは、USD/JPY のレート情報取得成功です。



 
まこ | FIX | 08:20 | comments(2) | trackbacks(0) |
スポンサーサイト
スポンサードリンク | - | 08:20 | - | - |
Comment
こんなマニアックな記事を見ていてくれる人がいるなんて
ありがとうございます。
はげみになります。

レート情報は私も苦労しました。
が、原因は証券会社側で設定が漏れていたため情報が取れなかったというお粗末さ
プログラム的に問題がないはずなのに。。と悩みました。。
長く悩むよりはさっさと問い合わせるとよいと思います。

posted by まこ ,2016/04/11 11:36 PM

いつも楽しみにしております。

今回のレート情報の取得が自力でできなかったために、

この一週間、更新を待ち焦がれておりました。笑

参考にさせていただきます。

ありがとうございます。

posted by ぼん ,2016/04/11 11:18 AM










Trackback
URL: