05
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
LATEST ENTRY
CATEGORY
ARCHIVE
PROFILE
SEARCH
RECENT COMMENT
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/05)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    まこ (05/05)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/04)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/03)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    まこ (05/03)
  • 【QUICKFIX】 FX自動売買への道 18 【通貨ペアの取得(SecurityListRequest)】
    ganponfx (05/03)
  • エクセルファイルのパスワードを忘れたら・・・
    里奈 (09/09)
  • 【QUICKFIX】 FX自動売買への道 27 【接続時の仕様】
    mrsg (07/29)
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(8) | trackbacks(0) |
スポンサーサイト
スポンサードリンク | - | 00:34 | - | - |
Comment
お世話になります!
お忙しいところコメント頂き
誠にありがとうございます。
断片的に学んでいるので、言っていただいたとおり基礎を固めたいと思います
ありがとうございます。

posted by ganponfx ,2018/05/05 10:16 PM

コンパイルに失敗しているので
実行ファイルが作られてなくて
実行できないのだと思います。

いろいろ落とし穴にはまっているようですね
C言語の基礎について解説しているサイトも多くありますので、まずは基礎固めしたほうが早道ではないでしょうか
#include の意味とか役割とか

私もその場その場でソースを書き替えてしまっているので、一貫性のない内容になっているのが悪いのですが

単純な注文だけを行えるソースを公開できるようにまとめてみますかね

posted by まこ ,2018/05/05 9:00 PM

何度も申し訳ございません
Application.h:118:16: note: void Application::SetMessageHeader(FIX::Message&, const char*)
の部分を
char→stringに変更しまして
エラーはなくなりましたが
最終的に
下記のエラーがでまして
実行ができなくなってしまいました。。。
もしよろしければ
アドバイスいただければありがたいです。何卒宜しくお願い致します。


TestRequest.o: In function `Application::TestRequest(std::string const&)':
/root/quickfix/examples/tradeclient/TestRequest.cpp:18: undefined reference to `Application::SetMessageHeader(FIX::Message&, std::string const&)'
OrderMassCancelRequest.o: In function `Application::OrderMassCancelRequest()':
/root/quickfix/examples/tradeclient/OrderMassCancelRequest.cpp:11: undefined reference to `Application::SetMessageHeader(FIX::Message&, std::string const&)'
NewOrderSingle.o: In function `Application::NewOrderSingle()':
/root/quickfix/examples/tradeclient/NewOrderSingle.cpp:11: undefined reference to `Application::SetMessageHeader(FIX::Message&, std::string const&)'
OrderCancelRequest.o: In function `Application::OrderCancelRequest()':
/root/quickfix/examples/tradeclient/OrderCancelRequest.cpp:11: undefined reference to `Application::SetMessageHeader(FIX::Message&, std::string const&)'
OrderCancelReplaceRequest.o: In function `Application::OrderCancelReplaceRequest()':
/root/quickfix/examples/tradeclient/OrderCancelReplaceRequest.cpp:11: undefined reference to `Application::SetMessageHeader(FIX::Message&, std::string const&)'
OrderStatusRequest.o:/root/quickfix/examples/tradeclient/OrderStatusRequest.cpp:11: more undefined references to `Application::SetMessageHeader(FIX::Message&, std::string const&)' follow
collect2: error: ld returned 1 exit status
make: *** [tradeclient] Error 1
[root@vultr tradeclient]# ./tradeclient/tradeclient tradeclient.cfg
-bash: ./tradeclient/tradeclient: No such file or directory
[root@vultr tradeclient]# cd ..
[root@vultr examples]# ./tradeclient/tradeclient tradeclient.cfg
-bash: ./tradeclient/tradeclient: No such file or directory

あともしよろしければなのですが、有償にてFIX接続についていろいろアドバイスしていただくとい

posted by ganponfx ,2018/05/04 1:22 PM

すみません
Application.cppの修正ができていないためと思います
そのまえに
TestRequest.cpp: In member function ‘void Application::TestRequest(const string&)’:
TestRequest.cpp:18:50: error: no matching function for call to ‘Application::SetMessageHeader(FIX44::TestRequest&, const string&)’
SetMessageHeader( message, sessionType );
^
TestRequest.cpp:18:50: note: candidate is:
In file included from TestRequest.cpp:7:0:
Application.h:118:16: note: void Application::SetMessageHeader(FIX::Message&, const char*)
void SetMessageHeader( FIX::Message&, const char* );
^
Application.h:118:16: note: no known conversion for argument 2 from ‘const string {aka const std::basic_string<char>}’ to ‘const char*’
At global scope:
cc1plus: warning: unrecognized command line option "-Wno-unused-command-line-argument" [enabled by default]
のエラー対処について
アドバイスいただければ幸いです
何卒宜しくお願い致します。

posted by ganponfx ,2018/05/04 12:52 PM

お世話になります。
度々申し訳ございません。
ご指摘の型を一致し修正しましてプログラム実行しようとしましたら
-bash: ./tradeclient/tradeclient: No such file or directory
のエラーがでて実行できなくなりました。。。。
原因としては
別コメントエラーなのか?と考えるところであります。
エラーの要因を修正しようと思っていますが
undefined reference to `Application::MySQLExec(std::string con
については
各TestRequest.cpp、SecurityList.cpp、SecurityListRequest.cppなどに
#include "Application.h"であるから

Application.h に
#include <MySQLConnect()>
#include <InitApp()>
とか
#include "quickfix/MySQLExec.h"
#include "InitApp.h"
記述しましたが
エラーになります。。。

undefined reference to `Application::YmdHMSs()
については
TestRequest(char const*)
のchar部分が
std::string YmdHMSs();と
型があってないからなのか?
しかしそれでは
SecurityListRequest()
はどうなるのか?

と試しましたが
またまたつまってしまい
コメントさせていただきました。。

もしよろしければ
大変恐縮ではございますが
アドバイスいただければ幸いです。
何卒宜しくお願い致します。

posted by ganponfx ,2018/05/04 11:56 AM

ありがとうございます!
お忙しいところすみません!

posted by ganponfx ,2018/05/03 9:12 PM

メッセージの通りですね

TestRequest.cpp と
Application.h で定義が違う

const char* と
const std::string& で違うってことですね

実際に使うのが string なのか char なのか、確認したらよろしいかと

posted by まこ ,2018/05/03 5:51 PM

TestRequest.cpp:12:14: error: prototype for ‘void Application::TestRequest(const char*)’ does not match any in class ‘Application’
void Application::TestRequest( const char* sessionType )
^
In file included from TestRequest.cpp:7:0:
Application.h:102:25: error: candidate is: void Application::TestRequest(const string&)
/* 1 */ void TestRequest(const std::string& );
^
cc1plus: warning: unrecognized command line option "-Wno-unused-command-line-argument" [enabled by default]

ブログ拝見させていただき
勉強になります!
ありがとうございます。

現在
証券会社からのテストを実行しているのですが
コンパイルエラーがでてつまってしまいました。。。

プログラム初心者で
初心者質問で大変申し訳ありません
もしよろしければアドバイスいただければ幸いです
よろしくお願いいたします

posted by ganponfx ,2018/05/03 11:57 AM










Trackback
URL: