JForexで開発をしている際に、困った不具合(?)を見つけたので共有しておきます。
現象
- 複数スレッドで並行して最適化を行うと、スレッドが途中で停止する(場合がある)
- または、データが読み取れず結果が取引件数ゼロとなる
発生条件
- Bar情報の購読をFeedDescriptor経由で行っている
(tickバー、ラインブレイク等の通常の時間足以外を使っている場合) - インディケータもFeedDescriptor経由で呼んでいる
(実質1と2は同じ条件) - 最適化を2スレッド以上で行っている
原因?
Javaの専門家でもありませんし、ソースも無いので確定ではないですが・・・
rsi(FeedDescriptor,xx)の箇所で応答が無くなっていました。
- 完全に同じではないですが、2020/1/5~6前後で止まることが多い
- 完全に停止(ダンマリ)するケースと、最後まで動くが結果がゼロになるケースの2種類がある
- (ごくまれに)正常に終了するケースもある
- Eclipse上の独自の実行環境、およびJForexのストラテジーテスタ両方で発生する
- ストラテジーテスタの方が発生頻度が低い(ように感じる)
という状況です。
解決策として考えられるのは
- FeedDescriptorの使用をやめる
(通常の時間足ロジックにする) - 最適化時のスレッドを1つに限定する
案1は本来の目的を失ってしまうので、現在は案2の1スレッドで実行しています。
PCの性能上せいぜいmax3スレッド程度が限界なのですが、最適化に倍近く時間がかかってしまうのがとても残念です。_| ̄|○
おまけ
MT5の最適化でも1スレッド限定になっていて、大変困っています
独自の評価指標を追加し、複数通貨ペアで大量バッチ処理後にcsvを確認する手法を取っています。
その際にFrameAdd()を使用して情報を送信しているのですが、複数スレッド(エージェント)で実行すると、これが途中で欠けてしまうのです。(エラーは出ていない)
2万パスで10~40位欠けてしまいます。
もちろんパスの実行自体は完了しています。
フレームの送受信の際に欠落していると想定しているのですが、原因不明のため、結局MT5も1スレッドで最適化せざるを得ない状況です・・・(1回28時間くらいかかりますww)
最適化は、取引ロジックの最適化を行っているわけではなく、特定のシグナルが過去のどの通貨、時期に発生していたか?の傾向を把握するためにつかっています。
通常の使い方ではないので、他に困っている人はいないのかもしれませんねw