11
--
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
--
>>
<<
--
LATEST ENTRY
CATEGORY
ARCHIVE
PROFILE
SEARCH
RECENT COMMENT
  • エクセルファイルのパスワードを忘れたら・・・
    里奈 (09/09)
  • 【QUICKFIX】 FX自動売買への道 27 【接続時の仕様】
    mrsg (07/29)
  • 【QUICKFIX】 FX自動売買への道 11 【デモ環境への接続】
    大工の源さん (05/01)
  • 【QUICKFIX】 FX自動売買への道 19 【レート情報の取得(MarketDataRequest)】
    まこ (04/11)
  • 【QUICKFIX】 FX自動売買への道 19 【レート情報の取得(MarketDataRequest)】
    ぼん (04/11)
  • Excel の パスワード解除 (VBS版)
    おさる (01/05)
  • Excel の パスワード解除 (VBS版)
    おさる (01/05)
  • エクセルファイルのパスワードを忘れたら・・・
    ヤナト (07/07)
  • ffmpeg+libx264+libfaac の static ビルド
    ひげお (03/17)
  • TSの2重音声問題解決
    K (10/14)
MOBILE
qrcode
OTHERS
<< 【QUICKFIX】 FX自動売買への道 25 【情報系の試験(準正常系)】 | top | 【QUICKFIX】 FX自動売買への道 27 【接続時の仕様】 >>
【QUICKFIX】 FX自動売買への道 26 【スワップ情報 Roll Rates の取得】
情報系のテストは終わりましたが、MarketDataRequest でスワップ情報?も
取れるようなので、取得してみます。

 
通常のレート情報とスワップ情報の違いは仕様書によるとこんな感じ?

【レート情報】                【スワップ情報】
268 NoMarketDataEntries        268 NoMarketDataEntries
{                              {
  279 MarketDataUpdateAction     279 MarketDataUpdateAction
  269 MarketDataEntryType        269 MarketDataEntryType
  278 MarketDataEntryID
   55 Symbol                      55 Symbol
  270 MarketDataEntryPx          270 MarketDataEntryPX
  271 MarketDataEntrySize        
                                 272 MarketDataEntryDate
  346 NomberOfOrders             
                                 432 ExpireDate
}                              }



仕様書が本当なら、278 の有無でスワップ情報かどうかを判断できそう
あるいは 272 とか 432 あたり?


■スワップ情報テーブルの作成
スワップの最新値のみを保存するテーブルを作成します

    DROP TABLE IF EXISTS market_data_swap;
    CREATE TABLE market_data_swap
    (
      `Symbol`           VARCHAR(7)    NOT NULL                  COMMENT '55',
      `Type`             TINYINT(1)    NOT NULL                  COMMENT '269 0=Bid,1=Offer..',
      `Px`               REAL          NULL                      COMMENT '270',
      `EntryDate`        VARCHAR(8)    NULL                      COMMENT '272',
      `ExpireDate`       VARCHAR(8)    NULL                      COMMENT '432',
      `RespDateTime`     CHAR(21)      NULL                      COMMENT '52',
      PRIMARY KEY (`Symbol`, `Type`)
    ) ENGINE = InnoDB
    COMMENT 'MarketData Type=6.Swap';



毎度のことで履歴テーブルも作成します

    DROP TABLE IF EXISTS market_data_swap_hist;
    CREATE TABLE market_data_swap_hist
    (
      `id`               INT UNSIGNED  NOT NULL  AUTO_INCREMENT,
      `Symbol`           VARCHAR(7)    NOT NULL                  COMMENT '55',
      `Type`             TINYINT(1)    NOT NULL                  COMMENT '269 0=Bid,1=Offer..',
      `Px`               REAL          NULL                      COMMENT '270',
      `EntryDate`        VARCHAR(8)    NULL                      COMMENT '272',
      `ExpireDate`       VARCHAR(8)    NULL                      COMMENT '432',
      `RespDateTime`     CHAR(21)      NULL                      COMMENT '52',
      `Created_at`       DATETIME      NOT NULL  DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      INDEX idx_MD_swap_hist_Sym_Type (`Symbol`, `Type`),
      INDEX idx_MD_swap_hist_Create (`Created_at`)
    ) ENGINE = InnoDB
    COMMENT 'MarketData Type=6.Swap';



毎度のようにトリガー
毎度のように更新のタイミングで取得です

    DROP TRIGGER IF EXISTS trg_af_u_market_data_swap;
    DELIMITER //
    CREATE TRIGGER trg_af_u_market_data_swap
      AFTER UPDATE ON market_data_swap FOR EACH ROW
    BEGIN
      INSERT INTO market_data_swap_hist SET 
        `Symbol`       = NEW.`Symbol`  
      , `Type`         = NEW.`Type`    
      , `Px`           = NEW.`Px`      
      , `EntryDate`    = NEW.`EntryDate`    
      , `ExpireDate`   = NEW.`ExpireDate`  
      , `RespDateTime` = NEW.`RespDateTime`  
      ;
    END;
    //
    DELIMITER ;



■プログラムの改造(MarketDataIncrementalRefresh.cpp)
スワップ情報を判定してDBへ保存できるように改造です
結局 272 MarketDataEntryDate でスワップかどうかを判定することにしました

tradeclient]# vi MarketDataIncrementalRefresh.cpp
        #include "config.h"
        #include "Application.h"
        #include <iostream>

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

          /* init message data */
          /* 52   */ FIX::FieldBase respDateTime(FIX::FIELD::SendingTime, "");
          /* 262  */ FIX::FieldBase reqID(FIX::FIELD::MDReqID, "NA");

          /* get message data */
          /* 52  */ message.getHeader().getFieldIfSet(respDateTime);
          /* 262 */ message.getFieldIfSet(reqID);

          /* Get Request */
          std::ostringstream s;
          s << "SELECT `Depth` " <<
                "    , `Aggregate` " <<
                "  FROM `market_data_request` " <<
                " WHERE `ReqID` = '" << reqID << "' ";
          FIX::MySQLQuery q = MySQLExec( s.str() );

          /* depth = TOP */
          if (std::string(q.getValue(0,0)) == "1")
            InsertMarketData( message );
        }

        void Application::InsertMarketData( const FIX::Message& message )
        {
          std::string stopSymbol = "";

          /* 52   */ FIX::FieldBase respDateTime(FIX::FIELD::SendingTime, "");
          /* 268  */ FIX::FieldBase entries(FIX::FIELD::NoMDEntries, "0");

          /* 52  */ message.getHeader().getFieldIfSet(respDateTime);
          /* 268 */ message.getFieldIfSet(entries);

          /* Loop: Instrment Group */
          for( int i=1; i <= std::stoi(entries.getString()); i++ )
          {
            /* 146  */ FIX44::MarketDataIncrementalRefresh::NoMDEntries e;
            message.getGroup(i, e);

            /* init group data */
            /* 279  */ FIX::FieldBase action(FIX::FIELD::MDUpdateAction, "0");
            /* 269  */ FIX::FieldBase type(FIX::FIELD::MDEntryType, "0");
            /* 278  */ FIX::FieldBase entryID(FIX::FIELD::MDEntryID, "0");
            /* 55   */ FIX::FieldBase symbol(FIX::FIELD::Symbol, "NA");
            /* 270  */ FIX::FieldBase px(FIX::FIELD::MDEntryPx, "0");
            /* 271  */ FIX::FieldBase size(FIX::FIELD::MDEntrySize, "0");
            /* 346  */ FIX::FieldBase orders(FIX::FIELD::NumberOfOrders, "0");
            /* 272  */ FIX::FieldBase entryDate(FIX::FIELD::MDEntryDate, "");
            /* 432  */ FIX::FieldBase expireDate(FIX::FIELD::ExpireDate, "");

            /* get group data */
            e.getFieldIfSet(action);
            e.getFieldIfSet(type);
            e.getFieldIfSet(entryID);
            e.getFieldIfSet(symbol);
            e.getFieldIfSet(px);
            e.getFieldIfSet(size);
            e.getFieldIfSet(orders);
            e.getFieldIfSet(entryDate);
            e.getFieldIfSet(expireDate);

            std::ostringstream s;

            /* swap rate */
         if (entryDate.getString().size() != 0) {
              s <<  "INSERT INTO `market_data_swap` SET " <<
              /*-55   */  "   `Symbol`        = '" << symbol        << "' " <<
              /*-269  */  " , `Type`          = '" << type          << "' " <<
              /*-270  */  " , `Px`            = '" << px            << "' " <<
              /*-272  */  " , `EntryDate`     = '" << entryDate     << "' " <<
              /*-432  */  " , `ExpireDate`    = '" << expireDate    << "' " <<
              /*-52   */  " , `RespDateTime`  = '" << respDateTime  << "' " <<
            " ON DUPLICATE KEY UPDATE " <<
              "  `Symbol`       =  VALUES(`Symbol`) "      <<
              " ,`Type`         =  VALUES(`Type`) "        <<
              " ,`Px`           =  VALUES(`Px`) "          <<
              " ,`EntryDate`    =  VALUES(`EntryDate`) "   <<
              " ,`ExpireDate`   =  VALUES(`ExpireDate`) "  <<
              " ,`RespDateTime` =  VALUES(`RespDateTime`)";

              /* Stop request */
           if (stopSymbol != symbol.getString()) {
                stopSymbol = symbol.getString();
                MarketDataRequestStopSwap( stopSymbol );
              }
            }

            /* normal rate */
         else {
              s <<  "INSERT INTO `market_data` SET " <<
              /*-55   */  " , `Symbol`        = '" << symbol        << "' " <<
              /*-269  */  " , `Type`          = '" << type          << "' " <<
              /*-279  */  " , `Action`        = '" << action        << "' " <<
              /*-270  */  " , `Px`            = '" << px            << "' " <<
              /*-271  */  " , `Size`          = '" << size          << "' " <<
              /*-346  */  " , `Orders`        = '" << orders        << "' " <<
              /*-52   */  " , `RespDateTime`  = '" << respDateTime  << "' " <<
            " ON DUPLICATE KEY UPDATE " <<
              "  `Symbol`       =  VALUES(`Symbol`) "      <<
              " ,`Type`         =  VALUES(`Type`) "        <<
              " ,`Action`       =  VALUES(`Action`) "      <<
              " ,`Px`           =  VALUES(`Px`) "          <<
              " ,`Size`         =  VALUES(`Size`) "        <<
              " ,`Orders`       =  VALUES(`Orders`) "      <<
              " ,`RespDateTime` =  VALUES(`RespDateTime`)";
            }

            MySQLExec( s.str() );
          }
        }

