https://s3-us-west-2.amazonaws.com/secure.notion-static.com/51f2440a-83f4-4815-b940-d1b89d9bd700/USDJPY_iDaily.png

MQL4、MQL5に組み込まれているテクニカル指標ATRでは、一定期間の各バーの値幅の単純移動平均(SMA)をとって算出しています。

ただ、SMAでは結果が遅れて現れるため、相場の急変への対応が遅れてしまいます。そこで、EMAなど遅れの少ない移動平均をとることも考えられます。

ここでは、移動平均の種類を変えられるようにしたATRをカスタム指標として作成してみます。

コード

ExATR.mq5

💡MQL4用にはファイルの拡張子をmq4にしてダウンロードしてください。

プログラムのプロパティ

//MQL4互換ライブラリ(MQL5のみ)
#include "LibMQL4.mqh"
//移動平均ライブラリ
#include <MovingAverages.mqh>

//プログラムのプロパティ
#property indicator_separate_window    //別ウィンドウに表示
#ifdef __MQL4__
   #property indicator_buffers 1       //プロットする指標バッファの数(MQL4)
#endif
#ifdef __MQL5__
   #property indicator_buffers 2       //使用する指標バッファの数(MQL5)
#endif
#property indicator_plots 1            //プロットする指標バッファの数(MQL5)
#property indicator_type1 DRAW_LINE    //指標の種類
#property indicator_color1 clrGreen    //ラインの色
#property indicator_width1 2           //ラインの太さ

配列に対して移動平均をとるために、MovingAverages.mqhをインクルードしておきます。

プロットする指標バッファは一つですが、真の値幅(True Range)を配列として使うので、使用する指標バッファは二つとなります。指標バッファの数の宣言の仕方は、こちらの記事を参考にしてください。

指標バッファ用の配列の宣言

double ATR[]; //ATR(プロットする)
double TR[];  //真の値幅(プロットしない)

プロットするATRに対応する配列と、その前段階の真の値幅に対応する配列の宣言です。

外部パラメータ

input int ATRPeriod = 14; //ATRの期間
input ENUM_MA_METHOD MAmethod = MODE_SMA; //移動平均の種類

ATRPeriodは、ATRを算出する期間を表します。

MAmethodは、移動平均の種類を表します。ENUM_MA_METHODの定数から選びます。

初期化関数

int OnInit()
{
   #ifdef __MQL4__
      IndicatorBuffers(2); //使用する指標バッファの数(MQL4)
   #endif
   
   //配列を指標バッファに関連付ける
   SetIndexBuffer(0, ATR);
   SetIndexBuffer(1, TR);
   //時系列配列に設定
   ArraySetAsSeries(ATR, true);
   ArraySetAsSeries(TR, true);
   //プロット開始位置の設定
   SetIndexDrawBegin(0, ATRPeriod);
   return(INIT_SUCCEEDED);
}