JForexで開発をしている際に、困った不具合(?)を見つけたので共有しておきます。

現象

  • 複数スレッドで並行して最適化を行うと、スレッドが途中で停止する(場合がある)
  • または、データが読み取れず結果が取引件数ゼロとなる

発生条件

  1. Bar情報の購読をFeedDescriptor経由で行っている
    (tickバー、ラインブレイク等の通常の時間足以外を使っている場合)
  2. インディケータもFeedDescriptor経由で呼んでいる
    (実質1と2は同じ条件)
  3. 最適化を2スレッド以上で行っている

原因?

Javaの専門家でもありませんし、ソースも無いので確定ではないですが・・・
rsi(FeedDescriptor,xx)の箇所で応答が無くなっていました。

  • 完全に同じではないですが、2020/1/5~6前後で止まることが多い
  • 完全に停止(ダンマリ)するケースと、最後まで動くが結果がゼロになるケースの2種類がある
  • (ごくまれに)正常に終了するケースもある
  • Eclipse上の独自の実行環境、およびJForexのストラテジーテスタ両方で発生する
  • ストラテジーテスタの方が発生頻度が低い(ように感じる)

という状況です。

解決策として考えられるのは

  1. FeedDescriptorの使用をやめる
    (通常の時間足ロジックにする)
  2. 最適化時のスレッドを1つに限定する

案1は本来の目的を失ってしまうので、現在は案2の1スレッドで実行しています。

PCの性能上せいぜいmax3スレッド程度が限界なのですが、最適化に倍近く時間がかかってしまうのがとても残念です。_| ̄|○

おまけ

MT5の最適化でも1スレッド限定になっていて、大変困っています

独自の評価指標を追加し、複数通貨ペアで大量バッチ処理後にcsvを確認する手法を取っています。

その際にFrameAdd()を使用して情報を送信しているのですが、複数スレッド(エージェント)で実行すると、これが途中で欠けてしまうのです。(エラーは出ていない)

2万パスで10~40位欠けてしまいます。
もちろんパスの実行自体は完了しています。
フレームの送受信の際に欠落していると想定しているのですが、原因不明のため、結局MT5も1スレッドで最適化せざるを得ない状況です・・・(1回28時間くらいかかりますww)

最適化は、取引ロジックの最適化を行っているわけではなく、特定のシグナルが過去のどの通貨、時期に発生していたか?の傾向を把握するためにつかっています。

通常の使い方ではないので、他に困っている人はいないのかもしれませんねw


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です