MQL5超入門(10)/iMAを利用したインジケータ

今日は、MQL5 の iMA を利用したインジケータを作成します。
作成しても動かせる環境が無いので、ホントに正しく作れているのか怪しすぎるのですが、超入門の目的は、MQL5 の記法に事前に慣れておくコトですので、あまり気にせず、適当に説明を続けます。


MQL4 での iMA は、移動平均値を求める関数でしたので、for 文の中で1個ずつ、移動平均を求めていました。

for(int i=0; i< limit; i++)
   ind_buffer1[i]=iMA(NULL,0,10,0,MODE_EMA,PRICE_CLOSE,i);

こんな感じですね。
ところが、MQL5 での iMA は、MetaTrader5 に対して、特定の移動平均値配列を準備、自動更新させておく命令に変わりました。
インジケータの中で、1度だけ iMA を呼び出せば、その後はMT5 が内部でMT4 時代の for ループを回して移動平均値配列をアップデートしてくれるというイメージです。


この変更のメリットは、

MQL4 世代
インジケータ A ⇒ ドル円5分足10日間終値移動平均独自に計算
インジケータ B ⇒ ドル円5分足10日間終値移動平均独自に計算
インジケータ C ⇒ ドル円5分足10日間終値移動平均独自に計算

となっていた仕組みが、

MQL5 世代
インジケータ A ⇒ ドル円5分足10日間終値移動平均MT5 に依頼
インジケータ B ⇒ ドル円5分足10日間終値移動平均MT5 に依頼
インジケータ C ⇒ ドル円5分足10日間終値移動平均MT5 に依頼

MetaTrader5 ⇒ ドル円5分足10日間終値移動平均計算してデータを共有

と代わることで、全体での計算量を減らせる点にあります。
インジケータが複数のチャートで何本に増えても、同じ設定の移動平均なら1度の計算で済むのですから、賢いですよね。



その結果、iMA を利用した移動平均インジケータの書き方は以下のようになりました。(たぶん...

#property indicator_chart_window
#property indicator_buffers 1     // 使用するバッファが1つなので 1
#property indicator_plots   1     // 表示するバッファが1つなので 1 

//---- plot MALine
#property indicator_label1  "MALine"  // この辺はMQL4 とほぼ同じだが、
#property indicator_type1   DRAW_LINE // タイプは大幅に増えている。
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3

//--- indicator buffers
double         MALineBuffer;
int            MA_handle;

void OnInit()     // init() の代わりが OnInit()
  {
   SetIndexBuffer(0,MALineBuffer,INDICATOR_DATA);         // 描画する為に INDICATOR_DATA としてバッファ設定
   MA_handle = iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE); // MT5 に10期間EMAを準備するように命令
                                                          // MA_handle はMT5 の配列管理番号(ハンドル)。
  }


// start() の代わりが OnCalculate()
int OnCalculate(const int rates_total,     // rates_total は、チャート上のバーの総数
                const int prev_calculated, // prev_calculated は、前回のOnCalculate が return した値が入る。
                const datetime &time,
                const double &open,
                const double &high,
                const double &low,
                const double &close,
                const long &tick_volume,
                const long &volume,
                const int &spread[])
  {
      // MT5 が自動計算している移動 平均値配列から、ライン描画用の配列にコピーするだけ!!
      int copied = CopyBuffer(MA_handle,0,rates_total,0,MALineBuffer);

      if(copied<=0) return(0); // 1個もコピーできていなかったら ゼロを返し、次回に再挑戦

      return(rates_total);// 今回計算できたバーの本数を返すべきだが、おそらく定型句として覚えて良い一行。
  }

iMA に限らず、 iBearsPower や、iCustom 等、テクニカル指標の標準関数は全て同様の使い方をするので、よく理解しておいてください。