MQL4、MQL5に組み込まれているテクニカル指標ATRでは、一定期間の各バーの値幅の単純移動平均(SMA)をとって算出しています。
ただ、SMAでは結果が遅れて現れるため、相場の急変への対応が遅れてしまいます。そこで、EMAなど遅れの少ない移動平均をとることも考えられます。
ここでは、移動平均の種類を変えられるようにしたATRをカスタム指標として作成してみます。
💡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);
}