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 に依頼
と代わることで、全体での計算量を減らせる点にあります。
インジケータが複数のチャートで何本に増えても、同じ設定の移動平均なら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 等、テクニカル指標の標準関数は全て同様の使い方をするので、よく理解しておいてください。