ハル移動平均線とは?インジケーターを自作してみよう!書き方や計算式、サンプルコードあり!

Hull-Moving-Average

ハル移動平均線(Hull Moving Average)とは、アラン・ハル(Alan Hull)氏によって考案された移動平均線で、通常の移動平均線よりも価格変動に敏感に反応し、かつ、その曲線も滑らかに表示されるものです。

ハル移動平均線の計算式は、以下のとおりです。

  • 期間「n1」:ハル移動平均線の計算期間
  • 期間「n2」:n1÷2(端数は切り捨てる)
  • 期間「n3」:n1の平方根(端数は切り捨てる)
  • 値「value」:
    期間n2の線形加重移動平均×2-期間n1の線形加重移動平均
  • ハル移動平均線=値valueの期間n3の線形加重移動平均

Hull-Moving-Average

1.全体像

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

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

以下のサンプルコードをダウンロードして見ながら記事を読み進めてください!

Hull-Moving-Average-Code

2.#property命令の記述

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

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

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

property-in-Hull

#property命令

⑴ チャートウィンドウに表示させる

# property indicator_chart_window命令によって、「Hull Moving Average.mq4」は、チャートウィンドウに表示されます。

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

「Hull Moving Average.mq4」では、以下の2つのデータを表示させます。

  • ハル移動平均線の値の上昇を示すライン
  • ハル移動平均線の値の下落を示すライン

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

⑶ 色を指定する

「Hull Moving Average.mq4」で表示される2つのデータの表示色を指定します。

  • #property indicator_color1 Magenta
    1番目のインジケーターとしてハル移動平均線の値の上昇を示すラインを指定する(後述)ので、#property indicator_color命令には「1」を指定し、表示色を「Magenta」に指定しています。
  • #property indicator_color2 Aqua
    2番目のインジケーターとしてハル移動平均線の値の下落を示すラインを指定する(後述)ので、#proerty indicator_color命令には「2」を指定し、表示色を「Aqua」に指定しています。

⑷ 線の太さを指定する

「Hull Moving Average.mq4」で表示される2つのデータの線の太さを指定します。

  • #property indicator_width1 4
    1番目のインジケーターとしてハル移動平均線の値の上昇を示すラインを指定する(後述)ので、#property indicator_width命令には「1」を指定し、線の太さを「4」に指定しています。
  • #property indicator_width2 4
    2番目のインジケーターとしてハル移動平均線の値の下落を示すラインを指定する(後述)ので、#property indicator_width命令には「2」を指定し、線の太さを「4」に指定しています。

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

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

インジケーターバッファーの詳細については「こちら」を参照してください。

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

Indicator-Buffer-in-Hull-Moving-Average

 

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

⑴ double Up[];

ハル移動平均線の値が上昇している場合の各値を格納していく配列です。

⑵ double Down[];

ハル移動平均線の値が下落している場合の各値を格納していく配列です。

⑶ double Ex_MA[];

上述した「value」の値を格納していく配列です。

⑷ double Hull[];

上述した「ハル移動平均」の値を格納していく配列です。

4.変数の宣言

「Hull Moving Average.mq4」においては、以下の項目をパラメーターとして指定します。

  • ハル移動平均線の計算期間
  • ハル移動平均線の計算に用いる値

上記の項目は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、以下に示すように「外部変数」として宣言します。

  • extern int HMA_Period
    ハル移動平均線の計算期間
  • extern int Applied_Price
    ハル移動平均線の計算に用いる値
    以下の表に従って指定します。

    種 類
    定 数
    内 容
    PRICE_CLOSE
    終 値
    PRICE_OPEN
    始 値
    PRICE_HIGH
    高 値
    PRICE_LOW
    安 値
    PRICE_MEDIAN
    中央値
    (高値+安値)÷2
    PRICE_TYPICAL
    代表値
    (高値+安値+終値)÷3
    PRICE_WEIGHTED
    加重終値
    (高値+安値+終値+終値)÷4

5.基本設定の記述

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

Initial-Settings-in-Hull

基本設定の記述

⑴ IndicatorBuffers()とは

IndicatorBuffers()は、MQL4であらかじめ定義されている関数で、インジケーターの計算に使用するバッファーの個数を指定するものです。

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

⑵ SetIndexBuffer()とは

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

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

⑶ SetIndexLabel()とは

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

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

⑷ SetIndexStyle()とは

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

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

⑸ SetIndexDrawBegin()とは

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

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

6.具体的な処理内容

「Hull Moving Average.mq4」のstart()関数内に記述したコードについて解説します。

Hull-Moving-Average-Logic

⑴ int limit = ……について

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

当該コードの詳細については「こちら」を参照してください。

⑵ ハル移動平均線の計算

ハル移動平均線の計算式を再掲します。

  • 期間「n1」:ハル移動平均線の計算期間
  • 期間「n2」:n1÷2(端数は切り捨てる)
  • 期間「n3」:n1の平方根(端数は切り捨てる)
  • 値「value」:
    期間n2の線形加重移動平均×2-期間n1の線形加重移動平均
  • ハル移動平均線=値valueの期間n3の線形加重移動平均
ア 期間「n2」を算出する

期間「n2」の値は期間「n1」の値の2分の1なので、ハル移動平均線の計算期間として外部変数として宣言した「HMA_Period」を「2」で除し、その値を変数「Half_HMA_Period」に格納しています。

イ 端数を切り捨てる

期間「n2」の値は端数を切り捨てるので、変数「Half_HMA_Period」に格納されている値の小数点以下の数値を切り捨てる処理を行います。

MathFloor()とは、MQL4であらかじめ定義されている関数で、実数の小数点以下の数値を切り捨てる処理を行うものです。

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

ウ 値「value」を算出する

値「value」は、期間「n2」の線形加重移動平均に「2」を乗じた値から、期間「n1」の線形加重移動平均の値を減することによって算出されます。

そこで、期間「Half_HMA_Period」の線形加重移動平均に「2」を乗じた値から、期間「HMA_Period」の線形加重移動平均の値を減じた値を算出し、その値を配列「Ex_MA[]」に順次格納していきます。

  • iMA()関数の詳細については「こちら」を参照してください。
エ 期間「n3」を算出する

期間「n3」の値は期間「n1」の値の平方根なので、ハル移動平均線の計算期間として外部変数として宣言した「HMA_Period」の平方根を算出し、その値を変数「Square_Period」に格納しています。

MathSqrt()とは、MQL4であらかじめ定義されている関数で、指定した値の平方根を算出するものです。

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

オ 端数を切り捨てる

期間「n3」の値は端数を切り捨てるので、MathFloor()関数を使用して、変数「Square_Period」に格納されている値の小数点以下の数値を切り捨てる処理を行います。

カ ハル移動平均線の値を算出する

ハル移動平均線の値は、値「value」の期間「n3」の線形加重移動平均です。

そこで、iMAOnArray()関数を使用して、配列「Ex_MA[]」に格納されているデータを基にして、線形加重移動平均を算出し、その値を配列「Hull[]」に順次格納していきます。

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

キ ハル移動平均線の値を正規化する

NormalizeDouble()関数を使用して、配列「Hull[]」に格納されている値を、順次提示レートの小数点以下の桁数で四捨五入していきます。

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

⑶ 上昇と下落で表示色を分ける

「Hull Moving Average.mq4」においては、ハル移動平均線の表示色を、上昇の場合は「Magenta」、下落の場合は「Aqua」に分けています。

ア 上昇ラインを設定する

上昇ラインを設定するためには、配列「Hull[]」に格納されている値が増加している場合に、その値を配列「Up[]」に順次格納していきます。

当該処理を行っているコードの解釈を示すと、以下のようになります。

  • 現在のバーのハル移動平均線の値が、1本前のバーのハル移動平均線の値以上の場合は、配列「Hull[]」に格納されている現在のバーのハル移動平均線の値を、現在のバーに相当する配列「Up[]」に格納する。
  • 上記の場合において、1本前のバーのハル移動平均線の値が、2本前のバーのハル移動平均線の値以上の場合は、配列「Hull[]」に格納されている1本前のバーのハル移動平均線の値を、1本前のバーに相当する配列「Up[]」に格納する。
  • 下落線は表示させないので、配列「Down[]」には「EMPTY_VALUE」を格納する。
イ 下落ラインを設定する

下落ラインを設定するためには、配列「Hull[]」に格納されている値が減少している場合に、その値を配列「Down[]」に順次格納していきます。

当該処理を行っているコードの解釈を示すと、以下のようになります。

  • 現在のバーのハル移動平均線の値が、1本前のバーのハル移動平均線の値以下の場合は、配列「Hull[]」に格納されている現在のバーのハル移動平均線の値を、現在のバーに相当する配列「Down[]」に格納する。
  • 上記の場合において、1本前のバーのハル移動平均線の値が、2本前のバーのハル移動平均線の値以下の場合は、配列「Hull[]」に格納されている1本前のバーのハル移動平均線の値を、1本前のバーに相当する配列「Down[]」に格納する。
  • 上昇線は表示させないので、配列「Up[]」には「EMPTY_VALUE」を格納する。