記事"初心者のためのMQL5のカスタムインディケーター"についてのディスカッション - ページ 2

 
serg7771959:

ニコラスです!

Mass[ i ]= Mass[ i+1]+A; (Aは変数です)という式を使ってループの中でインジケータ配列を埋めようとしたとき、コンパイルはエラーなしで進みますが、ウィンドウに参加するとarray out of range (配列が範囲外)というメッセージが表示されるのはなぜですか?


ループは最後の入力が行われるセルを考慮して作成する必要があるからです。Mass[]配列のサイズが仮に10だとすると、0から9(これは配列の最後のセルのインデックスです)までループし、i==9でインデックス9+1のセルに書き込もうとします。配列にはセル10がない。そのため、配列の 外側に出力されます。
 
このようなチュートリアルがもっと必要だ!
 

ニコライ、ありがとう。素晴らしいチュートリアルだよ!
でも、その変数

const int begin

は常にゼロ値になると思います。それは計算上重要なのでしょうか?

 
igorsds:

ニコライ、ありがとう。素晴らしいチュートリアルだよ!
でも、その変数

は常にゼロ値だと思います。計算する上で意味があるのでしょうか?

begin "の 、どのインディケータに 適用するかによって異なります。例えば、RSIに適用した場合、"begin " は14になります。

 

初めてコンパイルしようとすると、バッファエラーが出るかもしれません。そこで、バッファの量を変更してください:

#プロパティ indicator_buffers 2

後で1バッファに戻すこともできます:

#プロパティ indicator_buffers 1

 
フィボ・ジグザグと組み合わせるには?
 

理解できない。仮に

rate_total == MA_Period - 1

で、これは関数の最初の呼び出しなので

prev_calculated == 0

で、begin == 0

とすると、最初の if(rates_total < MA_Period - 1 + begin) の条件は false と評価されます。

ならば

first = MA_Period - 1 が実行される。

が実行されますが、最初のforループの条件がfalseと評価されるため、計算は行われません。

最初のif条件は次のようにすべきだと思います。

if( rates_total < MA_Period + begin ) です。

私はここで何かを見逃しているのでしょうか?

 

そしてもう一つ。すでにprev_calculated 回計算したインジケータを、なぜ(prev_calculated - 1) の数値のバーから計算しなければならないのでしょうか?

例えば、0,1,2,3,4のバーで5回計算しました。バー4で再度計算する必要はありません。5小節目から続ける必要があります。

 
LRDPRDX #:

そしてもう一つ。すでにprev_calculatedという インジケーターを何度も計算しているのに、なぜ(prev_calculated - 1) という数値のバーから計算を始めなければならないのでしょうか?

例えば、0,1,2,3,4のバーで5回計算しました。バー4で再度計算する必要はありません。5小節目から続ける必要があります。

わかりました。なぜなら、前回の計算から4番目のバーが変更された可能性があるからです。ということは、(prev_calculated - 1) が正しいようだ。
 
詐欺が日常茶飯事ブラビ