「とあるMetaTraderの備忘秘録」(2009-08-27)にて、MT5で作動する移動平均線のプログラムをfaiさんが試作されました。当時はMT5 β版がリリースされたばかりで、実際に動作確認をできる状況にはなかったようです。MT5がMT4の後継システムとなることがはっきりした現在、筆者もMQL5の研究に努力中ですが、今回、改めてこのプログラムをレビューしてみることにしました。作成されたオリジナル・ソースコードは下記に掲載。
http://d.hatena.ne.jp/fai_fx/20090827/1251300733
上記プログラムをMT5エディターにコピーしてみると、コンパイルは通りましたが、実際にチャートに挿入してみても目的のインジは描画できませんでした。つぶさに調べてみて、次のような問題点に思い至りました。
① CopyBuffer()の3番目と4番目の引数が逆
CopyBuffer()の3番目の引数はコピーの開始位置、そして4番目の引数はコピーすべきバーの本数となっています。それゆえ、CopyBuffer()の3番目と4番目の引数が逆にする必要があります。
② MT4 IndicatorCounted()とMT5 prev_calculatedの違い
MT4では既に計算済みの1本前までのバーの本数を返すのに対して、MT5では全本数を返すことになっています。この点を変数limitで調整しました。
③ テクニカル指標の終了処理関数を設定
MA_handleの初期化において、MT5システムにiMAの計算をさせているので、指標終了時には、IndicatorRelease()でその解放を行うこととしました。(追加)
④ オリジナルでは移動平均線の期間は10に限定していますが、汎用性を持たせるため、期間に外部変数を設定して選択可能としました。(追加)
修正および加筆後のソースプログラム
// プリプロセッサ命令(プログラム全体の設定)
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_label1 "MALine"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
// 指標バッファ用の配列の宣言
double MALineBuffer[];
// テクニカル指標ハンドル
int MA_handle;
// 外部パラメータ
input int MAPeriod = 10; // 移動平均の期間
// 初期化関数
int OnInit()
{
// 指標バッファの割り当て
SetIndexBuffer(0,MALineBuffer,INDICATOR_DATA);
// テクニカル指標の初期化
MA_handle = iMA(_Symbol,0,MAPeriod,0,MODE_SMA,PRICE_CLOSE);
return(INIT_SUCCEEDED);
}
// 終了処理関数
void OnDeinit(const int reason)
{
// テクニカル指標の解放
IndicatorRelease(MA_handle);
}
// 指標計算関数
int OnCalculate(const int rates_total,
const int prev_calculated,
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[])
{
//---
// カスタム指標の範囲
int limit = rates_total - prev_calculated;
if(limit == 0) limit = 1;
// 指標バッファのコピー
int copied = CopyBuffer(MA_handle,0, 0,limit,MALineBuffer);
if ( copied < 0 ) return (0);
return(rates_total);
}
//+------------------------------------------------------------------+
(注)最後から2行目、copied < 0はオリジナルでは、< = となっています。マイナス記号とイコール記号を続けると、なぜかこのブログでは書き込めなくなりました。エディターにコピーされる際には、イコール記号をつけ足してください。