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自動売買への道 17 【通信系の試験(準正常系)】 | top | 【QUICKFIX】 FX自動売買への道 19 【レート情報の取得(MarketDataRequest)】 >>
【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
通信系の試験も終わったので、情報系の処理を粛々と作っていきましょ


 
まずは、利用可能な通貨ペアを取り出す < x > SecurityListRequest と、
その応答である < y > SecurityList を作りこみます。

。。なんでSecurityList なんだろう。。

要求を投げた時にIDをDBへ記録しておいて、応答が来たら応答ステータスを更新。
利用可能通貨ペアとその小数点桁数を保存するようにしときます。


■まずはテーブルの作成
要求の security_list_request と
通貨ペアの security_list の2テーブルを作っときます。
各カラムには対応するメッセージフィールドIDをコメントとしてつけときましょう。
WEBからの操作も考えてるので、まぁ Created_at とかもつけときます。

        DROP TABLE IF EXISTS security_list_request;
        CREATE TABLE security_list_request 
        (
          `ReqID`            VARCHAR(64)   NOT NULL                  COMMENT '320',
          `RespDateTime`     VARCHAR(22)   NULL                      COMMENT '52',
          `RespID`           VARCHAR(64)   NULL                      COMMENT '322',
          `Result`           INT           NULL                      COMMENT '560',
          `SymbolCount`      INT           NULL                      COMMENT '140',
          `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`)
        ) ENGINE = InnoDB;


        DROP TABLE IF EXISTS security_list;
        CREATE TABLE security_list
        (
          `Symbol`           VARCHAR(7)    NOT NULL                  COMMENT '55',
          `DecPlaces_Str`    INT UNSIGNED  NOT NULL  DEFAULT 0       COMMENT '871=16, 872',
          `DecPlaces_Forex`  INT UNSIGNED  NOT NULL  DEFAULT 0       COMMENT '871=18, 872',
          `ReqID`            VARCHAR(64)   NOT NULL                  COMMENT '320',
          `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 (`Symbol`)
        ) ENGINE = InnoDB;




■要求 < x > SecurityListRequest の作成
では要求処理をば
メッセージを組み立てた後、Insert 処理してから 送信してます。

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

        /* < x > */
        void Application::SecurityListRequest()

        {
          FIX44::SecurityListRequest message(
          /* 320  */ FIX::SecurityReqID( "SecListReq_" + YmdHMSs() ),
          /* 559  */ FIX::SecurityListRequestType( FIX::SecurityListRequestType_SYMBOL /* 0 */ )
          );

          InsertSecurityListRequest( message );

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

        void Application::InsertSecurityListRequest( const FIX::Message& message )
        {
          /* 320  */ FIX::FieldBase reqID(FIX::FIELD::SecurityReqID, "0");
          message.getFieldIfSet(reqID);

          /** insert **/
          std::ostringstream s;
          s <<  "INSERT INTO `security_list_request` " <<
            "( " <<
              " `ReqID`"    <<
            ") VALUES ("     <<
              " '" << reqID << "'" <<
            ") ON DUPLICATE KEY UPDATE ";

          MySQLExec( s.str() );
        }




■受信 < y > SecurityList の作成
んで受信処理を
受け取ったメッセージをDBに保存しているだけですが、メッセージが入れ子になってるのでちょい長くなってます。

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

        /* < y > */
        void Application::onMessage( const FIX44::SecurityList& message, const FIX::SessionID& sessionID )

        {
          /* debug */
          const FIX::Dictionary& dic = m_settings.get( sessionID );
          if (dic.has("Debug_y_SecurityList"))
            std::cout << message.toXML() << std::endl;

          /* init message data */
          /* 52   */ FIX::FieldBase respDateTime(FIX::FIELD::SendingTime, "");
          /* 320  */ FIX::FieldBase reqID(FIX::FIELD::SecurityReqID, "0");
          /* 322  */ FIX::FieldBase respID(FIX::FIELD::SecurityResponseID, "0");
          /* 560  */ FIX::FieldBase result(FIX::FIELD::SecurityRequestResult, "0");
          /* 146  */ FIX::FieldBase symbolCount(FIX::FIELD::NoRelatedSym, "0");

          /* get message data */
          /* 52  */ message.getHeader().getFieldIfSet(respDateTime);
          /* 320 */ message.getFieldIfSet(reqID);
          /* 322 */ message.getFieldIfSet(respID);
          /* 560 */ message.getFieldIfSet(result);
          /* 146 */ message.getFieldIfSet(symbolCount);

          /* Insert Security List */
          std::ostringstream s;
          s <<  "INSERT INTO `security_list_request` " <<
 
           "( " <<
              " `ReqID`"    <<
              ",`RespDateTime` "<<
              ",`RespID` "<<
              ",`Result` "<<
              ",`SymbolCount` "<<
            ") VALUES ("     <<
              " '" << reqID << "'" <<
              ",'" << respDateTime << "'" <<
              ",'" << respID << "'" <<
              ",'" << result << "'" <<
              ",'" << symbolCount << "'" <<
            ") ON DUPLICATE KEY UPDATE " <<
              " `RespDateTime` = VALUES(`RespDateTime`) " <<
              ",`RespID`       = VALUES(`RespID`)       " <<
              ",`Result`       = VALUES(`Result`)       " <<
              ",`SymbolCount`  = VALUES(`SymbolCount`)  ";
          MySQLExec( s.str() );

          /* debug */
          if (dic.has("Debug_y_SecurityList"))
            std::cout << "SQL1(SecurityListRequest) : " << std::endl << s.str() << std::endl;

          /* Insert security list :: Currency Pair Symbol - Decimal Places  */
          char sep = ' ';
          std::ostringstream s2;
          s2 <<  "INSERT INTO `security_list` " <<
 
         "( " <<
            " `Symbol` " <<
            ",`DecPlaces_Str` " <<
            ",`DecPlaces_Forex` " <<
            ",`ReqID` " <<
          ") VALUES ";

          /* Loop: Currency Pair */
          for( int i=1; i <= std::stoi(symbolCount.getString()); i++ )
          {
            /* 146  */ FIX44::SecurityList::NoRelatedSym r;
            message.getGroup(i, r);

            /* 55   */ FIX::FieldBase symbol(FIX::FIELD::Symbol, "NA");
            /* 870  */ FIX::FieldBase attrCount(FIX::FIELD::NoInstrAttrib, "0");
            /* 872  */ FIX::FieldBase value_str(FIX::FIELD::InstrAttribValue, "0");
            /* 872  */ FIX::FieldBase value_forex(FIX::FIELD::InstrAttribValue, "0");
            r.getFieldIfSet(symbol);
            r.getFieldIfSet(attrCount);

            /* Loop: Attribute - Decimal Places Type */
            for( int j=1; j <= std::stoi(attrCount.getString()); j++ )
            {
              /* 870  */ FIX::Group g(FIX::FIELD::NoInstrAttrib
                                     ,FIX::FIELD::InstrAttribType
                                     ,FIX::message_order(FIX::FIELD::InstrAttribType
                                                        ,FIX::FIELD::InstrAttribValue));
              /* 871  */ FIX::FieldBase type(FIX::FIELD::InstrAttribType, "0");
              r.getGroup(j, g);
              g.getFieldIfSet(type);
              if( type.getString() == "16" ) g.getFieldIfSet(value_str);
              if( type.getString() == "18" ) g.getFieldIfSet(value_forex);
            }

            /* Insert security list :: Currency Pair Symbol - Decimal Places  */
            s2 << sep << " (" <<
              " '" << symbol << "'" <<
              ",'" << value_str << "'" <<
              ",'" << value_forex << "'" <<
              ",'" << reqID << "'" <<
            ")";
            sep = ',';
          }

          /* Insert security list :: Currency Pair Symbol - Decimal Places  */
          s2 << " ON DUPLICATE KEY UPDATE " <<
            " `DecPlaces_Str`   = VALUES(`DecPlaces_Str`)   " <<
            ",`DecPlaces_Forex` = VALUES(`DecPlaces_Forex`) " <<
            ",`ReqID`           = VALUES(`ReqID`)           ";
          MySQLExec( s2.str() );

          /* debug */
          if (dic.has("Debug_y_SecurityList"))
            std::cout << "SQL2(SecurityList) : " << std::endl << s2.str() << std::endl;

        }



■操作メニューの追加(Application.cpp)
とりあえずは実験のために任意のタイミングで通貨ペアとれるようにメニューを追加しときます。
ついでにいろいろ効率化もしときますよ。
tradeclient]# cat Application.cpp
        #include "config.h"
        #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 )
        {
          crack( message, sessionID );
          std::cout << std::endl << "IN: " << message << std::endl;
        }

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

          if (FIX::MsgType_TestRequest == message.getHeader().getField(FIX::FIELD::MsgType))
            InsertTestRequest( message );
        }

        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()
        {
          std::cout << "AccountID : " << m_accountID << std::endl;
          std::cout << "PartyID   : " << m_partyID << std::endl;
          std::cout << "TargetID  : " << m_targetcompID << std::endl;
          std::cout << "Trade     : " << m_sendercomp_tradeID << std::endl;
          std::cout << "Ratefeed  : " << m_sendercomp_ratefeedID << std::endl;

          while ( true )
          {
            try
            {
              std::string action;
              std::cout << std::endl
                << "x) Security List Request"                   << 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 == "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();
            }
          }
        }

        void Application::InitApp()
        {
          const FIX::Dictionary dic = m_settings.get();
          if (dic.has("AccountID")) m_accountID = dic.getString("AccountID");
          if (dic.has("PartyID")) m_partyID = dic.getString("PartyID");
          if (dic.has("TargetCompID")) m_targetcompID = dic.getString("TargetCompID");

          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") == SessionTypeTrade)
              m_sendercomp_tradeID = dic.getString("SenderCompID");

            if (dic.getString("SessionType") == SessionTypeRatefeed)
              m_sendercomp_ratefeedID = dic.getString("SenderCompID");
          }
        }

        void Application::MySQLConnect()
        {
          std::string database = FIX::MySQLStoreFactory::DEFAULT_DATABASE;
          std::string password = FIX::MySQLStoreFactory::DEFAULT_PASSWORD;
          std::string user = FIX::MySQLStoreFactory::DEFAULT_USER;
          std::string host = FIX::MySQLStoreFactory::DEFAULT_HOST;
          short port = FIX::MySQLStoreFactory::DEFAULT_PORT;

          const FIX::Dictionary dic = m_settings.get();
          if (dic.has("MySQLStoreDatabase")) database = dic.getString("MySQLStoreDatabase");
          if (dic.has("MySQLStorePassword")) password = dic.getString("MySQLStorePassword");
          if (dic.has("MySQLStoreUser")) user = dic.getString("MySQLStoreUser");
          if (dic.has("MySQLStoreHost")) host = dic.getString("MySQLStoreHost");
          if (dic.has("MySQLStorePort")) port = dic.getInt("MySQLStorePort");

          m_sql = new  FIX::MySQLConnection( database, user, password, host, port );
        }

        FIX::MySQLQuery Application::MySQLExec( const std::string& q )
        {
          FIX::MySQLQuery query( q );
          if( !m_sql->execute(query))
          {
            syslog(LOG_ALERT, "SQL Error: %s", query.reason().c_str());
            syslog(LOG_ALERT, "SQL : %s", q.c_str());
          }
          return query;
        }

        std::string Application::YmdHMSs()
        {
          FIX::UtcTimeStamp time;
          int year, month, day, hour, minute, second, millis;
          time.getYMD( year, month, day );
          time.getHMS( hour, minute, second, millis );
          char tm[ 20 ];
          // YYYYmmdd-HHMMSS.sss
          // 1234567890123456789
          STRING_SPRINTF( tm, "%04d%02d%02d-%02d%02d%02d.%03d", year, month, day, hour, minute, second, millis );
          return tm;
        }


■ヘッダーファイルも修正(Application.h)
tradeclient]# vi Application.h
        #ifndef TRADECLIENT_APPLICATION_H
        #define TRADECLIENT_APPLICATION_H

        #include "quickfix/Application.h"
        #include "quickfix/MessageCracker.h"
        #include "quickfix/MySQLConnection.h"
        #include "quickfix/MySQLStore.h"
        #include "quickfix/Values.h"
        #include "quickfix/Mutex.h"

        #include "quickfix/fix44/TestRequest.h"                     // < 1 >
        #include "quickfix/fix44/OrderMassCancelRequest.h"          // < q >
        #include "quickfix/fix44/SecurityListRequest.h"             // < x >
        #include "quickfix/fix44/NewOrderSingle.h"                  // < D >
        #include "quickfix/fix44/OrderCancelRequest.h"              // < F >
        #include "quickfix/fix44/OrderCancelReplaceRequest.h"       // < G >
        #include "quickfix/fix44/OrderStatusRequest.h"              // < H >
        #include "quickfix/fix44/MarketDataRequest.h"               // < V >
        #include "quickfix/fix44/OrderMassStatusRequest.h"          // < AF >
        #include "quickfix/fix44/RequestForPositions.h"             // < AN >

        #include "quickfix/fix44/ResendRequest.h"                   // < 2 >
        #include "quickfix/fix44/Reject.h"                          // < 3 >
        #include "quickfix/fix44/SequenceReset.h"                   // < 4 >
        #include "quickfix/fix44/ExecutionReport.h"                 // < 8 >
        #include "quickfix/fix44/OrderCancelReject.h"               // < 9 >
        #include "quickfix/fix44/TradingSessionStatus.h"            // < h >
        #include "quickfix/fix44/BusinessMessageReject.h"           // < j >
        #include "quickfix/fix44/OrderMassCancelReport.h"           // < r >
        #include "quickfix/fix44/SecurityList.h"                    // < y >
        #include "quickfix/fix44/Email.h"                           // < C >
        #include "quickfix/fix44/ListStatus.h"                      // < N >
        #include "quickfix/fix44/MarketDataIncrementalRefresh.h"    // < X >
        #include "quickfix/fix44/MarketDataRequestReject.h"         // < Y >
        #include "quickfix/fix44/RequestForPositionsAck.h"          // < AO >
        #include "quickfix/fix44/PositionReport.h"                  // < AP >
        #include "quickfix/fix44/CollateralResponse.h"              // < AZ >
        #include "quickfix/fix44/CollateralReport.h"                // < BA >
                                                                    // CG
                                                                    // PU

        #include <queue>
        #include <syslog.h>

        const char SessionTypeTrade[] = "Trade";
        const char SessionTypeRatefeed[] = "Ratefeed";

        class Application :
              public FIX::Application,
              public FIX::MessageCracker
        {
        public:
          Application( const FIX::SessionSettings& settings )
          : m_settings( settings )
          { openlog("QuickFIX", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER);
            MySQLConnect();
            InitApp();
          }

          ~Application()
          { if (m_sql) delete m_sql; }

          void run();

        private:
          FIX::SessionSettings m_settings;
          FIX::MySQLConnection *m_sql;
          std::string m_accountID;
          std::string m_partyID;
          std::string m_sendercomp_tradeID;
          std::string m_sendercomp_ratefeedID;
          std::string m_targetcompID;

          void onCreate( const FIX::SessionID& ) {}
          void onLogon( const FIX::SessionID& sessionID );
          void onLogout( const FIX::SessionID& sessionID );
          void toAdmin( FIX::Message&, const FIX::SessionID& );
          void toApp( FIX::Message&, const FIX::SessionID& )
          throw( FIX::DoNotSend );
          void fromAdmin( const FIX::Message&, const FIX::SessionID& )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::RejectLogon ) {}
          void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
          throw( FIX::FieldNotFound, FIX::IncorrectDataFormat, FIX::IncorrectTagValue, FIX::UnsupportedMessageType );

          /* 8  */ void onMessage( const FIX44::ExecutionReport&,              const FIX::SessionID& );
          /* 9  */ void onMessage( const FIX44::OrderCancelReject&,            const FIX::SessionID& );
          /* h  */ void onMessage( const FIX44::TradingSessionStatus&,         const FIX::SessionID& );
          /* j  */ void onMessage( const FIX44::BusinessMessageReject&,        const FIX::SessionID& );
          /* r  */ void onMessage( const FIX44::OrderMassCancelReport&,        const FIX::SessionID& );
          /* y  */ void onMessage( const FIX44::SecurityList&,                 const FIX::SessionID& );
          /* C  */ void onMessage( const FIX44::Email&,                        const FIX::SessionID& );
          /* N  */ void onMessage( const FIX44::ListStatus&,                   const FIX::SessionID& );
          /* X  */ void onMessage( const FIX44::MarketDataIncrementalRefresh&, const FIX::SessionID& );
          /* Y  */ void onMessage( const FIX44::MarketDataRequestReject&,      const FIX::SessionID& );
          /* AO */ void onMessage( const FIX44::RequestForPositionsAck&,       const FIX::SessionID& );
          /* AP */ void onMessage( const FIX44::PositionReport&,               const FIX::SessionID& );
          /* AZ */ void onMessage( const FIX44::CollateralResponse&,           const FIX::SessionID& );
          /* BA */ void onMessage( const FIX44::CollateralReport&,             const FIX::SessionID& );
          // CG
          // PU

          /* 1  */ void TestRequest(const std::string& );
                   void InsertTestRequest( const FIX::Message& );
          /* q  */ void OrderMassCancelRequest();
          /* x  */ void SecurityListRequest();
                   void InsertSecurityListRequest( const FIX::Message& );
          /* D  */ void NewOrderSingle();
          /* F  */ void OrderCancelRequest();
          /* G  */ void OrderCancelReplaceRequest();
          /* H  */ void OrderStatusRequest();
          /* V  */ void MarketDataRequest(const std::string&, const FIX::SubscriptionRequestType& );
          /* AF */ void OrderMassStatusRequest();
          /* AN */ void RequestForPositions( const std::string& clearingBusinessDate = "" );

          std::string YmdHMSs();
          void InitApp();
          void SendToTarget( FIX::Message&, const char* );
          void SetMessageHeader( FIX::Message&, const char* );
          void MySQLConnect();
          FIX::MySQLQuery MySQLExec( const std::string& );
        };

        #endif



■コンパイル&実行
tradeclient]# make
tradeclient]# cd ..
examples]# ./tradeclient/tradeclient  tradeclient.cfg
        AccountID : CAXDemo_Account
        PartyID   : CAXDemo_Account
        TargetID  : CNX
        Trade     : CAXDemo_Account_Trd
        Ratefeed  : CAXDemo_Account_Str

        x) Security List Request

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

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

        Logon - FIX.4.4:CAXDemo_Account_Str->CNX

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160404-15:28:35.88956=CAXDemo_Account_Str336=0340=210=097

        IN: 8=FIX.4.49=8035=h34=249=CNX52=20160404-15:28:35.88356=CAXDemo_Account_Trd336=0340=210=076
        x

        OUT: 8=FIX.4.49=10935=x34=249=CAXDemo_Account_Trd52=20160404-15:28:43.52156=CNX320=SecListReq_20160404-152843.515559=010=081

        x) Security List Request

        test1) TestRequest Trade
        test2) TestRequest Ratefeed

        q) Quit
        Action: <message>
          <header>
            <field number="8"><![CDATA[FIX.4.4]]></field>
            <field number="9"><![CDATA[939]]></field>
            <field number="35"><![CDATA[y]]></field>
            <field number="34"><![CDATA[3]]></field>
            <field number="49"><![CDATA[CNX]]></field>
            <field number="52"><![CDATA[20160404-15:28:43.608]]></field>
            <field number="56"><![CDATA[CAXDemo_Account_Trd]]></field>
          </header>
          <body>
            <field number="146"><![CDATA[19]]></field>
            <field number="320"><![CDATA[SecListReq_20160404-152843.515]]></field>
            <field number="322"><![CDATA[1]]></field>
            <field number="560"><![CDATA[0]]></field>
            <group>
              <field number="55"><![CDATA[USD/JPY]]></field>
              <field number="870"><![CDATA[2]]></field>
              <group>
                <field number="871"><![CDATA[18]]></field>
                <field number="872"><![CDATA[2]]></field>
              </group>
              <group>
                <field number="871"><![CDATA[16]]></field>
                <field number="872"><![CDATA[2]]></field>
              </group>
            </group>
 〜〜省略〜〜
          </body>
          <trailer>
            <field number="10"><![CDATA[144]]></field>
          </trailer>
        </message>
        SQL1(SecurityListRequest) :
        INSERT INTO `security_list_request` (  `ReqID`,`RespDateTime` ,`RespID` ,`Result` ,`SymbolCount` ) VALUES ( 'SecListReq_20160404-152843.515','20160404-15:28:43.608','1','0','19') ON DUPLICATE KEY UPDATE  `RespDateTime` = VALUES(`RespDateTime`) ,`RespID`       = VALUES(`RespID`)       ,`Result`       = VALUES(`Result`)       ,`SymbolCount`  = VALUES(`SymbolCount`)

        SQL2(SecurityList) :
        INSERT INTO `security_list` (  `Symbol` ,`DecPlaces_Str` ,`DecPlaces_Forex` ,`ReqID` ) VALUES   ( 'USD/JPY','2','2','SecListReq_20160404-152843.515'), ( 'AUD/CHF','4','4','SecListReq_20160404-152843.515'), ( 'USD/CHF','4','4','SecListReq_20160404-152843.515'), ( 'AUD/USD','4','4','SecListReq_20160404-152843.515'), ( 'EUR/CHF','4','4','SecListReq_20160404-152843.515'), ( 'EUR/AUD','4','4','SecListReq_20160404-152843.515'), ( 'EUR/GBP','4','4','SecListReq_20160404-152843.515'), ( 'EUR/JPY','2','2','SecListReq_20160404-152843.515'), ( 'EUR/USD','4','4','SecListReq_20160404-152843.515'), ( 'GBP/USD','4','4','SecListReq_20160404-152843.515'), ( 'ZAR/JPY','2','2','SecListReq_20160404-152843.515'), ( 'NZD/USD','4','4','SecListReq_20160404-152843.515'), ( 'GBP/CHF','4','4','SecListReq_20160404-152843.515'), ( 'CHF/JPY','2','2','SecListReq_20160404-152843.515'), ( 'CAD/CHF','4','4','SecListReq_20160404-152843.515'), ( 'GBP/JPY','2','2','SecListReq_20160404-152843.515'), ( 'AUD/JPY','2','2','SecListReq_20160404-152843.515'), ( 'CAD/JPY','2','2','SecListReq_20160404-152843.515'), ( 'NZD/JPY','2','2','SecListReq_20160404-152843.515') ON DUPLICATE KEY UPDATE  `DecPlaces_Str`   = VALUES(`DecPlaces_Str`)   ,`DecPlaces_Forex` = VALUES(`DecPlaces_Forex`) ,`ReqID`           = VALUES(`ReqID`)


        IN: 8=FIX.4.49=93935=y34=349=CNX52=20160404-15:28:43.60856=CAXDemo_Account_Trd146=1955=USD/JPY870=2871=18872=2871=16872=255=AUD/CHF870=2871=18872=4871=16872=455=USD/CHF870=2871=18872=4871=16872=455=AUD/USD870=2871=18872=4871=16872=455=EUR/CHF870=2871=18872=4871=16872=455=EUR/AUD870=2871=18872=4871=16872=455=EUR/GBP870=2871=18872=4871=16872=455=EUR/JPY870=2871=18872=2871=16872=255=EUR/USD870=2871=18872=4871=16872=455=GBP/USD870=2871=18872=4871=16872=455=ZAR/JPY870=2871=18872=2871=16872=255=NZD/USD870=2871=18872=4871=16872=455=GBP/CHF870=2871=18872=4871=16872=455=CHF/JPY870=2871=18872=2871=16872=255=CAD/CHF870=2871=18872=4871=16872=455=GBP/JPY870=2871=18872=2871=16872=255=AUD/JPY870=2871=18872=2871=16872=255=CAD/JPY870=2871=18872=2871=16872=255=NZD/JPY870=2871=18872=2871=16872=2320=SecListReq_20160404-152843.515322=1560=010=144
        q

        Logout - FIX.4.4:CAXDemo_Account_Str->CNX

        Logout - FIX.4.4:CAXDemo_Account_Trd->CNX



−−−−−−
まぁちゃんと動いているかな


DBは。。ちゃんと入ってるかな
−−−−−−
mysql>
mysql> select * from security_list_request;
+--------------------------------+-----------------------+--------+--------+-------------+---------------------+---------------------+------------+
| ReqID                          | RespDateTime          | RespID | Result | SymbolCount | Created_at          | Updated_at          | Deleted_at |
+--------------------------------+-----------------------+--------+--------+-------------+---------------------+---------------------+------------+
| SecListReq_20160404-152843.515 | 20160404-15:28:43.608 | 1      |      0 |          19 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
+--------------------------------+-----------------------+--------+--------+-------------+---------------------+---------------------+------------+
1 row in set (0.00 sec)


mysql>
mysql> select * from security_list;
+---------+---------------+-----------------+--------------------------------+---------------------+---------------------+------------+
| Symbol  | DecPlaces_Str | DecPlaces_Forex | ReqID                          | Created_at          | Updated_at          | Deleted_at |
+---------+---------------+-----------------+--------------------------------+---------------------+---------------------+------------+
| AUD/CHF |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| AUD/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| AUD/USD |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| CAD/CHF |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| CAD/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| CHF/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| EUR/AUD |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| EUR/CHF |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| EUR/GBP |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| EUR/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| EUR/USD |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| GBP/CHF |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| GBP/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| GBP/USD |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| NZD/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| NZD/USD |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| USD/CHF |             4 |               4 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| USD/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
| ZAR/JPY |             2 |               2 | SecListReq_20160404-152843.515 | 2016-04-05 00:28:43 | 2016-04-05 00:28:43 | NULL       |
+---------+---------------+-----------------+--------------------------------+---------------------+---------------------+------------+

19 rows in set (0.00 sec)

mysql>






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









Trackback
URL: