フラクタルのインジケーターがバックテストの途中で消えます。(画像付き)

 

右記のリンクにある"Advanced Fractals"というインジケーターがあるのですが、バックテストの最中(かなり序盤)で消えます。 https://www.mql5.com/en/code/19783

また、本来表示すべき場面で表示されないことも多々あります。

元のコードが原因なのか、私の環境の問題なのか、初心者なのでわかりません。

問題の解決方法、あるは正常に動作するパラメータの変更可能なフラクタル・インジケーターを紹介していただけると助かります。

Advanced Fractals
Advanced Fractals
  • www.mql5.com
VR
ファイル:
 

プログラムに間違いがあります。

1. バッファがリセットされてしまう場合がある。

2. 配列の範囲外エラーが起こる場合がある。
 
Nagisa Unada:

プログラムに間違いがあります。

1. バッファがリセットされてしまう場合がある。

2. 配列の範囲外エラーが起こる場合がある。
ご回答ありがとうございます。
よろしければ、具体的にどの部分が問題で、どう変えれば正常に動くのか教えていただけますでしょうか。
 

逆方向から計算しているので、どう説明していいのやら...

通常の計算方法にプログラムを修正しておきました。動作確認はしていません。
ファイル:
 
Nagisa Unada:

逆方向から計算しているので、どう説明していいのやら...

通常の計算方法にプログラムを修正しておきました。動作確認はしていません。

正常に動作しています。助かりました。本当にありがとうございます。

 
Nagisa Unada:

逆方向から計算しているので、どう説明していいのやら...

通常の計算方法にプログラムを修正しておきました。動作確認はしていません。

すみません。また質問させてください。
フラクタルがやはり所々、表示されないバグが発生します。

標準のfractalインジケーターでは正常に表示されているのですが(私が確認した範囲内で)

Nagisa Unada さんが修正してくださったコードと、元のコードの両方とも所々表示されないバグがあります。
※修正後のほうが欠損は少なかったです。


私なりに標準のfractalインジケーターを参考にコードを書き直してみたりしましたが、解決しませんでした。

もしよろしければ、またお力を貸していただけないでしょうか。

ファイル:
gn7hauq6.png  43 kb
 
87行、90行の >= 、 <= から = を削除すればかなり改善しますが、完全には同じになりません。
ループでフィルタリングするには限界があります。

Frames の値に応じて2本なら、

if(high[i] > high[i + 1] && high[i] > high[i + 2] && high[i] >= high[i - 1] && high[i] >= high[i - 2])
3本なら、
if(high[i] > high[i + 1] && high[i] > high[i + 2] && high[i] > high[i + 3] && high[i] >= high[i - 1] && high[i] >= high[i - 2] && high[i] >= high[i - 3])
のように各本数ごとに1本のフィルタを設置するしか方法はないと思います。

プログラムの挙動はデバッグにより解析することができます。デバッグの方法を学習してください。

https://www.mql5.com/en/articles/654

(追記)ArrayMaximum/ArrayMinimum を使う方法も試してみましたが結果は同じです。
Debugging MQL5 Programs
Debugging MQL5 Programs
  • www.mql5.com
This article is intended primarily for the programmers who have already learned the language but have not fully mastered the program development yet. It highlights the key issues that every developer deals with when debugging a program. So, what is debugging? Debugging is a stage in program development meant for detecting and removing program...
 
Nagisa Unada:
87行、90行の >= 、 <= から = を削除すればかなり改善しますが、完全には同じになりません。
ループでフィルタリングするには限界があります。

Frames の値に応じて2本なら、

3本なら、
のように各本数ごとに1本のフィルタを設置するしか方法はないと思います。

プログラムの挙動はデバッグにより解析することができます。デバッグの方法を学習してください。

https://www.mql5.com/en/articles/654

(追記)ArrayMaximum/ArrayMinimum を使う方法も試してみましたが結果は同じです。

回答ありがとうございます。最適化を手動でやることにはなりますが、標準のfractalのようにコードを書けばちゃんと表示されることが確認できました。
これからはそのようにコードを書いていきたいと思います。


ちなみに、なぜこのような問題が起こるのか、教えていただけませんか?

コンパイルエラーは出てませんし、大部分は表示てきているのに、一部だけ表示できない理由がわかりません。
今後のプログラミングのためにも、その理由をできれば知っておきたいです。

 

何故かと言われても「選別の方法が違うから」としか言いようがないです。

で、それを考えている内にあることが閃いたので試してみたらうまくいったみたいです。

厳密に確認はしていませんが、違いは見当たりませんでした。
ファイル:
 
Nagisa Unada:

何故かと言われても「選別の方法が違うから」としか言いようがないです。

で、それを考えている内にあることが閃いたので試してみたらうまくいったみたいです。

厳密に確認はしていませんが、違いは見当たりませんでした。

その手がありましたか。素晴らしい計算方法ですね。

私が見た限り、フラクタルが一部表示されない問題の原因は、i個前or後の高値安値を比べる時に><の不等式を使ってしまっていたことにあったようです。
これだとFrames以内に高値安値が同値のローソク足があった場合に表示されなくなってしまいます。