MT4 インディケーター作成講座 ボリンジャーバンドの幅を文字で表示する

前回の記事で、チャートにスプレッドを表示するインディケーターを作製しました。
今回はそれの応用で、よくつかわれるテクニカル指標のボリンジャーバンドの現在の幅を文字で表示するインディケーターを作成してみます。
今回作ったものはこちら →BBWith.zip
こちらが今回のソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
//+------------------------------------------------------------------+ //| BBWidth.mq4 | //| fxzeniken | //| https://fx.zeniken.net | //+------------------------------------------------------------------+ #property copyright "fxzeniken" #property link "https://fx.zeniken.net" #property version "1.00" #property strict #property indicator_chart_window input int BB_Period=20; input double BB_Dev=2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping ObjectCreate("BBW",OBJ_LABEL,0,0,0); ObjectSet("BBW",OBJPROP_CORNER,1); ObjectSet("BBW",OBJPROP_YDISTANCE,15); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int pipbairitu=0; if(Digits==5) pipbairitu=10000; if(Digits==4)pipbairitu=1000; if(Digits==3) pipbairitu=100; if(Digits==2)pipbairitu=10; //-- double bbw=MathRound((iBands(NULL,0,BB_Period,BB_Dev,0,PRICE_CLOSE,1,0)-iBands(NULL,0,BB_Period,BB_Dev,0,PRICE_CLOSE,2,0))*pipbairitu); string bbwtext=StringConcatenate("BBWidth :(",BB_Period,")",bbw); ObjectSetText("BBW",bbwtext,10,NULL,White); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ |
ボリンジャーバンドの値を計算する iBands();
MQLでボリンジャーバンドの値を求めるには、組み込みテクニカル指標の iBandsを使用します。
iBands関数のパラメーター
①symbol 通貨ペア
通貨ペアを設定します。 「NULL」と書けば、プログラムを挿入したチャートの通貨ペアを使用します
②timeframe 時間枠
計算に使用する時間枠を設定します。 「0」で現在のチャート上の時間枠を使用します。
マルチタイムフレームのインディを作りたい場合は、それぞれの時間を設定します。
設定は分で行い、 1時間足なら60、4時間足なら240、日足なら1440 というう風に設定します。
③Period ボリンジャーバンドを算出するバーの本数
ボリンジャーバンドを算出する期間を設定します。
今回のプログラムでは、変数を設定し、後で自由に数値を変更できるようにしています。
④deviation ボリンジャーバンドの標準偏差(σ)
ボリンジャーバンドのσは標準偏差のことで よく見るのは2σです。
deviationは上下バンドの幅を指定します。
これも変数を指定し、後で変更できるようにしています。
⑤bands_Shift バンドを右方向へずらすバーの数
一目均衡線の遅行線のように、右方向へずらす場合、その数を指定します。
基本的には0でOKです。
⑥applied_Price 適応する価格
ボリンジャーバンドの計算にどの価格を使うかを指定します。 基本的には終値を使うのでPRICE_CLOSEとなっています。
他にも始値、高値などいろいろな値で計算できます
PRICE_CLOSE 終値
PRICE_OPEN 始値
PRICE_HIGH 高値
PRICE_LOW 安値
PRICE_MEDIAN (高値+安値)÷2
PRICE_TYPICAL (高値+安値+終値)÷3
PRICE_WIGHTED(高値+安値+終値*2)÷4
⑦mode どのラインの値を取得するか
ボリンジャーバンドには3つの線があるので、どの線の値を取得するかを指定します。
中間線は0
上のバンドは1
下のバンドは2です。
⑧shift 現在のバーから何本目のバーの値を取得するか
現在のバーの値を取得したい場合は0、1本前の値を取得する場合は1のように記述します。
現在のバーが0で、過去のバーつまり、左に進むにつれて数字が増えていきます。
値をpips表示にする
ボリンジャーバンドの幅を普通に計算すると、通貨ペアの値の単位で表示されます。
これだと、小数点が増え個人的にはとても見づらいので、このインディケーターではpipsで表示できるようにしています。
そのあたりの処理の流れとしては、まず以下のコード
1 2 3 4 5 6 |
int pipbairitu=0; if(Digits==5) pipbairitu=10000; if(Digits==4)pipbairitu=1000; if(Digits==3) pipbairitu=100; if(Digits==2)pipbairitu=10; |
digitsは現在の通貨ペアの小数点以下が何桁あるかを返します。
もし小数点以下が5桁あれば、計算結果に10000を掛け、整数にしてしまいます。
そして、iBandsを二つ使い、その差に先ほどの倍率をかけています。
1 |
double bbw=MathRound((iBands(NULL,0,BB_Period,BB_Dev,0,PRICE_CLOSE,1,0)-iBands(NULL,0,BB_Period,BB_Dev,0,PRICE_CLOSE,2,0))*pipbairitu); |
MathRound関数は実数を整数にして、四捨五入をしてくれる関数です。
表示周りは、前回作成した現在のスプレッドを表示するインディケーターとまったく同じですので、そちらを参考にしてください。
