07
--
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
MOBILE
qrcode
OTHERS
<< 【QUICKFIX】 FX自動売買への道 10 【注文について】 | top | 【QUICKFIX】 FX自動売買への道 12 【Trading Session Status の組み込み】 >>
【QUICKFIX】 FX自動売買への道 11 【デモ環境への接続】

TestRequest も組み込んだので、いよいよ証券会社(FX会社?)のデモ環境に接続してみます。

でも、QuickFIX単体では暗号化通信に対応していないようなので、先人たちの知恵を拝借して
stunnel を使うことにします。
 

とりあえず構成はこんな感じで

Currenex(443) <− Stunnel(9999) <− QuickFIX


Stunnel から先は暗号化された通信になります。



■Stunnel のインストール & 設定
yum でさくっとインストール
# yum  install  stunnel

インストールしたら設定をば。
ファイルはないので新規作成です。
# vi /etc/stunnel/stunnel.conf
       client = yes

       pid = /var/run/stunnel.pid
       output=/var/log/stunnel.log
       debug = debug

       [currenex]
       accept = 127.0.0.1:9999
       connect = CurrenexServerIP:443


−−−−−
 Stunnel をクライアントモードで動かします
◆.廛蹈札IDを記録(止めるときに使います)
 ログファイル指定
ぁ.蹈阿傍録するレベル(debugは一番情報がでるやつ)
ァ,覆鵑わかる名前でも付けとく
Α.蹇璽ルからの待ち受けポートを 9999 に設定
АStunnel から接続する先(証券会社?)のIPアドレスとポートを指定(今回は 443)



■Stunnel の起動と停止
Stunnel は一度起動するとずっと動き続けます。
# stunnel

で、起動です。
動いているのか確認
# ps -ef | grep stunnel
    root      7667     1  0 22:38 pts/0    00:00:00 stunnel
    root      7668     1  0 22:38 pts/0    00:00:00 stunnel
    root      7669     1  0 22:38 pts/0    00:00:00 stunnel
    root      7670     1  0 22:38 pts/0    00:00:00 stunnel
    root      7671     1  0 22:38 pts/0    00:00:00 stunnel
    root      7672     1  0 22:38 ?        00:00:00 stunnel
    root      7674  2373  0 22:38 pts/0    00:00:00 grep --color=auto stunnel


ポートの確認
# ss -t4nalp
State      Recv-Q Send-Q   Local Address:Port   Peer Address:Port
LISTEN     0      128          127.0.0.1:9999              *:*    users:(("stunnel",pid=7672,fd=12))
LISTEN     0      128                  *:22                *:*    users:(("sshd",pid=1252,fd=3))


ちゃんと 9999 ポートで待ち受けてます。

止めるときは
# kill -USR2 `cat /var/run/stunnel.pid`

こんな感じで


■時刻合わせ(ntpdate)
通信するときにマシンの時刻がずれていると通信をはねられたりするので、時刻合わせは重要です。
なので時刻合わせのみを行う ntpdate を使います。
これも yum でさくっとインストール
# yum  install  ntpdate


とりあえず、時刻合わせ
# ntpdate ntp.nict.jp
    25 Mar 22:49:43 ntpdate[7716]: adjust time server 133.243.238.243 offset -0.034021 sec

ほとんどズレてなかった。
でも、定期的に時刻合わせをやっててほしいので、cron に登録しとく。
1時間毎に時刻合わせを行うように登録
# crontab -e
    0 * * * * /sbin/ntpdate ntp.nict.jp

登録確認
# crontab -l
    0 * * * * /sbin/ntpdate ntp.nict.jp



■QuickFIXの通信先設定
次に FIXの通信先を stunnel のポートに向けます。
ついでに?ちゃんと証券会社からもらったアカウントとパスワードに書き換えもやっときます。
examples]# vi tradeclient.cfg
        [DEFAULT]
        ConnectionType=initiator
        ReconnectInterval=10
        StartTime=00:00:00
        EndTime=00:00:00
        UseDataDictionary=Y
        DataDictionary=../spec/FIX44.xml
        HttpAcceptPort=9911

        ValidateUserDefinedFields=N
        ResetOnLogout=Y
        ResetOnLogon=Y

        # -- MySQL Store ----
        MySQLStoreDatabase=quickfix
        MySQLStoreUser=DBuser
        MySQLStorePassword=DBpass
        MySQLStoreHost=localhost

        # -- MySQL Log ------
        MySQLLogDatabase=quickfix
        MySQLLogUser=DBuser
        MySQLLogPassword=DBpass
        MySQLLogHost=localhost

        [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

−−−−−−−−
 ‐攘会社からもらったデモ環境向けのIDを指定(トレード用とレートストリーミング用)
◆‐攘会社の名前? これも通知をもらってるはず
 通信先ポートを Stunnel に向ける
ぁ.僖好錙璽匹眈攘会社からもらったものを指定

※ 上記 赤字部分 が証券会社からもらった情報になります。



■デモ環境への接続!!
では、いよいよデモ環境に接続してみましょう。

examples]# ./tradeclient/tradeclient  tradeclient.cfg
        
        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
        Action:
     Logon - FIX.4.4:CAXDemo_Account_Str->CNX
        
     IN: 8=FIX.4.49=8035=h34=249=CNX52=20160325-15:07:08.65456=CAXDemo_Account_Str336=0340=210=086

     OUT: 8=FIX.4.49=11335=j34=249=CAXDemo_Account_Str52=20160325-15:07:08.74856=CNX45=258=Unsupported Message Type372=h380=310=154

     Logon - FIX.4.4:CAXDemo_Account_Trd->CNX

     IN: 8=FIX.4.49=8035=h34=249=CNX52=20160325-15:07:08.85556=CAXDemo_Account_Trd336=0340=210=074

     OUT: 8=FIX.4.49=11335=j34=249=CAXDemo_Account_Trd52=20160325-15:07:08.95256=CNX45=258=Unsupported Message Type372=h380=310=136


     1

     TestRequest: 8=FIX.4.49=7835=134=349=CAXDemo_Account_Trd52=20160325-15:07:19.28756=CNX112=Trade10=205

        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
     Action: 2

     TestRequest: 8=FIX.4.49=8135=134=349=CAXDemo_Account_Str52=20160325-15:07:22.85756=CNX112=Ratefeed10=003

        1) TestRequest Trade
        2) TestRequest Ratefeed
        q) Quit
     Action: q

     Logout - FIX.4.4:CAXDemo_Account_Str->CNX

     Logout - FIX.4.4:CAXDemo_Account_Trd->CNX


−−−−−−−−−−−−−−−−
 .蹈哀ぅ鵝!!
◆MsgType< h > を受信()
 MsgType< j > を返信()
ぁ” 1 ” でTrade用アカウントで、 ” 2 ”では レート用アカウントで TestRequest 実行
ァMsgType< 1 > を送信(TestRequest)
Α” q ” でQuit
А.蹈哀▲Ε


トレード用、レート用の両アカウントでのログインに成功しています!!
もし、、成功しなかった場合は早急に”q”で即時停止することをオススメします。
パスワード間違いの場合、リトライを繰り返しますが。。4回間違えるとアカウントロックされちゃいますので。。
(証券会社によってロックポリシーはちがうと思うけど)

ログイン後に取引状態通知< h >(Trading Session Status) が 340=2(OPEN) で取引開始可能ってきてますが、
こちらからは 拒否通知 < j > (Business Message Reject) を送っちゃってます。
しかも「58=Unsupported Message Type」って、何言ってるかわかんねーよ!って返しちゃってます。。。

これは、プログラムにまだ < h > を処理する部分を作っていないから。
次回以降、 < h > 処理部分も作りこんでいきましょう。


とりあえず、デモ環境への接続に成功すること!!
これ、絶対条件です。

私、時間がずれていて接続拒否られてるのになかなか気付かなくて、、無駄に時間を使っちゃいました。

その時の stunnel ログを置いときます。。
どなたかの参考になれば。。

2016.03.24 23:07:22 LOG6[2553:140082410047232]: SSL socket closed (SSL_read)
2016.03.24 23:07:22 LOG7[2553:140082410047232]: Sent socket write shutdown
2016.03.24 23:07:22 LOG5[2553:140082410047232]: Connection closed: 1136 byte(s) sent to SSL, 2132 byte(s) sent to socket
2016.03.24 23:07:22 LOG7[2553:140082410047232]: Remote socket (FD=14) closed
2016.03.24 23:07:22 LOG7[2553:140082410047232]: Local socket (FD=3) closed


これ、ログイン要求35=Aの戻り、ログイン許可 35=A が帰ってきた直後に切断された時のログです。
メッセージをいくら読んでも調べても、ダメなところがなかったのに、時間がズレてたから切断されたようなんです。。
ちょいとハマりました。。





−−−−
以下は正常に接続したときのDB内容
こんな感じでした

−− event_log −−−−−−−−−−−−−−−−−−−−−−
    801  15:07:08.27   CAXDemo_Account_Str  CNX  Created session
    802  15:07:08.60   CAXDemo_Account_Trd  CNX  Created session
    803  15:07:08.75   CAXDemo_Account_Str  CNX  Connecting to 127.0.0.1 on port 9999
    804  15:07:08.84   CAXDemo_Account_Trd  CNX  Connecting to 127.0.0.1 on port 9999
    805  15:07:08.95   CAXDemo_Account_Str  CNX  Initiated logon request
    806  15:07:08.105  CAXDemo_Account_Trd  CNX  Initiated logon request
    807  15:07:08.721  CAXDemo_Account_Str  CNX  Logon contains ResetSeqNumFlag=Y, reseting sequence numbers to 1
    808  15:07:08.725  CAXDemo_Account_Str  CNX  Received logon response
    809  15:07:08.744  CAXDemo_Account_Str  CNX  Message 2 Rejected: Unsupported Message Type
    810  15:07:08.925  CAXDemo_Account_Trd  CNX  Logon contains ResetSeqNumFlag=Y, reseting sequence numbers to 1
    811  15:07:08.929  CAXDemo_Account_Trd  CNX  Received logon response
    812  15:07:08.947  CAXDemo_Account_Trd  CNX  Message 2 Rejected: Unsupported Message Type
    813  15:07:26.565  CAXDemo_Account_Str  CNX  Initiated logout request
    814  15:07:26.583  CAXDemo_Account_Trd  CNX  Initiated logout request
    815  15:07:26.751  CAXDemo_Account_Str  CNX  Received logout response
    816  15:07:26.771  CAXDemo_Account_Str  CNX  Disconnecting
    817  15:07:26.779  CAXDemo_Account_Trd  CNX  Received logout response
    818  15:07:26.793  CAXDemo_Account_Trd  CNX  Disconnecting


−− messages_log −−−−−−−−−−−−−−−−−−−−−−
904 15:07:08.93   CAXDemo_Account_Str  CNX     8=FIX.4.49=9935=A34=149=CAXDemo_Account_Str52=20160325-15:07:08.08956=CNX554=Pass123498=0108=30141=Y10=182
905 15:07:08.103  CAXDemo_Account_Trd  CNX     8=FIX.4.49=9935=A34=149=CAXDemo_Account_Trd52=20160325-15:07:08.09856=CNX554=Pass123498=0108=30141=Y10=167
906 15:07:08.713  CNX     CAXDemo_Account_Str  8=FIX.4.49=8635=A49=CNX34=152=20160325-15:07:08.65456=CAXDemo_Account_Str98=0108=30141=Y10=105
907 15:07:08.733  CNX     CAXDemo_Account_Str  8=FIX.4.49=8035=h49=CNX34=252=20160325-15:07:08.65456=CAXDemo_Account_Str336=0340=210=086
908 15:07:08.756  CAXDemo_Account_Str  CNX     8=FIX.4.49=11335=j34=249=CAXDemo_Account_Str52=20160325-15:07:08.74856=CNX45=258=Unsupported Message Type372=h380=310=154
909 15:07:08.918  CNX     CAXDemo_Account_Trd  8=FIX.4.49=8635=A49=CNX34=152=20160325-15:07:08.85556=CAXDemo_Account_Trd98=0108=30141=Y10=093
910 15:07:08.938  CNX     CAXDemo_Account_Trd  8=FIX.4.49=8035=h49=CNX34=252=20160325-15:07:08.85556=CAXDemo_Account_Trd336=0340=210=074
911 15:07:08.962  CAXDemo_Account_Trd  CNX     8=FIX.4.49=11335=j34=249=CAXDemo_Account_Trd52=20160325-15:07:08.95256=CNX45=258=Unsupported Message Type372=h380=310=136
912 15:07:19.295  CAXDemo_Account_Trd  CNX     8=FIX.4.49=7835=134=349=CAXDemo_Account_Trd52=20160325-15:07:19.28756=CNX112=Trade10=205
913 15:07:19.465  CNX     CAXDemo_Account_Trd  8=FIX.4.49=7835=049=CNX34=352=20160325-15:07:19.39756=CAXDemo_Account_Trd112=Trade10=206
914 15:07:22.865  CAXDemo_Account_Str  CNX     8=FIX.4.49=8135=134=349=CAXDemo_Account_Str52=20160325-15:07:22.85756=CNX112=Ratefeed10=003
915 15:07:23.38   CNX     CAXDemo_Account_Str  8=FIX.4.49=8135=049=CNX34=352=20160325-15:07:22.96556=CAXDemo_Account_Str112=Ratefeed10=002
916 15:07:26.579  CAXDemo_Account_Str  CNX     8=FIX.4.49=6835=534=449=CAXDemo_Account_Str52=20160325-15:07:26.57156=CNX10=024
917 15:07:26.594  CAXDemo_Account_Trd  CNX     8=FIX.4.49=6835=534=449=CAXDemo_Account_Trd52=20160325-15:07:26.58756=CNX10=016
918 15:07:26.745  CNX     CAXDemo_Account_Str  8=FIX.4.49=6835=549=CNX34=452=20160325-15:07:26.68356=CAXDemo_Account_Str10=028
919 15:07:26.775  CNX     CAXDemo_Account_Trd  8=FIX.4.49=6835=549=CNX34=452=20160325-15:07:26.69656=CAXDemo_Account_Trd10=017 








 
まこ | FIX | 01:07 | comments(1) | trackbacks(0) |
スポンサーサイト
スポンサードリンク | - | 01:07 | - | - |
Comment
大変助かってます!ありがとうございます。
暗号化はコンフィグファイルに
SocketUseSSL=Y
を追加すればいいみたいです。
当方JAVA版で作ってますが、繋がりました。
他にもなにやら書いてありましたが、
時間優先で無視してます。
This setting must be used for both acceptors and initiators. If you need to use a specific SSL certificate, configure your session like below.

posted by 大工の源さん ,2017/05/01 11:07 PM










Trackback
URL: