【QuickFIX】01 サンプルのコンパイル

次＞ [【QuickFIX】02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)

FIXプロトコルのFIX4.4に準拠したプログラムを開発です。
フリーのFIXライブラリ？ QuickFIX を利用してみます。

C++からMySQLに接続したり
QuickFIXクライアントからCurrenexのサーバに接続したりして
取引したり口座情報を取得したりしてみます。


##コンパイル環境準備
```
$ sudo yum install -y \
gcc-c++       \
automake      \
autoconf      \
libtool       \
libxml2       \
libxml2-devel \
mysql-devel   \
libxslt       \
psmisc        \
swatch        \
ruby-devel
```

##QuickFIXを拾ってきて
```
$ git clone  http://github.com/quickfix/quickfix.git
```

##コンパイル
```
~]$ cd quickfix/
quickfix]$ ./bootstrap
quickfix]$ ./configure --with-mysql
quickfix]$ make
```


##データベース準備(DB,ユーザ,権限）
コンパイルが通ったらテストのためのデータベースを準備します
（ with-mysql のため ）

```
$ mysql -u root -p
mysql> CREATE DATABASE  Quick;
mysql> CREATE USER  QuickUSER@localhost IDENTIFIED BY 'QuickPASS';
mysql> GRANT ALL PRIVILEGES on Quick.* to QuickUSER@localhost;
mysql> quit
```

### メモ：MySQL8 の場合は以下
```
$ mysql -u root -p
mysql> SET GLOBAL validate_password.length=4;
mysql> SET GLOBAL validate_password.mixed_case_count=0;
mysql> SET GLOBAL validate_password.number_count=0;
mysql> SET GLOBAL validate_password.special_char_count=0;
mysql> SET GLOBAL validate_password.policy=LOW;

mysql> show variables like '%validate_password%';

mysql> CREATE DATABASE  Quick;
mysql> CREATE USER  QuickUSER@localhost IDENTIFIED WITH mysql_native_password BY 'QuickPASS';
mysql> GRANT ALL PRIVILEGES on Quick.* to QuickUSER@localhost;


mysql> select user, host, plugin  from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| QuickUSER        | localhost | mysql_native_password |


mysql> quit
```


##データベース接続確認
```
$ mysql -u QuickUSER -p Quick
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Quick              |
+--------------------+
2 rows in set (0.00 sec)

mysql> quit
```

##各種テーブルの準備
各ファイルのデータベース名を書き換えて実行します
（ quickfix -> Quick )

```
quickfix]$ cd src/sql/mysql/
mysql]$ vi sessions_table.sql
-USE quickfix;
+USE Quick;

 DROP TABLE IF EXISTS sessions;

```

```
mysql]$ vi messages_table.sql
-USE quickfix;
+USE Quick;

 DROP TABLE IF EXISTS messages;

```


```
mysql]$ vi messages_log_table.sql
-USE quickfix;
+USE Quick;

 DROP TABLE IF EXISTS messages_log;

```

```
mysql]$ vi event_log_table.sql
-USE quickfix;
+USE Quick;

 DROP TABLE IF EXISTS event_log;

```


```
mysql]$ mysql -u QuickUSER -p  <  sessions_table.sql
mysql]$ mysql -u QuickUSER -p  <  messages_table.sql
mysql]$ mysql -u QuickUSER -p  <  messages_log_table.sql
mysql]$ mysql -u QuickUSER -p  <  event_log_table.sql
mysql]$ mysql -u QuickUSER -p  Quick
mysql> show tables;
+---------------------+
| Tables_in_Quick     |
+---------------------+
| event_backup_log    |
| event_log           |
| messages            |
| messages_backup_log |
| messages_log        |
| sessions            |
+---------------------+
6 rows in set (0.00 sec)

mysql> quit
mysql]$ cd ../../..
```
エラーなく実行できること
ユーザ名、パスワードは大文字小文字も区別されるので注意すること



##動作確認テスト用設定ファイル更新
```
quickfix]$ vi ./test/cfg/ut.cfg
```

```bash:ut.cfg
[DEFAULT]
MySQLStoreDatabase=Quick
MySQLStoreUser=QuickUSER
MySQLStorePassword=QuickPASS
MySQLStoreHost=localhost
# MySQLStorePort=[port]
```

##動作確認テスト
```
quickfix]$ make  check
```

エラーが出たとしても今回はFIX4.4しか使わないので、FIX44以外の場所であれば無視で
エラー箇所を特定する場合は、わかりやすいように着色してみると良いかも

```bash:test/swatchrc
watchfor /fix44.*success/
        echo green
watchfor /failure/
        echo red
watchfor   /.*/
        echo
```


```
quickfix]$ cd test/
test]$ swatch --config-file=swatchrc  --read-pipe=./check.sh
```

すると赤色行で表示されるので分かりやすいはず


##インストール
```
quickfix]$ sudo  make  install
```

## サンプルのコンパイル
```
quickfix]$ cd examples/tradeclient
tradeclient]$ rm example_tradeclient_vs1?.vcxproj
tradeclient]$ make clean
tradeclient]$ ls
Application.cpp  Application.h  Makefile  Makefile.am  Makefile.in  tradeclient.cpp
tradeclient]$ make
```

## サンプルの設定ファイル準備
```
tradeclient]$ cp ../../bin/cfg/tradeclient.cfg .
tradeclient]$ vi tradeclient.cfg
```

```bash:tradeclient.cfg
[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=CLIENT1
TargetCompID=SERVER
SocketConnectHost=127.0.0.1
SocketConnectPort=5001
HeartBtInt=30
```

##FIX44の設定ファイルをコピー
```
tradeclient]$ cp  ../../spec/FIX44.xml  .
```


とりあえず、ソースを拾ってきて正常にコンパイルできることの確認と
開発を続けていくための設定ファイルの準備が完了です


次＞ [【QuickFIX】02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)

---
# 一覧
[01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
[02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
[03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)
[04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)
[05 各種メッセージの枠を作成](https://qiita.com/nobu-maple/items/770d8da8c50c4f5a5a54)
[06 独自メッセージ仕様](https://qiita.com/nobu-maple/items/580815f3c304d96bde31)
[07 セッション開始 <h> TradingSessionStatus](https://qiita.com/nobu-maple/items/98369bad8351cb662740)
[08 通貨ペア要求 <x> SecurityListRequest](https://qiita.com/nobu-maple/items/ba0fb7175c378bc4c608)
[09 通貨ペア取得 <y> SecurityList](https://qiita.com/nobu-maple/items/66feda02d9a717bd31b9)
[10 デモ環境サーバへ接続](https://qiita.com/nobu-maple/items/52de92892a03f59c7368)
[11 ログ出力設定](https://qiita.com/nobu-maple/items/828d3859ebf2ab2237f8)
[12 マーケット情報要求 < V > MarketDataRequest](https://qiita.com/nobu-maple/items/1c4f2d27cabde8eff713)
[13 マーケット情報受信 < X > MarketDataIncrementalRefresh](https://qiita.com/nobu-maple/items/eb7855841000eb2b0f04)
[14 口座情報要求 < AN > RequestForPositions](https://qiita.com/nobu-maple/items/30c286f8dbf1e9b0e173)
[15 口座情報取得 < AZ > CollateralResponse](https://qiita.com/nobu-maple/items/a16e3c787ef5e83f3971)

---