移動平均乖離率とは、レートが移動平均線からどのくらい離れて(=乖離して)いるのかを見るためのインジケーターです。
移動平均乖離率の計算式は、以下のとおりです。
- 移動平均乖離率
=(レート - 移動平均線の値) ÷ 移動平均線の値 × 100
以下では、移動平均乖離率(MA-Dev-R.mq4)の作成方法について解説します。
1.全体像
MetaTrader4(MT4)でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。
- #property命令を記述する。
- インジケーターバッファーの宣言を行う。
- 変数の宣言を行う。
- init()関数内にインジケーターの基本的な設定を記述する。
- start()関数内に具体的な処理内容を記述する。
以下のサンプルコードをダウンロードして記事を読み進めてください。
2.#property命令の記述
#property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。
#property命令の詳細については「こちら」を参照してください。
「MA-DEv-R.mq4」における、#property命令を記述した部分の解釈を示すと、以下のようになります。
⑴ サブウィンドウに表示させる
#property indicator_separate_window命令によって、「MA-Dev-R.mq4」は、サブウィンドウに表示されます。
⑵ 1種類のデータを表示させる
「MA-Dev-R.mq4」は、移動平均乖離率を表す1本のラインのみで構成されているので、#property indicator_buffers命令には、「1」を指定します。
⑶ 色を指定する
「MA-Dev-R.mq4」では、1番目のインジケーターとして移動平均乖離率を表すライン指定する(後述の5.⑴を参照)ので、#property indicator_color命令には「1」を指定し、表示色を「SpringGreen」に指定しています。
⑷ 線の太さを指定する
「MA-Dev-R.mq4」では、1番目のインジケーターとして移動平均乖離率を表すライン指定する(後述の5.⑴を参照)ので、#property indicator_width命令には「1」を指定し、線の太さを「1」に指定しています。
⑸ レベルを設定する
移動平均乖離率は、レートが移動平均線からどのくらい離れているのかを見るためのものなので、レートが移動平均線に接していることを意味する「0」の位置に、#property indicator_level命令によって、レベルラインを表示するように設定しています。
3.インジケーターバッファーの宣言
インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。
配列の詳細については「こちら」を参照してください。
「MA-Dev-R.mq4」においては、サブウィンドウに表示されるラインと計算に使用する配列は1つで足りるので、移動平均乖離率の値を格納していく配列を、以下のように1つだけ宣言しています。
//インジケーターバッファーの宣言
double MA-Dev-R[];
4.変数の宣言
「変数」の詳細については「こちら」を参照してください。
「MA-Dev-R.mq4」では、以下のように変数を宣言しています。
extern int MA_Period = 25;
extern int MA_Method = 0;
extern int MA_Applied_Price = 0;
extern int Applied_Price = 0;
それぞれの意味は、以下のとおりです。
- int MA_Period
移動平均線の計算期間を指定します。 - int MA_Method
移動平均線の種類を指定します。
「0」:単純移動平均線(SMA)
「1」:指数移動平均線(EMA)
「2」:平滑移動平均線(SMMA)
「3」:線形加重移動平均線(LWMA) - int MA_Applied_Price
移動平均線の値の算出に使用する価格データの種類を指定します。
「0」:終値
「1」:始値
「2」:高値
「3」:安値
「4」:(高値+安値)÷2
「5」:(高値+安値+終値)÷3
「6」:(高値+安値+終値+終値)÷4 - int Applied_Price
移動平均線との乖離率を測る価格データの種類を指定します。
「0」:終値
「1」:始値
「2」:高値
「3」:安値
「4」:(高値+安値)÷2
「5」:(高値+安値+終値)÷3
「6」:(高値+安値+終値+終値)÷4
なお、それぞれの変数は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、「外部変数」として宣言しています。
5.基本設定の記述
「MA-Dev-R.mq4」におけるinit()関数内に記述したコードについて解説します。
⑴ SetIndexBuffer()とは
SetIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域(データを一時的に蓄える領域)に割り当てるものです。
SetIndexBuffer()関数の詳細については「こちら」を参照してください。
⑵ SetIndexLabel()とは
SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。
SetIndexLabel()関数の詳細については「こちら」を参照してください。
⑶ IndicatorShortName()とは
IndicatorShortName()とは、MQL4であらかじめ定義されている関数で、データウィンドウとサブウィンドウに表示されるインジケーターの名前等を表示させるものです。
IndicatorShortName()関数の詳細については「こちら」を参照してください。
なお、IndicatorShortName()関数の引数はstring型であるため、「MA_Period」等の直前に(string)と記述してint型からstring型に型変換(詳細は「こちら」を参照してください。)を行っています。
⑷ SetIndexStyle()とは
SetIndexStyle()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画スタイル(線orヒストグラム、色など)を設定するものです。
SetIndexStyle()関数の詳細については「こちら」を参照してください。
⑸ SetIndexDrawBegin()とは
SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。
SetIndexDrawBegin()関数の詳細については「こちら」を参照してください。
6.具体的な処理内容
「MA-Dev-R.mq4」のstart()関数内に記述したコードについて解説します。
⑴ 描画開始のチェック
移動平均乖離率は、指定した期間の移動平均線の値が算出されていることを前提とします。
そこで、チャートウィンドウ上のバーの本数が、指定した移動平均線の計算期間分のバーの本数よりも少なかった場合は、プログラムを終了するようにしています。
⑵ int limit = ……について
「limit」という変数を、「Bars-IndicatorCounted()」を初期値として宣言しています。
当該コードの詳細については「こちら」を参照してください。
⑶ for()文による繰り返し処理
for()文の詳細については「こちら」を参照してください。
⑷ 移動平均線の値を算出
iMA()関数を使用して移動平均線の値を算出し、当該値を、インジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
- iMA()関数の詳細ついては「こちら」を参照してください。
- NormalizeDouble()関数の詳細については「こちら」を参照してください。
- Digitsの詳細については「こちら」を参照してください。
⑸ 0divideの回避
移動平均乖離率は、移動平均線の値を分母として算出されます。
したがって、分母となる移動平均線の値が「0」であれば、移動平均乖離率の値を算出することはできません。
そこで、移動平均乖離率の算出過程において、「0」で割る(=0divideといいます。)という場合が生じないように、if()文(詳細は「こちら」を参照してください。)を用いて「移動平均線の値が0でなかったら」という条件を付加しています。
⑹ 乖離率算出の基となる値を格納する変数を宣言
後述の⑻~⒁で、移動平均線との差を求める際に使用する価格データを適宜変更していくことになるので、あらかじめ、各々の価格データを格納する変数として、「Value」を宣言しています。
⑺ switch()文による条件分岐
switch()文の詳細については「こちら」を参照してください。
⑻ 終値による移動平均乖離率の算出
変数「Applied_Price」の値が「0」の場合には、変数「Value」に終値を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
- Close[]の詳細については「こちら」を参照してください。
⑼ 始値による移動平均乖離率の算出
変数「Applied_Price」の値が「1」の場合には、変数「Value」に始値を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
- Open[]の詳細については「こちら」を参照してください。
⑽ 高値による移動平均乖離率の算出
変数「Applied_Price」の値が「2」の場合には、変数「Value」に高値を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
- High[]の詳細については「こちら」を参照してください。
⑾ 安値による移動平均乖離率の算出
変数「Applied_Price」の値が「3」の場合には、変数「Value」に安値を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
- Low[]の詳細については「こちら」を参照してください。
⑿ 中央値による移動平均乖離率の算出
変数「Applied_Price」の値が「4」の場合には、変数「Value」に中央値値(=(高値 + 安値) ÷ 2)を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
⒀ 代表値による移動平均乖離率の算出
変数「Applied_Price」の値が「5」の場合には、変数「Value」に代表値値(=(高値 + 安値 + 終値) ÷ 2)を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。
⒁ 加重終値による移動平均乖離率の算出
変数「Applied_Price」の値が「6」の場合には、変数「Value」に加重終値(=(高値 + 安値 + 終値 + 終値) ÷ 2)を格納し、移動平均乖離率を算出しています。
そのうえで、当該値をインジケーターを適用するチャートにおける通貨ペアの提示レートの小数点以下の桁数で四捨五入しています。