ーーーーーーーーーーーーーーーーーーーーーーーーー
条件分岐 SWAP なら market_data_swap テーブルを更新
SWAPの場合は停止要求を自動で投げる
条件分岐 SWAP 以外なら market_data を更新


■要求メッセージ部分の作成(MarketDataRequest.cpp)
SWAP の要求を投げれるように改造です

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

        /* < V > */
        void Application::MarketDataRequest(
            /* 55  */ const std::string& target
          , /* 264 */ const int depth
          , /* 266 */ const bool& aggregate
          , /* 263 */ const FIX::SubscriptionRequestType& a_subType
       , /* -   */ const bool& swap
        )
        {
          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;

       if ( swap ) {
            c.push_back(FIX::MDEntryType_SETTLEMENT_PRICE);               /* 6 */
          }
       else {
            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 */
            }
          }

          while( !c.empty() ) {
            /* 267  */ FIX44::MarketDataRequest::NoMDEntryTypes entryType;
            /* 269  */ entryType.set(FIX::MDEntryType( c.back() ));
            c.pop_back();
            message.addGroup( entryType );
          }

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

          InsertMarketDataRequest( message );

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

        void Application::InsertMarketDataRequest( const FIX::Message& message )
        {
          std::ostringstream s;

          /* 262  */ FIX::FieldBase reqID(FIX::FIELD::MDReqID, "");
          /* 263  */ FIX::FieldBase reqType(FIX::FIELD::SubscriptionRequestType, "1");
          /* 264  */ FIX::FieldBase depth(FIX::FIELD::MarketDepth, "1");
          /* 266  */ FIX::FieldBase aggregate(FIX::FIELD::AggregatedBook, "Y");
          /* 267  */ FIX::FieldBase entryTypesum(FIX::FIELD::NoMDEntryTypes, "0");

          /* 262  */ message.getFieldIfSet(reqID);
          /* 263  */ message.getFieldIfSet(reqType);
          /* 264  */ message.getFieldIfSet(depth);
          /* 266  */ message.getFieldIfSet(aggregate);
          /* 267  */ message.getFieldIfSet(entryTypesum);

          /* STOP Request */
          if ( *reqType.getString().c_str() == FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST ) {
            s <<
              "UPDATE `market_data_request` SET " <<
              "   `ReqType`   = '" << reqType << "' " <<
              " , `StopTime`  = now()               " <<
              " WHERE `ReqID` = '" << reqID   << "' ";
            MySQLExec( s.str() );
            return;
          }

          /* 146  */ FIX44::MarketDataRequest::NoRelatedSym symbolGroup;
          /* 55   */ FIX::FieldBase symbol(FIX::FIELD::Symbol, "NA");
          message.getGroup( 1, symbolGroup );
          symbolGroup.getFieldIfSet(symbol);

          s << "INSERT INTO `market_data_request` SET " <<
          /*-262  */  "   `ReqID`        = '" << reqID        << "' " <<
          /*-263  */  " , `ReqType`      = '" << reqType      << "' " <<
          /*-264  */  " , `Depth`        = '" << depth        << "' " <<
          /*-266  */  " , `Aggregate`    = '" << aggregate    << "' " <<
          /*-267  */  " , `EntryTypeSum` = '" << entryTypesum << "' " <<
          /*-55   */  " , `Symbol`       = '" << symbol       << "' " <<
          /*---   */  " , `StartTime`    = now() ";

          s << " ON DUPLICATE KEY UPDATE " <<
            "  `ReqType`       =  VALUES(`ReqType`) " <<
            " ,`Symbol`        =  VALUES(`Symbol`) " <<
            " ,`Depth`         =  VALUES(`Depth`) " <<
            " ,`Aggregate`     =  VALUES(`Aggregate`) " <<
            " ,`EntryTypeSum`  =  VALUES(`EntryTypeSum`) " <<
            " ,`RespDateTime`  =  NULL " <<
            " ,`Entries`       =  NULL " <<
            " ,`RejectReason`  =  NULL " <<
            " ,`RejectText`    =  NULL " <<
            " ,`StartTime`     =  now() " <<
            " ,`StopTime`      =  NULL ";

          MySQLExec( s.str() );
        }

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
引数にswap フラグを追加です。 true ならswap要求にしときます。
swap フラグを判定。 swap要求なら、EntryType を 6 のみに設定
swap要求でなければ、今まで通り



■引数を変更したのでヘッダーを変更(Application.h)
SWAPの追加と、呼び出すときにわかりやすくしてみます

tradeclient]# vi Application.h
ーーーー抜粋ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
          /* H  */ void OrderStatusRequest();
          /* V  */ void MarketDataRequest(
                          /* 55  */   const std::string& = "USD/JPY"
                          /* 264 */ , const int = 1
                          /* 266 */ , const bool& = true
                          /* 263 */ , const FIX::SubscriptionRequestType& = FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES
                       /* 269 */ , const bool& = false
                        );

                void MarketDataRequestStartTOP( const std::string& symbol) { MarketDataRequest( symbol ); }
                void MarketDataRequestStartFULL(const std::string& symbol) { MarketDataRequest( symbol, 0 ); }
                void MarketDataRequestStartSwap(const std::string& symbol) { MarketDataRequest( symbol, 1, true,
                                                                                FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES, true); }
                void MarketDataRequestStopTOP( const std::string& symbol) { MarketDataRequest( symbol, 1, true,
                                                                               FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST); }
                void MarketDataRequestStopFULL(const std::string& symbol) { MarketDataRequest( symbol, 0, true,
                                                                               FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST); }
                void MarketDataRequestStopSwap(const std::string& symbol) { MarketDataRequest( symbol, 1, true,
                                                                               FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST, true); }

                   void InsertMarketDataRequest( const FIX::Message& );
          /* AF */ void OrderMassStatusRequest();
          /* AN */ void RequestForPositions( const std::string& clearingBusinessDate = "" );

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
引数を追加。 デフォルト値は false です
レート情報要求の呼び出しを簡単に、 TOP の開始要求専用
レート情報要求の呼び出しを簡単に、 FULLの開始要求専用
レート情報要求の呼び出しを簡単に、 SWAPの開始要求専用
レート情報要求の呼び出しを簡単に、 TOP の停止要求専用
レート情報要求の呼び出しを簡単に、 FULLの停止要求専用
レート情報要求の呼び出しを簡単に、 SWAPの停止要求専用



■呼び出し部分改造(Application.cpp)
SWAPの追加と簡単呼び出しに対応を

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
                << "V1) MarketDataRequest USD/JPY TOP  Aggr"    << std::endl
                << "V2) MarketDataRequest EUR/USD TOP  Aggr"    << std::endl
                << "V3) MarketDataRequest EUR/USD FULL Aggr"    << std::endl
                << "V4) MarketDataRequest USD/JPY FULL NoAggr"  << std::endl
                <<                                                 std::endl
             << "V5) MarketDataRequest USD/JPY SWAP"         << std::endl
             << "V6) MarketDataRequest EUR/USD SWAP"         << 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 == "V1" )  MarketDataRequestStartTOP("USD/JPY");
           else if ( action == "V2" )  MarketDataRequestStartTOP("EUR/USD");
           else if ( action == "V3" )  MarketDataRequestStartFULL("EUR/USD");

           else if ( action == "V4" )  MarketDataRequest("USD/JPY", 0, false, FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );

           else if ( action == "V5" )  MarketDataRequestStartSwap("USD/JPY");
           else if ( action == "V6" )  MarketDataRequestStartSwap("EUR/USD");


           else if ( action == "Vjq" ) MarketDataRequestStopTOP("USD/JPY");
           else if ( action == "Veq" ) MarketDataRequestStopTOP("EUR/USD");


              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();
            }
          }
        }

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
USD/JPY の swap 要求
EUR/USD の swap 要求

簡単呼び出しに対応
NonAggregate は簡単呼び出しで作らなかったので、引数をフルに指定して呼び出しです


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


■スワップ情報取得 − 実行
実行結果は見やすいように一部加工しています。

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

        V1) MarketDataRequest USD/JPY TOP  Aggr
        V2) MarketDataRequest EUR/USD TOP  Aggr
        V3) MarketDataRequest EUR/USD FULL Aggr
        V4) MarketDataRequest USD/JPY FULL NoAggr

        V5) MarketDataRequest USD/JPY SWAP
        V6) MarketDataRequest EUR/USD SWAP

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

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

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

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

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160425-14:40:06.42656=CAXDemo_Account_Str336=0340=210=078

        Logon - FIX.4.4:CAXDemo_Account_Trd->CNX

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160425-14:40:06.47656=CAXDemo_Account_Trd336=0340=210=068


     V5

     OUT: 8=FIX.4.49=13335=V34=249=CAXDemo_Account_Str52=20160425-14:40:13.18756=CNX146=155=USD/JPY262=USD/JPY263=1264=1265=1266=Y267=1269=610=123


        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[208]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[3]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160425-14:40:13.244]]></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[0]]></field>
              <field number="269"><![CDATA[0]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
           <field number="270"><![CDATA[-0.0009]]></field>
              <field number="272"><![CDATA[20120222]]></field>
              <field number="432"><![CDATA[20120223]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[1]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[-0.0003]]></field>
              <field number="272"><![CDATA[20120222]]></field>
              <field number="432"><![CDATA[20120223]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[219]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=20835=X34=349=CNX52=20160425-14:40:13.24456=CAXDemo_Account_Str262=USD/JPY268=2279=0269=055=USD/JPY270=-0.0009272=20120222432=20120223279=0269=155=USD/JPY270=-0.0003272=20120222432=2012022310=219

     OUT: 8=FIX.4.49=13335=V34=349=CAXDemo_Account_Str52=20160425-14:40:13.42656=CNX146=155=USD/JPY262=USD/JPY263=2264=1265=1266=Y267=1269=610=121


     V6

     OUT: 8=FIX.4.49=13335=V34=449=CAXDemo_Account_Str52=20160425-14:40:16.79556=CNX146=155=EUR/USD262=EUR/USD263=1264=1265=1266=Y267=1269=610=119


        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[211]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[4]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160425-14:40:16.854]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
            <field number="262"><![CDATA[EUR/USD]]></field>
            <field number="268"><![CDATA[2]]></field>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[0]]></field>
           <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[-0.000001]]></field>
              <field number="272"><![CDATA[20120222]]></field>
              <field number="432"><![CDATA[20120223]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[1]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[0.000005]]></field>
              <field number="272"><![CDATA[20120222]]></field>
              <field number="432"><![CDATA[20120223]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[088]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=21135=X34=449=CNX52=20160425-14:40:16.85456=CAXDemo_Account_Str262=EUR/USD268=2279=0269=055=EUR/USD270=-0.000001272=20120222432=20120223279=0269=155=EUR/USD270=0.000005272=20120222432=2012022310=088

     OUT: 8=FIX.4.49=13335=V34=549=CAXDemo_Account_Str52=20160425-14:40:17.01156=CNX146=155=EUR/USD262=EUR/USD263=2264=1265=1266=Y267=1269=610=103

ーーーーーーーーーーーーーーーーーーーー
USD/JPY の SWAP を要求
USD/JPY の SWAP 情報を受け取り
受け取ったので、停止要求を自動で投げる
こんどは EUR/USD の SWAP を要求
EUR/USD の SWAP 情報を受け取り
受け取ったので、停止要求を自動で投げる


メッセージの送受信としてはうまくいってる。。けど、、、

2012年2月22日???
2012年???


なんだこれ??


DBも一応確認
# mysql -uDBuser  -pDBpass  quickfix
        mysql> select * from market_data_swap;
        +---------+------+-----------+-----------+------------+-----------------------+
        | Symbol  | Type | Px        | EntryDate | ExpireDate | RespDateTime          |
        +---------+------+-----------+-----------+------------+-----------------------+
        | EUR/USD |    0 | -0.000001 | 20120222  | 20120223   | 20160425-14:40:16.854 |
        | EUR/USD |    1 |  0.000005 | 20120222  | 20120223   | 20160425-14:40:16.854 |
        | USD/JPY |    0 |   -0.0009 | 20120222  | 20120223   | 20160425-14:40:13.244 |
        | USD/JPY |    1 |   -0.0003 | 20120222  | 20120223   | 20160425-14:40:13.244 |
        +---------+------+-----------+-----------+------------+-----------------------+
        4 rows in set (0.00 sec)


ちゃんとDBにも入ってるけど。。
2012年??


なんだろ、SWAP情報は今は配信されないってことか??

せっかく作ったのになぁ。。。

 
まこ | FIX | 00:01 | comments(0) | trackbacks(0) |
Comment









Trackback
URL: