前回の続きをやっていきます。
今回は、ログオン時にUsernameとPasswordを送信するところまで実装してみました。
アカウント追加
ブローカーから送られてくるFIXの接続情報には、Pricing用とTrading用の2つあることがあります。つまり、レート取得と発注で、2セッション張る必要があります。
テスト開発段階でも、それを見越して2セッション張るようにしておきます。
test.cfg に下記を追加します。
1 2 3 4 5 6 7 |
[SESSION] BeginString=FIX.4.4 SenderCompID=CLIENT2 TargetCompID=EXECUTOR SocketConnectHost=192.168.100.99 SocketConnectPort=5001 HeartBtInt=30 |
SocketConnectHostの192.168.100.99は、私の環境の場合です。ローカルにQuickFixサーバを構築している場合は、127.0.0.1とします。
サーバ側の executor.cfg には、最初から CLIENT2 も定義されているので編集不要です。
動作確認します。
(Accepted connection from 192.168.100.50 on port 5001)
<20181216-14:29:02.514019000, GLOBAL, event>
(Accepted connection from 192.168.100.50 on port 5001)
<20181216-14:29:03.562370000, FIX.4.4:EXECUTOR->CLIENT1, incoming>
(8=FIX.4.49=7635=A34=149=CLIENT152=20181216-14:29:03.51756=EXECUTOR98=0108=30141=Y10=148)
<20181216-14:29:03.562416000, FIX.4.4:EXECUTOR->CLIENT1, event>
(Logon contains ResetSeqNumFlag=Y, reseting sequence numbers to 1)
<20181216-14:29:03.562596000, FIX.4.4:EXECUTOR->CLIENT1, event>
(Received logon request)
<20181216-14:29:03.562633000, FIX.4.4:EXECUTOR->CLIENT1, outgoing>
(8=FIX.4.49=7935=A34=149=EXECUTOR52=20181216-14:29:03.56261156=CLIENT198=0108=30141=Y10=047)
<20181216-14:29:03.562661000, FIX.4.4:EXECUTOR->CLIENT1, event>
(Responding to logon request)
<20181216-14:29:03.583218000, FIX.4.4:EXECUTOR->CLIENT2, incoming>
(8=FIX.4.49=7635=A34=149=CLIENT252=20181216-14:29:03.54756=EXECUTOR98=0108=30141=Y10=152)
<20181216-14:29:03.583250000, FIX.4.4:EXECUTOR->CLIENT2, event>
(Logon contains ResetSeqNumFlag=Y, reseting sequence numbers to 1)
<20181216-14:29:03.583382000, FIX.4.4:EXECUTOR->CLIENT2, event>
(Received logon request)
<20181216-14:29:03.583416000, FIX.4.4:EXECUTOR->CLIENT2, outgoing>
(8=FIX.4.49=7935=A34=149=EXECUTOR52=20181216-14:29:03.58339556=CLIENT298=0108=30141=Y10=060)
<20181216-14:29:03.583438000, FIX.4.4:EXECUTOR->CLIENT2, event>
(Responding to logon request)
CLIENT1 と CLIENT2 の両方が接続されていることが確認できました。
ログオン時にUsernameとPasswordを追加
ブローカーから送られてくるFIXの接続情報には、UsernameとPasswordが付いていることがほとんどです。
でも、サンプルアプリの Banzai では、UsernameやPasswordは使っていないので、参考にできるものがありません。
ググってみると、Application の toAdmin() で、「メッセージタイプが LOGON の場合は、Username(553)とPassword(554)のフィールドを追加する」という処理をするのが、一般的なようです。
なので、以下のQ/Aを参考に、Applicationクラスの toAdmin() を下記のように変更します。
http://quickfix-j.364392.n2.nabble.com/Logon-message-userid-password-td364927.html
1 2 3 4 5 6 7 8 9 10 11 |
public void toAdmin(quickfix.Message message, SessionID sessionID) { final Message.Header header = message.getHeader(); try { if( header.getField(new MsgType()).valueEquals(MsgType.LOGON)){ message.setField(new Username("learner")); message.setField(new Password("ABCD1234")); } } catch (FieldNotFound e) { log.error("Message Type field not found in the message... This can't be good!!!" ); } } |
また、import文には新たに下記を追加しておきます。
1 2 |
import quickfix.Message; import quickfix.field.*; |
UsernameとPasswordは、configファイル未対応なようなので、とりあえずハードコーディングしておきました。
QuickFixサーバを起動して、動作を確認しておきます。
(Accepted connection from 192.168.100.50 on port 5001)
<20181216-13:53:40.849035000, FIX.4.4:EXECUTOR->CLIENT1, incoming>
(8=FIX.4.49=10135=A34=149=CLIENT152=20181216-13:53:40.80256=EXECUTOR98=0108=30141=Y553=learner554=ABCD123410=039)
メッセージに、 553=learner554=ABCD1234 が追加されていることが確認できました。
受信メッセージの表示
QuickFixのサンプルクライアントの様に、受信したFIXメッセージをコンソールに垂れ流すようにしておきます。Applicationクラスの fromAdmin() を以下のようにします。
1 2 3 4 |
public void fromAdmin(quickfix.Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon { log.info("{} | {}", sessionID, message); } |
接続中は、Intellijのコンソールで定期的に下記のようなメッセージが垂れ流れるようになりました。
短いですが、今回はここまでです。
次は、ブローカーのデモ環境に接続して Test Request を送ることにトライしたいと思います。