<前 【QuickFIX】01 サンプルのコンパイル
次> 【QuickFIX】03 送受信ログをMySQLに保存
ログイン時の toAdmin メッセージにパスワード(554)を追加して送信します
パスワードは設定ファイルから取得
##クライアントソースファイル
#include "config.h"
#include "quickfix/FileStore.h"
#include "quickfix/SocketInitiator.h"
#include "quickfix/SessionSettings.h"
#include "quickfix/Log.h"
#include "Application.h"
#include <string>
#include <iostream>
#include <fstream>
#include "../../src/getopt-repl.h"
int main( int argc, char** argv )
{
if ( argc != 2 )
{
std::cout << "usage: " << argv[ 0 ]
<< " FILE." << std::endl;
return 0;
}
std::string file = argv[ 1 ];
try
{
FIX::SessionSettings settings( file );
★ Application application( settings );
FIX::FileStoreFactory storeFactory( settings );
FIX::ScreenLogFactory logFactory( settings );
FIX::SocketInitiator initiator( application, storeFactory, settings, logFactory );
initiator.start();
application.run();
initiator.stop();
return 0;
}
catch ( std::exception & e )
{
std::cout << e.what();
return 1;
}
}
Application application の引数に読み込んだ設定情報(settings)を追加
他、余分なところはバッサリ削除
##Applicationヘッダーファイル
#ifndef TRADECLIENT_APPLICATION_H
#define TRADECLIENT_APPLICATION_H
#include "quickfix/Application.h"
#include "quickfix/MessageCracker.h"
#include "quickfix/Values.h"
#include "quickfix/Mutex.h"
#include <queue>
class Application :
public FIX::Application,
public FIX::MessageCracker
{
public:
★ Application( const FIX::SessionSettings& settings )
★ : m_settings( settings ) {}
void run();
private:
★ FIX::SessionSettings m_settings;
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 );
};
#endif
設定情報を受け取れるように変更
あとはパスワードを送信するための toAdminの実体書くために {} を削除しました
んで、不要部分はバッサリ削除
##Applicationソースファイル
#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")));
★ }
★ }
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()
{
while ( true )
{
try
{
★ std::string action;
★ std::cout << std::endl
★ << "quit) Quit" << std::endl
★ << "Action: ";
★ std::cin >> action;
★
★ if ( action == "quit" )
★ break;
}
catch ( std::exception & e )
{
std::cout << "Message Not Sent: " << e.what();
}
}
}
toAdmin の実体を追記
パスワードは設定ファイルから取り出して送信メッセージに含めるようにしてます
ついでに不要部分をバッサリ削除して、削除した影響で run の中身も変えてます
##コンパイル
tradeclient]$ make clean
tradeclient]$ make
エラーが出ないこと
正常にコンパイルできること
##設定ファイルにユーザとパスワードを設定
レート情報取得用のユーザと、発注やら口座情報取得やらの取引用のユーザをそれぞれ追加しときます
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
FileStorePath=store
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=FIX44.xml
HttpAcceptPort=9911
ValidateUserDefinedFields=N
ResetOnLogout=Y
ResetOnLogon=Y
[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Trd
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Trade
[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Str
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Ratefeed
##vimの着色
余談ですがvimで開発するときの着色設定
使える設定ファイルの確認
$ ls /usr/share/vim/vim74/colors/
README.txt darkblue.vim delek.vim elflord.vim koehler.vim murphy.vim peachpuff.vim shine.vim torte.vim
blue.vim default.vim desert.vim evening.vim morning.vim pablo.vim ron.vim slate.vim zellner.vim
環境によって違うと思います
これを利用する設定
:colorscheme delek
<前 【QuickFIX】01 サンプルのコンパイル
次> 【QuickFIX】03 送受信ログをMySQLに保存
一覧
01 サンプルのコンパイル
02 ログイン時にPassword(554)を送信
03 送受信ログをMySQLに保存
04 情報保存用にMySQLコネクションを保持..他
05 各種メッセージの枠を作成
06 独自メッセージ仕様
07 セッション開始 TradingSessionStatus
08 通貨ペア要求 SecurityListRequest
09 通貨ペア取得 SecurityList
10 デモ環境サーバへ接続
11 ログ出力設定
12 マーケット情報要求 < V > MarketDataRequest
13 マーケット情報受信 < X > MarketDataIncrementalRefresh
14 口座情報要求 < AN > RequestForPositions
15 口座情報取得 < AZ > CollateralResponse