ATR(Average True Range)とは、J.W.ワイルダー(John Welles Wilder.Jr)氏が開発したインジケーターで、レートの変動率から、相場が買われ過ぎや売られ過ぎの状態にあるのかどうかを判断するために使用するインジケーターです。
ATRの具体的にな使用方法としては、以下のようになります。
- ATRの値が高水準で推移している
相場が過熱し、天井圏又は底値圏に近づいていることを示唆している。 - ATRの値が低水準で推移している
レンジ相場が継続していることを示唆している。
ATRの計算式は、以下のとおりです。
- 真の値幅(True Range)を算出する
真の値幅とは、以下の3つの値を比較し、最大のものを指します。
①当日の高値-前日の終値
②前日の終値-当日の安値
③当日の高値-当日の安値
これを図示すると、以下のようになります。まとめると、真の値幅は、以下の計算式により算出されます。
「当日の高値と前日の終値の大きい方」
と
「当日の安値と前日の終値の小さい方」
との差 - 真の値幅の平均値(=ATR:Average True Range)を算出する
真の値幅の指数移動平均(EMA:Exponential Moving Average)を算出します。
ATR=TRのn日間のEMA
※通常は、「n=14」です。
ATRは、MetaTrader4(MT4)でも、標準で装備されているインジケーターですが、MT4で標準で装備されているATRは、真の値幅の指数移動平均としてではなく、単純移動平均(SMA:Simple Moving Average)として算出されています。
そこで、以下では、ATRの開発者であるワイルダーが提示した計算式にのっとって、真の値幅の指数移動平均として算出されるATR(Wilders ATR.mq4)の作成方法について解説します。
1.全体像
MT4でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。
- #property命令を記述する。
- インジケーターバッファーの宣言を行う。
- 変数の宣言を行う。
- init()関数内にインジケーターの基本的な設定を記述する。
- start()関数内に具体的な処理内容を記述する。
以下のサンプルコードをダウンロードして、記事を読み進めてください。
2.#property命令の記述
#property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。
#property命令の詳細については「こちら」を参照してください。
「Wilders ATR.mq4」における、#property命令を記述した部分の解釈を示すと、以下のようになります。
⑴ サブウィンドウに表示させる
#property_indicator_separate_window命令によって、「Wilders ATR.mq4」は、サブウィンドウに表示されます。
⑵ 1種類のデータを表示させる
「Wilders ATR.mq4」は、以下の1つのデータを表示させます。
- ATRを示すライン
したがって、#property indicator_buffers命令には、「1」を指定します。
⑶ 色を指定する
「Wilders ATR.mq4」で表示されるデータの表示色を指定します。
- #property indicator_color1 SpringGreen
1番目のインジケーターとしてATRを示すラインを指定する(後述)ので、#property indicator_color命令には「1」を指定し、表示色を「SpringGreen」に指定しています。
3.インジケーターバッファーの宣言
インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。
インジケーターバッファーの詳細については「こちら」を参照してください。
「Wilders ATR.mq4」における、インジケーターバッファーを宣言した部分の解釈を示すと、以下のようになります。
⑴ double ATR[];
ATRの値を格納していく配列(詳細については「こちら」を参照してください。)です。
⑵ double TR[];
真の値幅(TR:True Range)の値を格納していく配列です。
4.変数の宣言
「Wilders ATR.mq4」においては、以下の項目をパラメーターとして指定します。
- ATRの計算期間
- 真の値幅の値に対して適用する移動平均の種類
上記項目は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、以下に示すように、「外部変数」(詳細については「こちら」を参照してください。)として宣言します。
- extern int ATR_Period
ATRの計算期間 - extern int MA_Mode
真の値幅の値に対して適用する移動平均の種類
5.基本設定の記述
「Wilders ATR.mq4」におけるinit()関数内に記述したコードについて解説します。
⑴ IndicatorBuffers()とは
IndicatorBuffers()は、MQL4であらかじめ定義されている関数で、インジケーターの計算に使用するバッファーの個数を指定するものです。
IndicatorBuffers()関数の詳細については「こちら」を参照してください。
⑵ SetIndexBuffer()とは
SetIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域(データを一時的に蓄えるデータ領域)に割り当てるものです。
SetIndexBuffer()関数の詳細については「こちら」を参照してください。
⑶ SetIndexLabel()とは
SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。
SetIndexLabel()関数の詳細については「こちら」を参照してください。
⑷ IndicatorShortName()とは
IndicatorShortName()とは、MQL4であらかじめ定義されている関数で、データウィンドウとサブウィンドウに表示されるインジケーターの名前等を表示させるものです。
IndicatorShortName()関数の詳細については「こちら」を参照してください。
⑸ SetIndexDrawBegin()とは
SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。
SetIndexDrawBegin()関数の詳細については「こちら」を参照してください。
6.具体的な処理内容
「Wilders ATR.mq4」のstart()関数内に記述したコードについて解説します。
⑴ int limit = ……について
「limt」という変数を、「Bars-IndicatorCounted()」を初期値として宣言しています。
当該コードの詳細については「こちら」を参照してください。
⑵ 真の値幅
ア for()とは
for()とは、同様の計算を繰り返して行うために使用するものです。
イ 真の値幅の計算
真の値幅は、「当日の高値と前日の終値の大きい方」と「当日の安値と前日の終値の小さい方」との差によって算出されます。
そこで、以下の手順で真の値幅を算出し、当該値を配列TR[]に順次格納していくようにしています。
- MathMax()関数(詳細は「こちら」を参照してください。)を用いて、当日の高値と前日の終値を比較し、大きい方の値を取得する。
MathMax(High[i],Close[i+1])
- MathMin()関数(詳細は「こちら」を参照してください。)を用いて、当日の安値と前日の終値を比較し、小さい方の値を取得する。
MathMin(Low[i],Close[i+1])
- 1.及び2.の2つの値の差を算出する。
MathMax(High[i],Close[i+1]) - MathMin(Low[i],Close[i+1])
- 3.の値を配列TR[]に格納する。
TR[i] = MathMax(High[i],Close[i+1]) - MathMin(Low[i],Close[i+1]);
⑶ ATR
ア ATRの計算
ATRは、真の値幅の指数移動平均(EMA)として算出されます。
そこで、iMAOnArray()関数(詳細は「こちら」を参照してください。)を用いて、真の値幅の値を格納している配列TR[]の指数移動平均を取得し、当該値を、配列ATR[]に格納しています。
ATR[i] = iMAOnArray(TR,0,ATR_Period,0,MA_Mode,i);
イ 小数点以下の桁数の調整
NormalizeDouble()関数(詳細は「こちら」を参照してください。)を用いて、配列ATR[]に格納された値を、提示レートの小数点以下の桁数で四捨五入するようにしています。
ATR[i] = NormalizeDouble(ATR[i],
MarketInfo(Symbol(),MODE_DIGITS));
- MarketInfo()関数の詳細については「こちら」を参照してください。
- Symbol()関数の詳細については「こちら」を参照してください。