インジケーター作成その3【単純移動平均線】

インジケーター作成その3【単純移動平均線】

前回までの記事

前回までの記事をまだ読んでない方は、まずはそちらから読み進めてください。

→前回完成ファイルをダウンロード

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

目次

失敗例

期間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()文を活用するとよいです。

整数変数「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」を設定しないという前提です)

→今回完成ファイルをダウンロード

まとめ

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

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

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。