トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

MQL5超入門 iMAを利用したインディケータ

2017-12-08 22:45:45 | 投資

 「とある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はオリジナルでは、< = となっています。マイナス記号とイコール記号を続けると、なぜかこのブログでは書き込めなくなりました。エディターにコピーされる際には、イコール記号をつけ足してください。



最新の画像もっと見る

コメントを投稿