MACD(Moving Average Convergence/Divergence)とは、ジェラルド・アペル(Gerald Appel)氏によって開発されたインジケーターで、トレンドの方向性・転換を見極めるために使用されるものです。
MACDの計算式は、以下のとおりです。
- MACD = 短期指数移動平均線の値-長期指数移動平均線の値
- MACDシグナル = MACDの指数移動平均線の値
各指数移動平均線(EMA:Exponential Moving Average)の計算期間は、通常、以下の値を使用します。
- 短期EMA:12
- 長期EMA:26
- MACDシグナル線:9
MACDの計算式は以上のとおりですが、MetaTrader4(MT4)に標準で装備されているMACDは、MACDシグナル線にEMAではなく単純移動平均線(SMA:Simple Moving Average)を使用しています。
MACDを作ってみよう!
そこで、今回はオリジナルに忠実なMACD(Accurate MACD.mq4)の作成方法について解説します。
最初に自作するMACDの完成コードを以下のリンクからダウンロードして下さい。
ソースコードを見ながら読み進めていくと分かりやすいと思います。
1.全体像
MT4でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。
- #property命令を記述する。
- インジケーターバッファーの宣言を行う。
- 変数の宣言を行う。
- init()関数内にインジケーターの基本的な設定を記述する。
- start()関数内に具体的な処理内容を記述する。
2.#property命令の記述
#property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。
#proerty命令は、以下のように記述して使用します。
又は
#property 識別子 値
#property命令には、以下のようなものがあります。
strict | mqlをbuild600以降の様式に従って記述することを指定 |
link | webサイトへのリンクを指定 |
copyright | 著作権を指定 |
libraly | ライブラリーファイルであることを指定 |
indicator_chart_window | インジケーターをチャートウィンドウに表示させることを指定 |
indicator_separate_window | インジケーターをサブウィンドウに表示させることを指定 |
indicator_buffers | インジケーターバッファーの個数を指定 |
indicator_minimum | サブウィンドウの縦軸の最小値を指定 |
indicator_maximum | サブウィンドウの縦軸の最大値を指定 |
indicator_colorN | N番目のインジケーターの色を指定 |
indicator_widthN | N番目のインジケーターの線幅を指定 |
indicator_levelN | N番目のインジケーターのレベル(サブウィンドウに表示される水平線の位置)を指定 |
indicator_levelcolor | サブウィンドウに表示されるレベルの色を指定 |
indicator_levelwidth | サブウィンドウに表示されるレベルの線幅を指定 |
indicator_levelstyle | サブウィンドウに表示されるレベルのスタイルを指定 |
show_confirm | 詳細は「こちら」を参照 |
show_inputs | 詳細は「こちら」を参照 |
⑴ サブウィンドウに表示させる
#property indicator_separate_window命令によって、「Accurate MACD.mq4」は、サブウィンドウに表示されます。
⑵ 4種類のデータを表示させる
「Accurate MACD.mq4」では、以下の4つのデータを表示させます。
- MACDを表すライン
- MACDシグナルを表すライン
- 正のヒストグラム(MACD - MACDシグナル ≧ 0)
- 負のヒストグラム(MACD - MACDシグナル < 0)
したがって、#property indicator_buffers命令には、「4」を指定します。
⑶ 色を指定する
「Accurate MACD.mq4」で表示される4つのデータの表示色を指定します。
- #property indicator_color1 Aqua
1番目のインジケーターとしてMACDを指定する(後述の5.⑴を参照)ので、#property indicator_color命令には「1」を指定し、表示色を「Aqua」に指定しています。 - #property indicator_color2 Red
2番目のインジケーターとしてMACDシグナルを指定する(後述の5.⑴を参照)ので、#property indicator_color命令には「2」を指定し、表示色を「Red」に指定しています。 - #property indicator_color3 OrangeRed
3番目のインジケーターとして正のヒストグラムを指定する(後述の5.⑴を参照)ので、#property indicator_color命令には「3」を指定し、表示色を「OrangeRed」に指定しています。 - #property indicator_color4 BlueViolet
4番目のインジケーターとして負のヒストグラムを指定する(後述の5.⑴を参照)ので、#property indicator_color命令には「4」を指定し、表示色を「BlueViolet」に指定しています。
⑷ 線の太さを指定する
「Accurate MACD.mq4」で表示される4つのデータの線の太さを指定します。
- #property indicator_width1 1
1番目のインジケーターとしてMACDを指定する(後述の5.⑴を参照)ので、#property indicator_width命令には「1」を指定し、線の太さを「1」に指定しています。 - #property indicator_width2 1
2番目のインジケーターとしてMACDシグナルを指定する(後述の5.⑴を参照)ので、#property indicator_width命令には「2」を指定し、線の太さを「1」に指定しています。 - #property indicator_width3 2
3番目のインジケーターとして正のヒストグラムを指定する(後述の5.⑴を参照)ので、#property indicator_width命令には「3」を指定し、線の太さを「2」に指定しています。 - #property indicator_width4 2
4番目のインジケーターとして負のヒストグラムを指定する(後述の5.⑴を参照)ので、#property indicator_width命令には「4」を指定し、線の太さを「2」に指定しています。
3.インジケーターバッファーの宣言
インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。
配列の詳細については「こちら」を参照してください。
⑴ double MACD[];
各バーのMACDの値を格納していく配列です。
⑵ double Signal[];
各バーのMACDシグナルの値を格納していく配列です。
⑶ double Up[];
「MACD - MACDシグナル」の値が「0」以上の場合に、当該値を格納していく配列です。
⑷ double Down[];
「MACD - MACDシグナル」の値が「0」未満の場合に、当該値を格納していく配列です。
4.変数の宣言
「変数」の詳細については「こちら」を参照してください。
「Accurate MACD.mq4」においては、以下の項目をパラメーターとして指定します。
- 短期指数移動平均線の計算期間
- 長期指数移動平均線の計算期間
- MACDシグナル線の計算期間
- 各指数移動平均線の計算に用いる値
上記の各項目は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、以下に示すように「外部変数」(詳細については「こちら」を参照してください。)として宣言します。
- extern int Fast_EMA_Period
短期指数移動平均線の計算期間 - extern int Slow_EMA_Period
長期指数移動平均線の計算期間 - extern int Signal_Period
MACDシグナル線の計算期間 - extern int Applied_Price
各指数移動平均線の計算に用いる値
以下の表に従って指定します。種 類 定 数 内 容 PRICE_CLOSE 0 終 値 PRICE_OPEN 1 始 値 PRICE_HIGH 2 高 値 PRICE_LOW 3 安 値 PRICE_MEDIAN 4 中央値
(高値+安値)÷2 PRICE_TYPICAL 5 代表値
(高値+安値+終値)÷3 PRICE_WEIGHTED 6 加重終値
(高値+安値+終値+終値)÷4
5.基本設定の記述
「Accurate MACD.mq4」におけるinit()関数内に記述したコードについて解説します。
⑴ SetIndexBuffer()とは
SetIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域に割り当てるものです。
バッファー(Buffer)とは、データを一時的に蓄える記憶領域のことをいいます。
SetIndexBuffer()関数の詳細については「こちら」を参照してください。
⑵ SetIndexLabel()とは
SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。
SetIndexLabel()関数の詳細については「こちら」を参照してください。
⑶ IndicatorShortName()とは
IndicatorShortName()とは、MQL4であらかじめ定義されている関数で、データウィンドウとサブウィンドウに表示されるインジケーターの名前等を表示させるものです。
IndicatorShortName()関数の詳細については「こちら」を参照してください。
なお、IndicatorShortName()関数の引数はstring型であるため、「Fast_EMA_Period」等の直前に(string)と記述してint型からstring型に型変換(詳細は「こちら」を参照してください。)を行っています。
⑷ SetIndexStyle()とは
SetIndexStyle()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画スタイル(線orヒストグラム、色など)を設定するものです。
SetIndexStyle()関数の詳細については「こちら」を参照してください。
⑸ SetIndexDrawBegin()とは
SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。
SetIndexDrawBegin()関数の詳細については「こちら」を参照してください。
6.具体的な処理内容
「Accurate MACD.mq4」におけるstart()関数内に記述したコードについて解説します。
⑴ int limit = ……について
「limit」という変数を、「Bars – IndicatorCounted()」を初期値として宣言しています。
Barsとは、MQL4であらかじめ定義されている変数で、チャートウィンドウに表示されているバーの本数を格納しているものです。
Barsの詳細については「こちら」を参照してください。
IndicatorCounted()とは、MQL4であらかじめ定義されている関数で、インジケーターの確定値が計算されたバー(=現在のバー以外)の本数を取得するものです。
IndicatorCounted()関数の詳細については「こちら」を参照してください。
したがって、limitは、以下の値を格納する変数ということになります。
- インジケーターをチャートに適用した時点(1ティック目)では、IndicatorCounted()関数によって取得される値は「0」なので、limitにはBarsに格納されている値と同じ値、すなわち、チャートに表示されているバーの本数が格納される。
- 2ティック目以降は、IndicatorCounted()関数によって取得される値は、チャートに表示されているバーの本数から現在のバーを除いた値なので、limitには常に「1」が格納される。
変数limitをこのように定義するのは、インジケーターの値の再計算を最適化するためです。
すなわち、インジケーターの値は、現在のバーについては、レートが変動するごとに再計算する必要がありますが、すでに確定したバーについては、再計算する必要はないので、インジケーターをチャートに適用してから2ティック目以降は、まだ確定していない現在のバーについてのみ、インジケーターの値を再計算するようにしています。
⑵ カウンタ変数の宣言
for()文(詳細は「こちら」を参照してください。)を使用してMACD、MACDシグナル、ヒストグラムの計算を行うので、あらかじめカウンタ変数(for()文による繰り返し処理を行う回数を格納する変数)として、int型の変数「i」を宣言しています。
⑶ MACDの計算
MACDの計算式は、「短期EMA - 長期EMA」となります。
ア Fast_EMA
短期EMAを算出しています。
イ Slow_EMA
長期EMAを算出しています。
ウ MACD
「短期EMA-長期EMA」を計算することによって、MACDを算出しています。
- for()文の詳細については「こちら」を参照してください。
- iMA()関数の詳細については「こちら」を参照してください。
- NormalizeDouble()関数の詳細については「こちら」を参照してください。
- Digitsの詳細については「こちら」を参照してください。
⑷ MACDシグナルの計算
MACDシグナルは、MACDのEMAとなります。
したがって、MACDシグナルを算出するためには、MACDの値が格納されている配列にEMAを適用する必要があります。
iMAOnArray()とは、MQL4であらかじめ定義されている関数で、配列に格納されているデータを基にして移動平均を算出するものです。
iMAOnArray()関数の詳細については「こちら」を参照してください。
⑸ ヒストグラムの計算
「Accurate MACD.mq4」では、MACDの値とMACDシグナルの値の差を計算し、その値が「0」以上の場合は「OrangeRedのヒストグラム」を、「0」未満の場合は「BlueVioletのヒストグラム」を表示させます。
ア 差の計算
MACDの値からMACDシグナルの値を引き、算出された値を「Difference」という変数に格納します。
イ 値が「0」以上の場合の処理
変数Differenceに格納された値が「0」以上の場合は、その値を「Up」というインジケーターバッファーに格納します。
ウ 値が「0」未満の場合の処理
変数Differenceに格納された値が「0」未満の場合は、その値を「Down」というインジケーターバッファーに格納します。