ボリンジャーバンド(Bollinger Bands:標準偏差帯)とは、ジョン・ボリンジャー(John Bollinger)氏によって考案されたインジケーターで、単純移動平均線(=SMA)を中心として、その上下に、当該SMAの計算期間と同期間における標準偏差の整数倍のラインを引いたもので、ボラティリティや現在の価格水準の高低を分析するために使用するものです。
ボリンジャーバンドの計算式は、以下のとおりです。
- 上方バンド:SMAの値+(標準偏差×掛け率)
- 下方バンド:SMAの値-(標準偏差×掛け率)
- 掛け率:任意の値(通常は「2」)
- SMAの計算期間:任意の値(通常は「20」)
標準偏差の計算式は、以下のとおりです。
MetaTrader4(MT4)では、「ナビゲータウィンドウ」の「罫線分析ツール」ディレクトリにおける「Bands」をチャートに適用することによって、ボリンジャーバンドを表示させることができます。
そこで、MT4で標準では搭載されていない、ハル移動平均線を中心線としたボリンジャーバンド(Bollinger Bands in HMA.mq4)の作成方法について解説します。
なお、事前に「HMA.zip」(=ハル移動平均線を表示させるインジケーター)をダウンロードして展開し、展開後のファイル(HMA.mq4)を「Cドライブ」→「Program Files」→「MetaTrader4」→「MQL4」→「Indicators」に格納しておいてください。
1.全体像
MT4でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。
- #property命令を記述する。
- インジケーターバッファーの宣言を行う。
- 変数の宣言を行う。
- init()関数内にインジケーターの基本的な設定を記述する。
- start()関数内に具体的な処理内容を記述する。
以下のサンプルコードをダウンロードして記事を読み進めてください。
2.#property命令の記述
#property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。
#property命令の詳細については「こちら」を参照してください。
「Bollinger Bands in HMA.mq4」における、#property命令を記述した部分の解釈を示すと、以下のようになります。
⑴ チャートウィンドウに表示させる
# property indicator_chart_window命令によって、「Bollinger Bands in HMA.mq4」は、チャートウィンドウに表示されます。
⑵ 3種類のデータを表示させる
「Bollinger Bands in HMA.mq4」では、以下の3つのデータを表示させます。
- 上方バンドの値を示すライン
- 中間線の値を示すライン
- 下方バンドの値を示すライン
したがって、#property indicator_buffers命令には、「3」を指定します。
⑶ 色を指定する
「Bollinger Bands in HMA.mq4」で表示される3つのデータの表示色を指定します。
- #property indicator_color1 Magenta
1番目のインジケーターとして上方バンドの値を示すラインを指定する(後述)ので、#property indicator_color命令には「1」を指定し、表示色を「Magenta」に指定しています。 - #property indicator_color2 White
2番目のインジケーターとして中間線の値を示すラインを指定する(後述)ので、#property indicator_color命令には「2」を指定し、表示色を「White」に指定しています。 - #property indicator_color3 Aqua
3番目のインジケーターとして下方バンドの値を示すラインを指定する(後述)ので、#property indicator_color命令には「3」を指定し、表示色を「Aqua」に指定しています。
⑷ 線の太さを指定する
「Bollinger Bands in HMA.mq4」で表示される3つのデータの線の太さを指定します。
- #property indicator_width1 1
1番目のインジケーターとして上方バンドの値を示すラインを指定する(後述)ので、#property indicator_width命令には「1」を指定し、線の太さを「1」に指定しています。 - #property indicator_width2 1
2番目のインジケーターとして中間線の値を示すラインを指定する(後述)ので、#property indicator_width命令には「2」を指定し、線の太さを「1」に指定しています。 - #property indicator_width3 1
3番目のインジケーターとして下方バンドの値を示すラインを指定する(後述)ので、#property indicator_width命令には「3」を指定し、線の太さを「1」に指定しています。
3.インジケーターバッファーの宣言
インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。
インジケーターバッファーの詳細については「こちら」を参照してください。
「Bollinger Bands in HMA.mq4」における、インジケーターバッファーを宣言した部分の解釈を示すと、以下のようになります。
⑴ double Upper[];
上方バンドの値を格納していく配列です。
⑵ double Middle[];
中間線の値を格納していく配列です。
⑶ double Lower[];
下方バンドの値を格納していく配列です。
4.変数の宣言
「Bollinger Bands in HMA.mq4」においては、以下の項目をパラメーターとして指定します。
- ボリンジャーバンドの計算期間
- 中間線に対する掛け率
上記の項目は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、以下に示すように「外部変数」として宣言します。
- extern int MA_Period
ボリンジャーバンドの計算期間 - extern double Multiplier
中間線に対する掛け率
5.基本設定の記述
「Bollinger Bands in HMA.mq4」におけるinit()関数内に記述したコードについて解説します。
⑴ SetIndexBuffer()とは
SetIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域(データを一時的に蓄えるデータ領域)に割り当てるものです。
SetIndexBuffer()関数の詳細については「こちら」を参照してください。
⑵ SetIndexLabel()とは
SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。
SetIndexLabel()関数の詳細については「こちら」を参照してください。
⑶ SetIndexStyle()とは
SetIndexStyle()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画スタイル(線orヒストグラム、色など)を設定するものです。
SetIndexStyle()関数の詳細については「こちら」を参照してください。
⑷ SetIndexDrawBegin()とは
SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。
SetIndexDrawBegin()関数の詳細については「こちら」を参照してください。
6.具体的な処理内容
「Bollinger Bands in HMA.mq4」におけるstart()関数内に記述したコードについて解説します。
⑴ int limit=……について
「limit」という変数を、「Bars-IndicatorCounted()」を初期値として宣言しています。
当該コードの詳細については「こちら」を参照してください。
⑵ 中間線の計算
「Bollinger Bands in HMA.mq4」の中間線はハル移動平均線なので、中間線を算出するためには、ハル移動平均線の値を取得する必要があります。
ア ハル移動平均線の値を取得する
「iCustom()関数」を使用して、中間線となるハル移動平均線の値を算出し、その値を配列「Middle[]」に順次格納していきます。
iCustom()関数とは、MQL4であらかじめ定義されている関数で、MT4のユーザーが独自に作成したインジケーターの値を取得するものです。
iCustom()関数の詳細については「こちら」を参照してください。
イ ハル移動平均線の値を正規化する
NormalizeDouble()関数を使用して、配列「Middle[]」に格納されている値を、順次提示レートの小数点以下の桁数で四捨五入していきます。
NormalizeDouble()関数の詳細については「こちら」を参照してください。
⑶ 上方バンドの計算
ア 変数の宣言
上方バンドは、「中間線の値+(標準偏差×掛け率)」により算出され、標準偏差は、以下の計算式により算出されます。
そこで、上方バンドの算出に使用するため、以下の変数を宣言します。
- double Sigma
標準偏差の値を格納する変数です。 - double Sum_1
期間内の終値の2乗の合計を格納する変数です。 - double Sum_2
期間内の終値の合計の2乗を格納する変数です。
イ 各種合計の算出
- Sum_1+=MathPow(Close[j],2);
MathPow()関数を使用して計算期間内の終値の2乗を算出し、その値を「+=」演算子で順次加えて行くことによって、「期間内の終値の2乗の合計」を算出し、その値を変数「Sum_1」に格納しています。
MathPow()関数の詳細については「こちら」を参照してください。 - Sum_2+=Close[j];
「+=」演算子で計算期間内の終値を順次加えていくことによって、「期間内の終値の合計」を算出し、その値を変数「Sum_2」に格納しています。
ウ 期間内の終値の2乗の合計の算出
「期間内の終値の合計」が格納されている変数「Sum_2」に、MathPow()関数を使用して「期間内の終値の合計の2乗」を算出し、その値を変数「Sum_2」に格納しています。
MathPow()関数の詳細については「こちら」を参照してください。
エ 平方根を求める値の算出
変数「Sum_1」(=期間内の終値の2乗の合計)に変数「MA_Period」(=計算期間)を乗じた値から、変数「Sum_2」(=期間内の終値の合計の2乗)を減じた値を算出したうえで、当該値を変数「MA_Period」に「MA_Period-1」を乗じた値で除し、算出された値を変数「Value」(=平方根を求める値)に格納しています。
オ 標準偏差の算出
MathSqrt()関数を使用して変数「Value」の平方根を算出し、その値を変数「Sigma」(=標準偏差)に格納しています。
MathSqrt()関数の詳細については「こちら」を参照してください。
カ 上方バンドの算出
配列「Middle[]」(=中間線)に、変数「Multiplier」(=掛け率)に変数「Sigma」(=標準偏差)を乗じた値を加算し、その値を配列「Upper[]」(=上方バンド)に順次格納していきます。
キ 上方バンドの正規化
NormalizeDouble()関数を使用して、配列「Upper[]」(=上方バンド)に格納された値を、順次、提示レートの小数点以下の桁数で四捨五入していきます。
NormalizeDouble()関数の詳細については「こちら」を参照してください。
⑷ 下方バンドの計算
ア 標準偏差の算出
上記「⑶ア~オ」と同様の手順で、標準偏差を算出し、その値を変数「Sigma」(=標準偏差)に格納しています。
イ 下方バンドの算出
配列「Middle[]」(=中間線)から、変数「Multiplier」(=掛け率)に変数「Sigma」(=標準偏差)を乗じた値を減じ、その値を配列「Lower[]」(=下方バンド)に順次格納していきます。
ウ 下方バンドの正規化
NormalizeDouble()関数を使用して、配列「Lower[]」(=下方バンド)に格納された値を、順次、提示レートの小数点以下の桁数で四捨五入していきます。
NormalizeDouble()関数の詳細については「こちら」を参照してください。