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自動売買への道 21 【レート情報の取得(MarketDataIncrementalRefresh)】 | top | 【QUICKFIX】 FX自動売買への道 23 【レート情報取得拒否試験】 >>
【QUICKFIX】 FX自動売買への道 22 【レート情報取得が拒否られた時(MarketDataRequestReject)】
レート情報も取得できたので、順番が逆ですがレート情報取得が拒否られた時の対応をしときます。

ついでに拒否パターンについても試験しときますか

 
レート情報取得のパラメータがおかしいとか、構成?がおかしいとかそんな時に拒否られます。
拒否られた時のメッセージは < Y > MarketDataRequestReject です。

拒否られる理由は証券会社の仕様書から見るとこんな感じ
 0 Unknown Symbol - 通貨ペアが不明
 1 Duplicate MarketDataRequestID - 要求IDが重複しとる
 2 Insufficient bandwidth - 帯域が足りない?
 3 Insufficient permission - 権限が足りない?
 4 Unsupported SubscriptionRequestType - 要求タイプがサポート外
 5 Unsupported MarketDepth - 要求範囲がサポート外(FULLかTOP以外ってこと?)
 6 Unsupported MarketDataUpdateType - 更新タイプがサポート外
 7 Unsupported Aggregated book - 要求パターン?がサポート外( Yes か No以外?)
 8 Unsupported MarketDataEntryType - 要求情報がサポート外(Bid とか Offerとか)


仕様としては単純にこんな感じにしときます
 拒否られた要求が要求中状態の場合 −> STOP要求を投げておく
 拒否られた要求が要求中じゃない(STOP状態の)場合 −> 何もしない


■レート情報取得拒否受信プログラムを(MarketDataRequestReject.cpp)
tradeclient]# vi MarketDataRequestReject.cpp
        #include "config.h"
        #include "Application.h"
        #include <iostream>

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

          /* init message data */
          /* 52   */ FIX::FieldBase respDateTime(FIX::FIELD::SendingTime, "");
          /* 262  */ FIX::FieldBase reqID(FIX::FIELD::MDReqID, "NA");
          /* 281  */ FIX::FieldBase rejectReason(FIX::FIELD::MDReqRejReason, "");
          /* 58   */ FIX::FieldBase rejectText(FIX::FIELD::Text, "");

          /* get message data */
          /* 52  */ message.getHeader().getFieldIfSet(respDateTime);
          /* 262 */ message.getFieldIfSet(reqID);
          /* 281 */ message.getFieldIfSet(rejectReason);
          /* 58  */ message.getFieldIfSet(rejectText);

          /* Reject Request is stopped ? */
       std::ostringstream s2;
          s2 << "SELECT `Symbol` " <<
                "  FROM `market_data_request` " <<
                " WHERE `ReqID` = '" << reqID << "' " <<
                "   AND `ReqType` = '" << FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES << "' ";

       FIX::MySQLQuery q = MySQLExec( s2.str() );

          /* UPDATE SQL */
       std::ostringstream s;
          s <<  "UPDATE `market_data_request` SET " <<
            /*-281  */  "   `RejectReason`  = '" << rejectReason  << "' " <<
            /*-58   */  " , `RejectText`    = '" << rejectText    << "' " <<
            /*-52   */  " , `RespDateTime`  = '" << respDateTime  << "' ";

          /* not stopped - STOP SQL */
       if ( q.rows() != 0 ) {
            s <<
            /*-263  */  " , `ReqType`       = '" << FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST << "' " <<
            /*---   */  " , `StopTime`      = now() ";
          }

          /* DB Update */
       s << " WHERE `ReqID` = '" << reqID << "' ";
       MySQLExec( s.str() );

          /* not stopped - STOP request */
       if ( q.rows() != 0 ) {
            MarketDataRequest( /* 55  Symbol      */ q.getValue(0,0),
                               /* 264 Depth       */ 1,
                               /* 266 Aggregate   */ true,
                               /* 263 RequestType */ FIX::SubscriptionRequestType_DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST );
            }
        }


ーーーーーーーーーーーーーーーーーーーーーーーーー
 START状態か判定するための情報取得準備
◆START状態か情報取得
 DBをUPDATEする準備(START状態でもそうじゃなくても共通)
ぁSTART状態なら、STOP要求情報を更新対象に含める
ァUPDATE用に拒否られたメッセージIDを指定
ΑDBをUPDATE
АSTART状態ならば、STOP要求を投げる

ってな感じです


■試験のために拒否られる要求を作成(Application.cpp)
【拒否られる理由】を一通り確認するために
 0 Unknown Symbol - 通貨ペアが不明
 1 Duplicate MarketDataRequestID - 要求IDが重複しとる
 2 Insufficient bandwidth - 帯域が足りない?
 3 Insufficient permission - 権限が足りない?
 4 Unsupported SubscriptionRequestType - 要求タイプがサポート外
 5 Unsupported MarketDepth - 要求範囲がサポート外(FULLかTOP以外ってこと?)
 6 Unsupported MarketDataUpdateType - 更新タイプがサポート外
 7 Unsupported Aggregated book - 要求パターン?がサポート外( Yes か No以外?)
 8 Unsupported MarketDataEntryType - 要求情報がサポート外(Bid とか Offerとか)

拒否られるためにいろんな要求を投げれるようにしとく
 失敗要求1:「0」の確認:通貨ペア不正 - 通貨ペア文字の間のスラッシュがなかった場合
 失敗要求2:「0」の確認:対象外通貨ペア - SecurityListRequest で返されなかった通貨ペアの場合
 失敗要求3:「1」の確認:連続で要求を投げる - USD/JPY の要求の後でまた USD/JPY の要求を投げる
 
 ※ 拒否られる理由2と3は・・どうやって起こせばいいのか。。NICの帯域絞るとか?? 諦めます
 
 失敗要求4:「4」の確認:要求タイプ不正 -  START と STOP 以外の値にする
 失敗要求5:「5」の確認:要求範囲不正 -  FULL と TOP 以外の値にする
 失敗要求6:「6」の確認:更新タイプ不正 - 固定値 1 以外の値にする
 失敗要求7:「7」の確認:要求パターン不正 -  Y か N 以外の値にする
 失敗要求8:「8」の確認:要求情報不正 -  Bid と Offer はセットで要求しなきゃダメなのに片方だけの場合


まぁとりあえずこんなもので
プログラムの引数を変えるのもめんどくさいので?
通貨ペアの組み合わせによってエラーの種類を変えてみようかな


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 Err 1 USDJPY "        << std::endl
                << "V2) MarketDataRequest Err 2 USD/IDR "       << std::endl
                << "V3) MarketDataRequest Err 3 USD/JPY "       << std::endl
                << "V4) MarketDataRequest Err 4 CAD/JPY "       << std::endl
                << "V5) MarketDataRequest Err 5 CHF/JPY "       << std::endl
                << "V6) MarketDataRequest Err 6 EUR/JPY "       << std::endl
                << "V7) MarketDataRequest Err 7 GBP/JPY "       << std::endl
                << "V8) MarketDataRequest Err 8 ZAR/JPY "       << 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 == "V1" )  MarketDataRequest("USDJPY",  1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "V2" )  MarketDataRequest("USD/IDR", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "V3" ){ MarketDataRequest("USD/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
                                          MarketDataRequest("USD/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES ); }
              else if ( action == "V4" )  MarketDataRequest("CAD/JPY", 1, true,  0 );
              else if ( action == "V5" )  MarketDataRequest("CHF/JPY", 2, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "V6" )  MarketDataRequest("EUR/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "V7" )  MarketDataRequest("GBP/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );
              else if ( action == "V8" )  MarketDataRequest("ZAR/JPY", 1, true,  FIX::SubscriptionRequestType_SNAPSHOT_PLUS_UPDATES );


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


ーーーーーーーーーーーーーーーーーーー
 V1: スラッシュを忘れた場合
 V2: インドルピーはSecurityList になかったので
 V3: 2連続で要求を投げてみます
 V4: 対応外の値(0)を投げてみる
 V5: TOP と FULL 以外の値(2)を投げてみる
 V6、V7、V8 はMarketDataRequest の方で対応



■失敗要求を投げれるように一時的に改修(MarketDataRequest.cpp)
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 */

        /* err 6 */
       if ( target == "EUR/JPY" )
            /* 265  */ message.set(FIX::MDUpdateType( 0 )); 
          else
            /* 265  */ message.set(FIX::MDUpdateType( FIX::MDUpdateType_INCREMENTAL_REFRESH )); /* 1 Only */


        /* err 7 */
       if ( target == "GBP/JPY" )
            /* 266  */ message.setField(266, "Z"); 
          else
            /* 266  */ message.set(FIX::AggregatedBook( aggregate )); /* true = Aggregate, false = NoAggregate */


          std::vector<char>c;
          c.push_back(FIX::MDEntryType_BID);                            /* 0 */

        /* err 8 */
       if ( target != "ZAR/JPY" )
            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 );
        }


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
失敗要求6 のために 固定値1 以外を与える
失敗要求7 のために Yes でも No でもない 'Z' を与える
失敗要求8 のために Offer 要求を与えない
他の要求は一時的にコメントアウト
どうやら auto が使えない環境もあるようなので、while で書き換え
    auto 便利なんだけどなぁ。。 この先も使うと思うし


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


■設定ファイル編集
デバッグフラグを有効にしておく
examples]# vi tradeclient.cfg
ーーーー抜粋ーーーーーーーーーーーーーーー
    # -- Debug ------
    ## Debug_h_TradingSessionStatus=true
    ## Debug_y_SecurityList=true
    Debug_j_BusinessMessageReject=true
    ## Debug_X_MarketDataIncrementalRefresh=true
★  Debug_Y_MarketDataRequestReject=true

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


■テーブルクリア
解析やりやすくしときます
# mysql -uDBuser -pDBpass quickfix

        mysql> Truncate table market_data_request;
        Query OK, 0 rows affected (0.02 sec)

        mysql> Truncate table market_data_request_hist;
        Query OK, 0 rows affected (0.02 sec)




■実行
全文を乗せると大変なのでダイジェストで
(見やすいように一部修正してますよ)


失敗要求1:「0」の確認:通貨ペア不正 - 通貨ペア文字の間のスラッシュがなかった場合
−−−−−−−−−−−−−−−−−−−−−−−−
        V1
     OUT: 8=FIX.4.49=13735=V34=249=CAXDemo_Account_Str52=20160415-15:52:40.73356=CNX146=155=USDJPY262=USDJPY263=1264=1265=1266=Y267=2269=1269=010=044

        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[103]]></field>
            <field number="35"><![CDATA[Y]]></field>
            <field number="34"><![CDATA[3]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160415-15:52:40.806]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
         <field number="58"><![CDATA[Invalid Symbol]]></field>
            <field number="262"><![CDATA[USDJPY]]></field>
            <field number="281"><![CDATA[0]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[038]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=10335=Y34=349=CNX52=20160415-15:52:40.80656=CAXDemo_Account_Str58=Invalid Symbol262=USDJPY281=010=038

     OUT: 8=FIX.4.49=13735=V34=349=CAXDemo_Account_Str52=20160415-15:52:40.93356=CNX146=155=USDJPY262=USDJPY263=2264=1265=1266=Y267=2269=1269=010=048

        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[103]]></field>
            <field number="35"><![CDATA[Y]]></field>
            <field number="34"><![CDATA[4]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160415-15:52:41.007]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
         <field number="58"><![CDATA[Invalid Symbol]]></field>
            <field number="262"><![CDATA[USDJPY]]></field>
            <field number="281"><![CDATA[0]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[033]]></field>
          </trailer>
        </message>
        IN: 8=FIX.4.49=10335=Y34=449=CNX52=20160415-15:52:41.00756=CAXDemo_Account_Str58=Invalid Symbol262=USDJPY281=010=033

−−−−−−−−−−−−−−−−−−−−−−−−
失敗要求1を投げる 通貨ペア不正 - 通貨ペア文字の間のスラッシュがなかった場合
拒否メッセージを受信: 281=0、 58=Invalid Symbol
拒否メッセージを受信したので STOP 要求を投げる
STOP要求も Invalid Symbol で返ってきたけど、DBはSTOP状態なので、再度STOP要求を投げたりしない


281 = 0 は Unknown Symbol - 通貨ペアが不明
エラーメッセージが違うけど、、
まぁ想定通りの動き



