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自動売買への道 19 【レート情報の取得(MarketDataRequest)】 | top | 【QUICKFIX】 FX自動売買への道 21 【レート情報の取得(MarketDataIncrementalRefresh)】 >>
【QUICKFIX】 FX自動売買への道 20 【レート要求情報の保存】
レート要求が通ったので、DB管理系を追加です。

※コンパイルバージョンについて追記(4/14)


■まずは管理用のテーブル作成
要求を格納しとく market_data_request を作成。
レート情報を現在取得中なのかという状態を保持できるようにしときます。
要求の ReqID は通貨ペア毎に1種類のみとしておきます。

    DROP TABLE IF EXISTS market_data_request;
    CREATE TABLE market_data_request
    (
      `ReqID`            VARCHAR(64)   NOT NULL                  COMMENT '262',
      `ReqType`          TINYINT(1)    NOT NULL                  COMMENT '263 1=Start,2=Stop',
      `Symbol`           VARCHAR(7)    NOT NULL                  COMMENT '55',
      `Depth`            TINYINT(1)    NOT NULL                  COMMENT '264 0=Full,1=Top',
      `Aggregate`        CHAR(1)       NULL                      COMMENT '266 N=Non,Y=Aggr',
      `EntryTypeSum`     TINYINT(1)    NOT NULL DEFAULT 0        COMMENT '267',    
      `RespDateTime`     CHAR(21)      NULL                      COMMENT '52',
      `Entries`          INT UNSIGNED  NULL                      COMMENT '268',
      `RejectReason`     INT UNSIGNED  NULL                      COMMENT '281',
      `RejectText`       VARCHAR(256)  NULL                      COMMENT '58',
      `StartTime`        DATETIME      NULL                      COMMENT '-- Start Subscription',
      `StopTime`         DATETIME      NULL                      COMMENT '-- Stop  Subscription',
      `Created_at`       DATETIME      NOT NULL  DEFAULT CURRENT_TIMESTAMP,
      `Updated_at`       DATETIME      NOT NULL  DEFAULT CURRENT_TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP,
      `Deleted_at`       DATETIME      NULL,
      PRIMARY KEY (`ReqID`),
      INDEX  `idxMDReq_Symbol`   (`Symbol`),
      INDEX  `idxMDReq_ReqID_Type` (`ReqID`, `ReqType`)
    ) ENGINE = InnoDB;



過去の確認も行えるように履歴テーブル market_data_request_hist も作成しときます。

    DROP TABLE IF EXISTS market_data_request_hist;
    CREATE TABLE market_data_request_hist
    (
      `id`               INT UNSIGNED  NOT NULL  AUTO_INCREMENT,
      `opeType`          CHAR(1)       NOT NULL                  COMMENT '-- I=Ins,U=Upd,D=Del',
      `ReqID`            VARCHAR(64)   NULL                      COMMENT '262',
      `ReqType`          TINYINT(1)    NULL                      COMMENT '263 1=Start,2=Stop',
      `Symbol`           VARCHAR(7)    NULL                      COMMENT '55',
      `Depth`            TINYINT(1)    NULL                      COMMENT '264 0=Full,1=Top',
      `Aggregate`        CHAR(1)       NULL                      COMMENT '266 N=Non,Y=Aggr',
      `EntryTypeSum`     TINYINT(1)    NULL                      COMMENT '267',
      `RespDateTime`     CHAR(21)      NULL                      COMMENT '52',
      `Entries`          INT UNSIGNED  NULL                      COMMENT '268',
      `RejectReason`     INT UNSIGNED  NULL                      COMMENT '281',
      `RejectText`       VARCHAR(256)  NULL                      COMMENT '58',
      `StartTime`        DATETIME      NULL                      COMMENT '-- Start Subscription',
      `StopTime`         DATETIME      NULL                      COMMENT '-- Stop  Subscription',
      `Created_at`       DATETIME      NOT NULL  DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE = InnoDB;




■履歴作成用トリガー作成
履歴テーブルにデータを転記するためのトリガーも作成
(Cプログラムから履歴追加してもよいけど..DB内部処理のトリガーのが、たぶん早いよね)
Insert、Update、Delete のそれぞれのタイミングで履歴を保存しときます。
MySQLって別々に作らなきゃならないんですねぇ。。不便。。
さらに、MySQL には Oracle みたいなトリガーの無効化ってまだないのね。
一時的にトリガー止めたいときは、トリガー削除?
やっぱり不便。。

    DROP TRIGGER IF EXISTS trg_af_i_market_data_request;
    DELIMITER //
    CREATE TRIGGER trg_af_i_market_data_request
      AFTER INSERT ON market_data_request FOR EACH ROW
    BEGIN
      INSERT INTO market_data_request_hist SET 
        `opeType`     = 'I'
      , `ReqID`       = NEW.`ReqID`       
      , `ReqType`     = NEW.`ReqType`     
      , `Symbol`      = NEW.`Symbol`      
      , `Depth`       = NEW.`Depth`       
      , `Aggregate`   = NEW.`Aggregate`   
      , `EntryTypeSum`= NEW.`EntryTypeSum`
      , `RespDateTime`= NEW.`RespDateTime`
      , `Entries`     = NEW.`Entries`     
      , `RejectReason`= NEW.`RejectReason`
      , `RejectText`  = NEW.`RejectText`  
      , `StartTime`   = NEW.`StartTime`   
      , `StopTime`    = NEW.`StopTime`    
      ;
    END;
    //
    DELIMITER ;

    DROP TRIGGER IF EXISTS trg_af_u_market_data_request;
    DELIMITER //
    CREATE TRIGGER trg_af_u_market_data_request
      AFTER UPDATE ON market_data_request FOR EACH ROW
    BEGIN
      INSERT INTO market_data_request_hist SET 
        `opeType`     = 'U'
      , `ReqID`       = NEW.`ReqID`       
      , `ReqType`     = NEW.`ReqType`     
      , `Symbol`      = NEW.`Symbol`      
      , `Depth`       = NEW.`Depth`       
      , `Aggregate`   = NEW.`Aggregate`   
      , `EntryTypeSum`= NEW.`EntryTypeSum`
      , `RespDateTime`= NEW.`RespDateTime`
      , `Entries`     = NEW.`Entries`     
      , `RejectReason`= NEW.`RejectReason`
      , `RejectText`  = NEW.`RejectText`  
      , `StartTime`   = NEW.`StartTime`   
      , `StopTime`    = NEW.`StopTime`    
      ;
    END;
    //
    DELIMITER ;

    DROP TRIGGER IF EXISTS trg_bf_d_market_data_request;
    DELIMITER //
    CREATE TRIGGER trg_bf_d_market_data_request
      BEFORE DELETE ON market_data_request FOR EACH ROW
    BEGIN
      INSERT INTO market_data_request_hist SET 
        `opeType`     = 'D'
      , `ReqID`       = OLD.`ReqID`       
      , `ReqType`     = OLD.`ReqType`     
      , `Symbol`      = OLD.`Symbol`      
      , `Depth`       = OLD.`Depth`       
      , `Aggregate`   = OLD.`Aggregate`   
      , `EntryTypeSum`= OLD.`EntryTypeSum`
      , `RespDateTime`= OLD.`RespDateTime`
      , `Entries`     = OLD.`Entries`     
      , `RejectReason`= OLD.`RejectReason`
      , `RejectText`  = OLD.`RejectText`  
      , `StartTime`   = OLD.`StartTime`   
      , `StopTime`    = OLD.`StopTime`    
      ;
    END;
    //
    DELIMITER ;



トリガーの作成確認
    SELECT `EVENT_OBJECT_TABLE`
         , `ACTION_TIMING`
         , `EVENT_MANIPULATION`
         , `TRIGGER_NAME`
      FROM `INFORMATION_SCHEMA`.`TRIGGERS`;
  
    +---------------------+---------------+--------------------+------------------------------+
    | EVENT_OBJECT_TABLE  | ACTION_TIMING | EVENT_MANIPULATION | TRIGGER_NAME                 |
    +---------------------+---------------+--------------------+------------------------------+
    | market_data_request | AFTER         | INSERT             | trg_af_i_market_data_request |
    | market_data_request | AFTER         | UPDATE             | trg_af_u_market_data_request |
    | market_data_request | BEFORE        | DELETE             | trg_bf_d_market_data_request |
    +---------------------+---------------+--------------------+------------------------------+
    3 rows in set (0.00 sec)

    mysql>



■レート要求時にDB保存処理を追加(MarketDataRequest.cpp)
初回はINSERT、2回目からはUPDATEになるように
「ON DUPLICATE KEY UPDATE」を使います。
INSERTをUPDATEっぽく書けるところは MySQL の良いところ

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

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

−−−−−−−−−−−−−−−−
★ について(4/14追記)
auto は C++11 から導入されたものなので GCC4.7 以上のバージョンが必要です。

コンパイルできない場合は
 $ gcc --version 
でバージョンを調べてみてください。

参考:
 C++ Standards Support in GCC
  https://gcc.gnu.org/projects/cxx-status.html#cxx11

 <!--:ja-->CentOS 6.4でC++11対応のg++ 4.7.2を使うためのメモ<!--:-->
  http://futurismo.biz/archives/1841





ヘッダーも追加
tradeclient]# vi Application.h
ーーーーーーーーーーーー抜粋ーーーーーーーーーーーーーーー

          /* V  */ void MarketDataRequest(const std::string&, int, const bool&, const FIX::SubscriptionRequestType& );
                   void InsertMarketDataRequest( const FIX::Message& );


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


■コンパイル&実行
tradeclient]# make
tradeclient]# cd ..
examples]# ./tradeclient/tradeclient tradeclient.cfg

        x) Security List Request

        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=20160411-12:53:39.13356=CAXDemo_Account_Str336=0340=210=076

        Logon - FIX.4.4:CAXDemo_Account_Trd->CNX

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160411-12:53:40.17056=CAXDemo_Account_Trd336=0340=210=054
★      Vj

        OUT: 8=FIX.4.49=15735=V34=249=CAXDemo_Account_Str52=20160411-12:54:00.10956=CNX146=155=USD/JPY262=USD/JPY263=1264=1265=1266=Y267=5269=0269=1269=7269=8269=910=200

        x) Security List Request

        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[323]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[3]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160411-12:54:00.210]]></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.07]]></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[1]]></field>
              <field number="278"><![CDATA[2]]></field>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="270"><![CDATA[108.077]]></field>
              <field number="271"><![CDATA[500000]]></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.077]]></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.07]]></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[0.7000]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[158]]></field>
          </trailer>
        </message>

〜〜省略〜〜

★      Vjq

        OUT: 8=FIX.4.49=13935=V34=349=CAXDemo_Account_Str52=20160411-12:54:04.52856=CNX146=155=USD/JPY262=USD/JPY263=2264=0265=1266=N267=2269=0269=110=127

        x) Security List Request

        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: Ve

        OUT: 8=FIX.4.49=15735=V34=449=CAXDemo_Account_Str52=20160411-12:54:20.71356=CNX146=155=EUR/USD262=EUR/USD263=1264=1265=1266=Y267=5269=0269=1269=7269=8269=910=191

        x) Security List Request

        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[327]]></field>
            <field number="35"><![CDATA[X]]></field>
            <field number="34"><![CDATA[8]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160411-12:54:20.815]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Str]]></field>
          </header>
          <body>
            <field number="262"><![CDATA[EUR/USD]]></field>
            <field number="268"><![CDATA[5]]></field>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[0]]></field>
              <field number="278"><![CDATA[6]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[1.14159]]></field>
              <field number="271"><![CDATA[5500000]]></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[7]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[1.14164]]></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[8]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[1.14164]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[8]]></field>
              <field number="278"><![CDATA[9]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[1.14159]]></field>
            </group>
            <group>
              <field number="279"><![CDATA[0]]></field>
              <field number="269"><![CDATA[9]]></field>
              <field number="278"><![CDATA[10]]></field>
              <field number="55"><![CDATA[EUR/USD]]></field>
              <field number="270"><![CDATA[0.5000]]></field>
            </group>
          </body>
          <trailer>
            <field number="10"><![CDATA[091]]></field>
          </trailer>
        </message>

        IN: 8=FIX.4.49=32735=X34=849=CNX52=20160411-12:54:20.81556=CAXDemo_Account_Str262=EUR/USD268=5279=0269=0278=655=EUR/USD270=1.14159271=5500000346=1279=0269=1278=755=EUR/USD270=1.14164271=1000000346=1279=0269=7278=855=EUR/USD270=1.14164279=0269=8278=955=EUR/USD270=1.14159279=0269=9278=1055=EUR/USD270=0.500010=091

〜〜省略〜〜

        Veq


−−−−
USD/JPY を要求して、停止
EUR/USD を要求して、停止
USD/JPY を要求して、停止
を実行してみた。
(長すぎるので画面表示内容は省略)


■DBの確認
examples]# mysql -uDBuser -pDBpass quickfix
mysql> select `ReqID`
          , `ReqType`
          , `Symbol`
          , `StartTime`
          , `StopTime`
          , `Created_at`
          , `Updated_at`
       from `market_data_request`;
    +---------+---------+---------+---------------------+---------------------+---------------------+---------------------+
    | ReqID   | ReqType | Symbol  | StartTime           | StopTime            | Created_at          | Updated_at          |
    +---------+---------+---------+---------------------+---------------------+---------------------+---------------------+
    | EUR/USD |       2 | EUR/USD | 2016-04-11 21:54:20 | 2016-04-11 21:54:23 | 2016-04-11 21:54:20 | 2016-04-11 21:54:23 |
    | USD/JPY |       2 | USD/JPY | 2016-04-11 21:54:33 | 2016-04-11 21:54:36 | 2016-04-11 21:54:00 | 2016-04-11 21:54:36 |
    +---------+---------+---------+---------------------+---------------------+---------------------+---------------------+
    2 rows in set (0.00 sec)



mysql>


履歴の確認
mysql> select
      `id`
    , `OpeType`
    , `ReqID`
    , `ReqType`
    , `Symbol`
    , `StartTime`
    , `StopTime`
    , `Created_at`
       from `market_data_request_hist`;
    +----+---------+---------+---------+---------+---------------------+---------------------+---------------------+
    | id | OpeType | ReqID   | ReqType | Symbol  | StartTime           | StopTime            | Created_at          |
    +----+---------+---------+---------+---------+---------------------+---------------------+---------------------+
    |  1 | I       | USD/JPY |       1 | USD/JPY | 2016-04-11 21:54:00 | NULL                | 2016-04-11 21:54:00 |
    |  2 | U       | USD/JPY |       2 | USD/JPY | 2016-04-11 21:54:00 | 2016-04-11 21:54:04 | 2016-04-11 21:54:04 |
    |  3 | I       | EUR/USD |       1 | EUR/USD | 2016-04-11 21:54:20 | NULL                | 2016-04-11 21:54:20 |
    |  4 | U       | EUR/USD |       2 | EUR/USD | 2016-04-11 21:54:20 | 2016-04-11 21:54:23 | 2016-04-11 21:54:23 |
    |  5 | U       | USD/JPY |       1 | USD/JPY | 2016-04-11 21:54:33 | NULL                | 2016-04-11 21:54:33 |
    |  6 | U       | USD/JPY |       2 | USD/JPY | 2016-04-11 21:54:33 | 2016-04-11 21:54:36 | 2016-04-11 21:54:36 |
    +----+---------+---------+---------+---------+---------------------+---------------------+---------------------+
    6 rows in set (0.00 sec)


mysql>

履歴は 
 USD/JPY Insert → Update
 EUR/USD Insert → Update
 USD/JPY Update → Update

と、操作したとおりに記録されてます。

レート情報の要求管理テーブルも完成です。

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









Trackback
URL: