MACDの作成

 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(Accurate MACD.mq4)の作成方法について解説します。

 なお、MACDの使用方法については、以下の書籍を参考にされるとよいと思います。

>>Amazonで購入する

  1. 全体像
  2. #property命令の記述
  3. インジケーターバッファーの宣言
  4. 変数の宣言
  5. 基本設定の記述
  6. 具体的な処理内容
  7. 関連ツール
  8. 関連インジケーター
  9. 関連EA
  10. 関連書籍
Accurate MACD
Accurate MACD

1.全体像

 MT4でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。

  1. #property命令を記述する。
  2. インジケーターバッファーの宣言を行う。
  3. 変数の宣言を行う。
  4. init()関数内にインジケーターの基本的な設定を記述する。
  5. start()関数内に具体的な処理内容を記述する。

 具体的には、以下のようになります。

Download (PDF, 652KB)

>>目次に戻る

2.#property命令の記述

 #property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。

 #proerty命令は、以下のように記述して使用します。

#property
#property命令の書式

 #property命令には、以下のようなものがあります。

#property命令の種類・内容

種 類
内 容
linkwebサイトへのリンクを指定
copyright著作権を指定
libralyライブラリーファイルであることを指定
indicator_chart_windowインジケーターをチャートウィンドウに表示させることを指定
indicator_separate_windowインジケーターをサブウィンドウに表示させることを指定
indicator_buffersインジケーターバッファーの個数を指定
indicator_minimumサブウィンドウの縦軸の最小値を指定
indicator_maximumサブウィンドウの縦軸の最大値を指定
indicator_colorNN番目のインジケーターの色を指定
indicator_widthNN番目のインジケーターの線幅を指定
indicator_levelNN番目のインジケーターのレベル(サブウィンドウに表示される水平線の位置)を指定
indicator_levelcolorサブウィンドウに表示されるレベルの色を指定
indicator_levelwidthサブウィンドウに表示されるレベルの線幅を指定
indicator_levelstyleサブウィンドウに表示されるレベルのスタイルを指定
show_confirm詳細は「こちら」を参照
show_inputs詳細は「こちら」を参照

  「Accurate MACD.mq4」における、#property命令を記述した部分の解釈を示すと、以下のようになります。

#property explanation
#property命令

⑴ サブウィンドウに表示させる

 #property indicator_separate_window命令によって、「Accurate MACD.mq4」は、サブウィンドウに表示されます。

⑵ 4種類のデータを表示させる

 「Accurate MACD.mq4」では、以下の4つのデータを表示させます。

  • MACDを表すライン
  • MACDシグナルを表すライン
  • 正のヒストグラム(MACD-MACDシグナル≧0)
  • 負のヒストグラム(MACD-MACDシグナル<0)

 したがって、#property indicator_buffers命令には、「」を指定します。

⑶ 色を指定する

 「Accurate MACD.mq4」で表示される4つのデータの表示色を指定します。

  • #property indicator_color1 Aqua
    1番目のインジケーターとしてMACDを指定する(後述)ので、#property indicator_color命令には「」を指定し、表示色を「Aqua」に指定しています。
  • #property indicator_color2 Red
    2番目のインジケーターとしてMACDシグナルを指定する(後述)ので、#property indicator_color命令には「」を指定し、表示色を「Red」に指定しています。
  • #property indicator_color3 OrangeRed
    3番目のインジケーターとして正のヒストグラムを指定する(後述)ので、#property indicator_color命令には「」を指定し、表示色を「OrangeRed」に指定しています。
  • #property indicator_color4 BlueViolet
    4番目のインジケーターとして負のヒストグラムを指定する(後述)ので、#property indicator_color命令には「」を指定し、表示色を「BlueViolet」に指定しています。

⑷ 線の太さを指定する

 「Accurate MACD.mq4」で表示される4つのデータの線の太さを指定します。

  • #property indicator_width1 1
    1番目のインジケーターとしてMACDを指定する(後述)ので、#property indicator_width命令には「」を指定し、線の太さを「1」に指定しています。
  • #property indicator_width2 1
    2番目のインジケーターとしてMACDシグナルを指定する(後述)ので、#property indicator_width命令には「」を指定し、線の太さを「1」に指定しています。
  • #property indicator_width3 2
    3番目のインジケーターとして正のヒストグラムを指定する(後述)ので、#property indicator_width命令には「」を指定し、線の太さを「2」に指定しています。
  • #property indicator_width4 2
    4番目のインジケーターとして負のヒストグラムを指定する(後述)ので、#property indicator_width命令には「」を指定し、線の太さを「2」に指定しています。

>>目次に戻る

3.インジケーターバッファーの宣言

 インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。

 配列の詳細については「こちら」を参照してください。

 「Accurate MACD.mq4」における、インジケーターバッファーを宣言した部分の解釈を示すと、以下のようになります。

Indicator Buffer
インジケーターバッファーの宣言

⑴ 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
    終 値
    PRICE_OPEN
    始 値
    PRICE_HIGH
    高 値
    PRICE_LOW
    安 値
    PRICE_MEDIAN
    中央値

    (高値+安値)÷2
    PRICE_TYPICAL
    代表値

    (高値+安値+終値)÷3
    PRICE_WEIGHTED
    加重終値

    (高値+安値+終値+終値)÷4

>>目次に戻る

5.基本設定の記述

 「Accurate MACD.mq4」におけるinit()関数内に記述したコードについて解説します。

int init()
基本設定の記述

⑴ SetIndexBuffer()とは

 SetIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域に割り当てるものです。

 バッファーBufferとは、データを一時的に蓄える記憶領域のことをいいます。

 SetIndexBuffer()関数の詳細については「こちら」を参照してください。

⑵ SetIndexLabel()とは

 SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。

 SetIndexLabel()関数の詳細については「こちら」を参照してください。

⑶ IndicatorShortName()とは

 IndicatorShortName()とは、MQL4であらかじめ定義されている関数で、データウィンドウとサブウィンドウに表示されるインジケーターの名前等を表示させるものです。

 IndicatorShortName()関数の詳細については「こちら」を参照してください。

⑷ SetIndexStyle()とは

 SetIndexStyle()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画スタイル(線orヒストグラム、色など)を設定するものです。

 SetIndexStyle()関数の詳細については「こちら」を参照してください。

⑸ SetIndexDrawBegin()とは

 SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。

 SetIndexDrawBegin()関数の詳細については「こちら」を参照してください。

>>目次に戻る

6.具体的な処理内容

 「Accurate MACD.mq4」におけるstart()関数内に記述したコードについて解説します。

 

Download (PDF, 293KB)

⑴ int limit = ……について

 「limit」という変数を、「Bars – IndicatorCounted()」を初期値として宣言しています。

 Barsとは、MQL4であらかじめ定義されている変数で、チャートウィンドウに表示されているバーの本数を格納しているものです。

 Barsの詳細については「こちら」を参照してください。

 IndicatorCounted()とは、MQL4であらかじめ定義されている関数で、インジケーターの確定値が計算されたバー=現在のバー以外の本数を取得するものです。

 IndicatorCounted()関数の詳細については「こちら」を参照してください。

 したがって、limitは、以下の値を格納する変数ということになります。

  1. インジケーターをチャートに適用した時点(1ティック目)では、IndicatorCounted()関数によって取得される値は「」なので、limitにはBarsに格納されている値と同じ値、すなわち、チャートに表示されているバーの本数が格納される
  2. 2ティック目以降は、IndicatorCounted()関数によって取得される値は、チャートに表示されているバーの本数から現在のバーを除いた値なので、limitには常にが格納される

 変数limitをこのように定義するのは、インジケーターの値の再計算を最適化するためです。

 すなわち、インジケーターの値は、現在のバーについては、レートが変動するごとに再計算する必要がありますが、すでに確定したバーについては、再計算する必要はないので、インジケーターをチャートに適用してから2ティック目以降は、まだ確定していない現在のバーについてのみ、インジケーターの値を再計算するようにしています。

⑵ MACDの計算

 MACDの計算式は、「短期EMA-長期EMA」となります。

ア Fast_EMA

 短期EMAを算出しています。

イ Slow_EMA

 長期EMAを算出しています。

ウ MACD

 「短期EMA-長期EMA」を計算することによって、MACDを算出しています。

  • for()文の詳細については「こちら」を参照してください。
  • iMA()関数の詳細については「こちら」を参照してください。
  • NormalizeDouble()関数の詳細については「こちら」を参照してください。
  • MarketInfo()関数の詳細については「こちら」を参照してください。

⑶ 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」というインジケーターバッファーに格納します。

>>目次に戻る

7.関連ツール

インジケーターつくーる
インジケーターつくーる
インジケーターつくーる | fx-on.com

インジケーターつくーる
インジケーターつくーる | fx-on.com

 上記ツール(インジケーターつくーるインジケーターつくーる | fx-on.com)の詳細については「こちらインジケーターつくーる | fx-on.com」を参照してください。

 「インジケーターつくーる」の無料マニュアルは「こちら」からダウンロードできます。

>>目次に戻る

8.関連インジケーター

リペイントしない見やすいMACD
見やすいMACD
見やすいMACD | fx-on.com

見やすいMACD
見やすいMACD | fx-on.com

 上記インジケーター(見やすいMACD見やすいMACD | fx-on.com)の詳細については「こちら見やすいMACD | fx-on.com」を参照してください。

>>目次に戻る

9.関連EA

MACDを使用した損小利大なトレンドフォローEA。
CycleTrapMACD2_SCAL_GBPJPY
CycleTrapMACD2_SCAL_GBPJPY | fx-on.com

CycleTrapMACD2_SCAL_GBPJPY
CycleTrapMACD2_SCAL_GBPJPY | fx-on.com

 上記EA(CycleTrapMACD2_SCAL_GBPJPYCycleTrapMACD2_SCAL_GBPJPY | fx-on.com)の詳細については「こちらCycleTrapMACD2_SCAL_GBPJPY | fx-on.com」を参照してください。

>>目次に戻る

10.関連書籍

>>Amazonで購入する

>>目次に戻る


MT4の使い方からプログラミングまで、わかりやすく解説