インジケーター作成03

今回の内容は、「単純移動平均を計算して、移動平均線を表示させる」です。

前回までの記事の続きからなので、前回記事をまだ読んでない方は、まずはそちらから読み進めてください。
前回記事 インジケーター作成2【過去部分の描画方法】

前回完成ファイル【Sample_Indicator_02.mq4】をダウンロード

インジケーター用配列の範囲に注意

失敗例

期間3の終値の単純移動平均は、(0本前のローソク足の終値+1本前の終値+2本前の終値)の総和÷3です。それを算出してラインにするため、for()文内を下記のように変更します。

for (i=limit; i>=0; i--)  // limit本前から現在のローソク足を処理
{
   buf[i] = (Close[i] + Close[i+1] + Close[i+2]) / 3;
}

コンパイルしてテスターで動作させると・・・。表示されません。
テスターの操作履歴タブを見ると、なんだかエラーが出ていて停止したようです。

このエラーの原因は、表示開始時のlimit(左端のローソク足のシフト数)を処理するときに、Close(i+1)というさらに左(過去)のローソク足の終値を取得しようとしているためです。
「array out of range in ・・・」(配列の要素数の範囲を超えてます)とエラー出力されます。

失敗例の対策例1 変数「limit」の値をコントロールする

for()文の前に次の条件文を追加します。

if (limit > Bars - 1 - 2) limit = Bars - 3;
もし、limitが左端のローソク足の2つ右のシフト数より大きい場合は、limitにそのシフト数の値を代入。

チャート全体のローソク足の本数を返す「Bars」は、変数「rates_total」としてもOKです。ちなみに、EA編集では「Bars」を使います。

失敗例の対策例2 for()文内で処理をコントロールする

for()文を次のように変更します。

for (i=limit; i>=0; i--)  // limit本前から現在のローソク足を処理
{
   if (i+2 <= Bars - 1)   // 「i+2」が左端のシフト数以下ならば
      buf[i] = (Close[i] + Close[i+1] + Close[i+2]) / 3;
}

この方法は、期間が違う複数のラインをそれぞれ別々に描画開始させる場合に有効です。

単純移動平均線を表示させる

平均の期間をパラメーターにする

「double buf[];」の行の上に、次のコードを追加します。

extern int  SMA_Period  = 10;          // SMAの期間

変数宣言に「extern」を付けることで、ユーザーが値を変更可能なパラメーターにすることができます。(「input」や「sinput」でもパラメーターにできます)

パラメーター変数を設定した行の右側に、//でコメントをするとそのコメントがパラメーター入力画面のパラメーター名になります。

先ほどの対策例2のfor()文内のコード

   if (i+2 <= Bars - 1)   // 「i+2」が左端のシフト数以下ならば
      buf[i] = (Close[i] + Close[i+1] + Close[i+2]) / 3;

の部分をパラメーター「SMA_Period」を使って変形すると、

   if (i + SMA_Period - 1 <= Bars - 1)
      buf[i] = (Close[i] ~ Close[i+SMA_Period-1] の総和) / SMA_Period;

という感じになります。

for()文で指定期間内の終値の総和を求める

期間がパラメーターによって変更される可能性がある場合の算出は、for()文を活用するとよいです。

整数変数「j」を宣言しておいて、下記のようにコード化します。

   if (i + SMA_Period - 1 <= Bars - 1)
   {
      // buf[i]を0に初期化して
      buf[i] = 0;
      // Close[i+0] ~ Close[i+SMA_Period]の一つ手前までを足していき
      for (j=0; j<SMA_Period; j++) buf[i] += Close[i+j];
      // SMA_Periodで割る
      buf[i] /= SMA_Period;
   }

(SMA_Periodには「0」を設定しないという前提です)

今回完成ファイル【Sample_Indicator_03.mq4】をダウンロード

まとめ

単純移動平均線は正常に表示されましたか?
極力シンプルにしたかったので、説明不足な部分があるかもしれません。
疑問などがありましたらコメントで聞いてくださいね!

ではまた、次回をお楽しみに!