失敗要求2:「0」の確認:対象外通貨ペア - SecurityListRequest で返されなかった通貨ペアの場合
−−−−−−−−−−−−−−−−−−−−−−−−
        V2
     OUT: 8=FIX.4.49=13935=V34=449=CAXDemo_Account_Str52=20160415-15:52:44.22856=CNX146=155=USD/IDR262=USD/IDR263=1264=1265=1266=Y267=2269=1269=010=105

        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[118]]></field>
            <field number="35"><![CDATA[Y]]></field>
            <field number="34"><![CDATA[5]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160415-15:52:44.294]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
         <field number="58"><![CDATA[Instrument is not configured]]></field>
            <field number="262"><![CDATA[USD/IDR]]></field>
            <field number="281"><![CDATA[0]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[221]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=11835=Y34=549=CNX52=20160415-15:52:44.29456=CAXDemo_Account_Str58=Instrument is not configured262=USD/IDR281=010=221


     OUT: 8=FIX.4.49=13935=V34=549=CAXDemo_Account_Str52=20160415-15:52:44.43156=CNX146=155=USD/IDR262=USD/IDR263=2264=1265=1266=Y267=2269=1269=010=103

        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[112]]></field>
            <field number="35"><![CDATA[Y]]></field>
            <field number="34"><![CDATA[6]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160415-15:52:44.509]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
         <field number="58"><![CDATA[No active subscription]]></field>
            <field number="262"><![CDATA[USD/IDR]]></field>
            <field number="281"><![CDATA[2]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[139]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=11235=Y34=649=CNX52=20160415-15:52:44.50956=CAXDemo_Account_Str58=No active subscription262=USD/IDR281=210=139

−−−−−−−−−−−−−−−−−−−−−−−−
失敗要求2を投げる 対象外通貨ペア - SecurityListRequest で返されなかった通貨ペアの場合
拒否メッセージを受信: 281=0、 58=Instrument is not configured
拒否メッセージを受信したので STOP 要求を投げる
STOP要求は No active subscription って、STARTしてないけど?って返ってきてるのでOK


281 = 0 は Unknown Symbol - 通貨ペアが不明
エラーメッセージが違うけど、まぁ意味としては SecurityListRequest で返されなかった
 not configured ってことでOKかな



失敗要求3:「1」の確認:連続で要求を投げる - USD/JPY の要求の後でまた USD/JPY の要求を投げる
−−−−−−−−−−−−−−−−−−−−−−−−
        V3

     OUT: 8=FIX.4.49=13935=V34=649=CAXDemo_Account_Str52=20160415-15:52:47.42856=CNX146=155=USD/JPY262=USD/JPY263=1264=1265=1266=Y267=2269=1269=010=152
     OUT: 8=FIX.4.49=13935=V34=749=CAXDemo_Account_Str52=20160415-15:52:47.43456=CNX146=155=USD/JPY262=USD/JPY263=1264=1265=1266=Y267=2269=1269=010=150

     IN: 8=FIX.4.49=20335=X34=749=CNX52=20160415-15:52:47.49956=CAXDemo_Account_Str262=USD/JPY268=2279=0269=0278=155=USD/JPY270=108.73271=1000000346=1279=0269=1278=255=USD/JPY270=108.736271=1000000346=110=227

        <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[120]]></field>
            <field number="35"><![CDATA[Y]]></field>
            <field number="34"><![CDATA[8]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160415-15:52:47.622]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
          <field number="58"><![CDATA[Duplicate subscription request]]></field>
            <field number="262"><![CDATA[USD/JPY]]></field>
            <field number="281"><![CDATA[1]]></field>
          </body>
          <trailer>
            <field number="10"><![CDATA[009]]></field>
          </trailer>
        </message>
     IN: 8=FIX.4.49=12035=Y34=849=CNX52=20160415-15:52:47.62256=CAXDemo_Account_Str58=Duplicate subscription request262=USD/JPY281=110=009

     OUT: 8=FIX.4.49=13935=V34=849=CAXDemo_Account_Str52=20160415-15:52:47.74656=CNX146=155=USD/JPY262=USD/JPY263=2264=1265=1266=Y267=2269=1269=010=158

     IN: 8=FIX.4.49=20335=X34=949=CNX52=20160415-15:52:47.80756=CAXDemo_Account_Str262=USD/JPY268=2279=0269=0278=155=USD/JPY270=108.73271=1500000346=1279=0269=1278=255=USD/JPY270=108.737271=5500000346=110=237
     IN: 8=FIX.4.49=14635=X34=1049=CNX52=20160415-15:52:47.80856=CAXDemo_Account_Str262=USD/JPY268=1279=0269=1278=255=USD/JPY270=108.737271=1000000346=110=235
     IN: 8=FIX.4.49=14535=X34=1149=CNX52=20160415-15:52:47.82456=CAXDemo_Account_Str262=USD/JPY268=2279=2269=0278=155=USD/JPY279=2269=1278=255=USD/JPY10=095

−−−−−−−−−−−−−−−−−−−−−−−−
1回目の要求(15:52:47.428)
続けざまに2回目の要求(15:52:47.434)
レート情報 35=X 
拒否メッセージ 35=Y を受信(281=1、58=Duplicate subscription request)したので
STOP メッセージを投げる(263=2)
だけど STOP が処理される前に送られた レート情報が届いてる 35=X


,鉢△隆屬 0.006 秒くらいかかってるな
やっぱり 0.001 秒毎に要求投げるなんで、今の仮想環境じゃ無理だわ


281 = 1 は Duplicate MarketDataRequestID - 要求IDが重複しとる
やっぱりエラーメッセージが違うけど、まぁ意味としては同じか
んー、仕様書間違ってるなぁ


ーーーーーーーーーーーーー
とりあえずここまで
長くなったのでつづきは次のエントリーで

 
まこ | FIX | 22:41 | comments(0) | trackbacks(0) |
Comment









Trackback
URL: