インジケーター作成その2【過去部分の描画方法】

インジケーター作成その2【過去部分の描画方法】

前回記事インジケータ―作成その1【新規作成の流れ】の続きです。

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

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

今回の内容は、「インジケーターを実行させた時点より前のローソク足の終値もラインで結ぶ」です。

目次

チャート全体のローソク足の本数を知る

画面に表示されているローソク足のみではなく、左にスクロースしていった一番左端までさかのぼって数えた場合のローソク足の本数は「rates_total」で取得できます。
(BarsでもOKです)

左端から一つ一つ終値を格納していく

前回の完成ファイルの、OnCalculate()関数内のコードを次のように変更します。

   int i;
   int limit = rates_total - 1;
   
   for (i=limit; i>=0; i--)
   {
      buf[i] = Close[i];
   }

整数変数「i」を宣言します。この変数は、for()文で使用します。

次に整数変数「limit」を宣言して、左端のローソク足までのシフト数を代入します。

右端のローソク足から数えて、
1本目は、0本前(シフト数 0)
2本目は、1本前(シフト数 1)
3本目は、2本前(シフト数 2)

rates_total 本目は、rates_total -1(シフト数 rates_total -1)
ということで、左端のローソク足までのシフト数は「rates_total -1」となります。

次にfor()文で左端から右端まで、ライン用配列「buf」に終値を代入するのを繰り返します。

これで、コンパイルして表示確認してみると、ラインが左端からすべてつながって表示されます。

処理をスマートにする

スマートって。。なんだか曖昧な表現になりましたが、要は無駄を省くということです。

先ほどまでのコードでは、ティック毎にすべてのローソク足の処理をすることになります。
でも、1本前や2本前、さらにその前までのローソク足の終値は変動することがないので、インジケーター用配列「buf」に再度上書き代入する必要がないですよね?

そこで便利な変数「prev_calculated」を利用します。

OnCalculate()関数の終わりでは、

//--- return value of prev_calculated for next call
   return(rates_total);

となっています。

変数「prev_calculated」の値は、最初は0で次のティックから前回OnCalculate()関数が返した値、この場合は「前回のrates_total」(前回のローソク足の本数)となります。

変数「limit」に値を代入する部分を、次のように変更します。

   int limit;
   if (prev_calculated == 0)
      limit = rates_total - 1;
   else
      limit = rates_total - prev_calculated;

こうすることで、変数「limit」の値は、インジケーター表示開始時には左端のローソク足のシフト数となり、その後、「0」(ローソク足増加時は「1」)が代入されることになります。
(「int limit = Bars - IndicatorCounted() - 1;」でもOKです)

これで、このインジケーターが処理するのは、

最初: すべてのローソク足
ローソク足増加時: 1本前と現在のローソク足
それ以外: 現在のローソク足のみ

というようにだいぶスマートになりました。

ちなみに、ローソク足増加時に1本前のローソク足も処理するのは、1本前のローソク足の終値をつけたティックで、インジケーターが処理できなかった場合の為です。

表示・動作確認

変数「limit」の値を確認するために、次のコードを追加してコンパイルします。

   Print(limit);

テスターなどで、ライン表示や変数「limit」の値出力を確認してみてください。

→Sample_Indicator_02.mq4をダウンロード

まとめ

いかがだったでしょうか?
「rates_total」と「prev_calculated」を使った処理のスマート化などを理解できましたでしょうか?

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

コメントを投稿する

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






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

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