2014年11月にOANDAでAPIを申請したものの、その後の記事は全くありませんでした。
原因は、クライアントの作成に挫折していたからです (T^T)
一番の原因は、接続できない原因の切り分けでつまづいたことでした。
接続できない原因が、SSLの問題なのか、FIX設定の問題なのかが、うまく切り分けできませんでした。
QuickFIX/J標準機能、stunnelどちらも試してみましたが、どちらも上手くいかず。
2週間くらい(土日)悪戦苦闘していたものの、そのうちに飽きてきました・・・(必須のものではなかったし)
そうこうしているうちに、OANDA JapanでREST APIがサポートされました。
もともとFIXを使おうとした理由が、「JForexのストラテジーが生成したシグナルから、日本の口座に発注する」ことでした。
なので、REST APIの登場でFIXの必要性がぐんとさがり、かつMT4経由の口も作ったので、FIXは忘却の彼方へ行ってしまいました。
このたびC-NEXにFIX口座を開いたことにより、夏休みを使い再度FIXアプリ作成にチャレンジしてみました。
まずは、肝心のFIX engineの選定から。
前回時にはFIX Trading Commuityのengine開発メンバページで色々探してみました。
条件としては、無償(どこまでFIX使えるか不明のため)/ 登録不要(得体のしれない会社に晒したくない)ことから、以下の2つに絞っていました。
今回も前回から引き続き、以下2つから選択することにします。(評価は個人的感想です)
名称 | QuickFIX/J | Fix8 |
URL | http://www.quickfixj.org/ | http://www.fix8.org/ |
言語 | Java | C++ |
プラットフォーム | any(Javaが動けばOK) | Windows 32/64, OSX, Linux on IA32, x86-64 |
ドキュメント | 少 APIとスタートガイド |
中 左記に加えて専用フォーラムあり |
性能 | 不明 | High performanceを謳っている |
ユーザ数 | 不明(少?) ググるとQuickFIX(C++版)の英語情報は若干でてくるが・・・ |
不明(少?) ググっても他の物しかでてきませんw |
開発元 | 不明 Githubによるオープン開発 |
Fix8 Market Tech FIX Trading Communityに登録あり |
結論 | 採用 | 不採用 |
選択のポイントは
- 言語:どちらもあまり知識はないが、Javaの方がまだマシ
GUIも考えると、Fix8はC#も必要となりそう。 - プラットフォーム:Windows(desktp)/Linux(AWS)の両方で稼働させたい
- 性能:個人クライアントだし問わない
- 開発元:Fix8、QuickFIX/Jともに継続開発されているし、どちらでも問題なさそう
ということでQuickFIX/Jを選択しました。
サンプルのBanzaiをベースに開発しましたが、初心者のdummytopが引っかかったポイントは・・・
- 前回同様、うまく接続できない!!
今回は夏休みで纏まった時間が取れたので、順を追って解消していきました。- SSL接続:wiresharkにより、鍵交換までうまくいっていることを確認!
(表示上はtcpですが、decode asでSSLデコードすることで、TLSとして表示される)
結果として、configに”SocketUseSSL=Y”とするだけで、SSL接続はOKでした。 - ログイン情報:出力されたログを見てもどこが悪いのかがわかりません。
そもそも、OANDAサーバから無応答なので、本当にログイン送信できているかも不安です。
そこで、試しにC-NEXに接続してみると「フィールドが足り無いゾ」との応答が・・・( ゜_゜;)
ログイン認証に失敗したときの対応が全く別でした。
・OANDA:無応答(セキュリティ対策のため)
・C-NEX:エラー応答
C-NEXのおかげで原因がワカッタョ!!(なんとパスワードが入っていなかったwww)
※)OANDAはわかりにくいですが、”Webログインする際のIDとパスワード”となります。
- SSL接続:wiresharkにより、鍵交換までうまくいっていることを確認!
- ログイン情報にパスワードが設定されない
サンプルアプリ、APIを調べたりググったりしましたが、設定されない原因がわかりません。
そもそも、サンプルのBanzaiにはパスワードの概念がなさそう。
ということで、キレイではないですが、toAdmin()の中で自力で設定しました。 - 送信時のセション指定ってどうやるの?
標準では、rateとorderは別セションとなります。
オーダー送信時にはORDERに対して送信しますが、簡単に指定できないものか・・・Session.sendToTarget(message, “SenderCompID”, “OANDA/ORDER”);
で上手くいきました。
- GUIの更新がデキネー!!
せっかくなのでJavaFXでGUIを作ったのですが、バックグラウンドのFIXスレッドから更新しようとすると”FXのスレッドでないからダメ”と怒られてしまいます。
これがいくらググっても対策がわかりませんでした。(この土日ずっとやってたかも)
・コントローラーをFIXクラスのstatic変数にbind:static変数更新時に実行時エラー
・FXクラスにstaticメソッドを作成して、メソッド内でstatic変数を更新:同じく実行時エラー
色々苦戦したあげく、上手くいったのは
・FXクラスにstaticメソッドを作成し、この中でコントローラを更新する
・そのまま実行するとエラーとなるので、staticメソッドをPlatform.runLater()で実装するpublic static void setPrice(String s){
Platform.runLater(new Runnable(){
@Override
public void run(){ price.set(s); }
});
}こうすることで、ようやくFIXで受信したレートをGUI上に表示することができました。
過去に仕事上扱ってきたのが、サーバアプリ(主にC)だったので、Javaはともかく、クライアントのGUIプログラムには構造を含め非常に苦労しました。
以上により、ようやくFIXアプリ(の骨格)が完成しました。
とりあえず、Market Data Incremental RefreshとNew Order Singleができるようになったので、細かい注文やエラー処理は今後少しずつ作りこんでいく予定です。
テスト口座でですが、FIXで注文したポジションは「MT4で表示され、かつクローズできる」ことも確認できたので、万が一アプリがトチ狂っても問題なさそうです。
もともとFIXはJForexから国内口座に発注するための手段として考えていました。
しかし、今回C-NEXの開設により、JForexを介さずにCurrenexダイレクトでストラテジーを動かすことを最終目標にしようと考えています。
(SWFXと比較しても、tick数やボリュームで引けをとっていませんでしたし、スキャルピングのストラテジーだと、やはり他社のレートを基に動作するのは変ですしね)
ちなみに、OANDAとC-NEXではサポートしているメッセージがずいぶん異なっていました。(C-NEXの方が多かった)
最終的にはC-NEXで稼働させるのが目標です (^_^)v
最後に
前回からFIXアプリ開発に関して、いくらググってもほとんど情報がでてきませんでした。(特に日本語の情報)
日本でも、OANDA / C-NEX(YJFX!) / サクソバンクFX証券 等、個人ユーザが 直接FIX接続できる業者が増えています。
今後FIXユーザも増えていくことでしょうから、日本語の情報も増えていくことを期待しています。
dummytopも、拙いながらも情報発信していく予定です。
日本FIXユーザ会 みたいなのがあるといいですねぇ・・・ヾ(@^▽^@)ノ
“FIXアプリ ようやく完成(骨格のみ・・・)” への3件のフィードバック
はじめまして
ブログ拝見させていただいております。
ありがとうございます。
さて、C-NEX CurrenexにてFIXAPI接続を目指しております。
しかし、プログラム超初心者(CとJAVAを独学中)で
まずCーNEXのAPI口座開設のための
FIXでの接続やメッセージ等の確認を行うための「コンファマーステスト」
でわからなくて、何からどうしていいかという状態です。はずかしながら
もしよろしければご教授頂けないでしょうか?
いきなりで大変申し訳ありません。。。
tobbykkkさん、コメントありがとうございます。
私が申請したときには”コンファーマーテスト?”が無かったので、お力になれそうにありません。
ただし、私の経験上「クライアントアプリを1から作るのはすごく大変」だけど、「FIX接続してメッセージをやりとりするだけなら以外と簡単」だと言えます。
YJFXは情報を殆ど公開してないので、同じFIX提供のオアンダの情報を参照するのも手だと思います。
http://developer.oanda.com/fix-live/development-guide/
また、FIX接続関連でしたら、例えばgitにライブラリが公開されています。
https://github.com/search?utf8=%E2%9C%93&q=py+fix&type=
これらを参考にされてはいかがでしょうか?
dummytop様
お世話になります
お忙しい所ご返信頂き誠にありがとうございます。
そして、アドバイスまでいただき本当にありがとうございます。参考にさせて頂きます。
本当にありがとうございました!