トレンド系のインジケータとして人気のボリンジャーバンドを、MQL4 の iBands() 関数を使って自作してみましょう。ミドルバンド・アッパーバンド・ロワーバンドの3本を表示するシンプルなインジケータです。
ボリンジャーバンドとは

ボリンジャーバンドは、移動平均線(ミドルバンド)の上下に、価格のばらつきを表す標準偏差(σ)の何倍かの幅でバンドを引いたインジケータです。価格の変動が大きくなるとバンドの幅が広がり、小さくなると狭まります。
価格が正規分布に従うと仮定すると、±1σの範囲に約68%、±2σの範囲に約95%が収まる計算になります。実際の相場は正規分布どおりには動かないので、あくまで目安として使います。MT4 標準のボリンジャーバンドは、期間20・偏差2(±2σ)が既定値です。
iBands() 関数の引数
MQL4 では、ボリンジャーバンドの値を iBands() 関数で取得します。
|
1 2 3 4 5 6 7 8 9 10 |
double iBands( string symbol, // symbol int timeframe, // timeframe int period, // averaging period double deviation, // standard deviations int bands_shift, // bands shift int applied_price, // applied price int mode, // line index int shift // shift ); |
各引数の意味は次のとおりです。
| 引数 | 型 | 意味 |
| symbol | string | 通貨ペア名。NULL で現在のチャートの通貨ペア |
| timeframe | int | 時間足。ENUM_TIMEFRAMES の値で、0 で現在のチャートの時間足 |
| period | int | ミドルバンド(移動平均)を計算する期間 |
| deviation | double | ミドルバンドから標準偏差(σ)の何倍離すか。2 なら ±2σ |
| bands_shift | int | バンドを右へずらす本数。通常は 0 |
| applied_price | int | 計算に使う価格。ENUM_APPLIED_PRICE の値(PRICE_CLOSE など) |
| mode | int | 取得するライン。MODE_MAIN(0)=ミドル、MODE_UPPER(1)=アッパー、MODE_LOWER(2)=ロワー |
| shift | int | 何本前のバーの値を取るか。0 が現在足 |
Ref: iBands – MQL4 Documentation
サンプルコード
ミドル・アッパー・ロワーの3本を描画するサンプルです。既定値は期間20・±2σで、MT4 標準のボリンジャーバンドと同じ設定にしています。MetaEditor で新規のカスタムインジケータを作成し、次のコードを貼り付けてコンパイルしてください。
|
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
//+------------------------------------------------------------------+ // BollingerBand_01.mq4 //+------------------------------------------------------------------+ #property strict // インジケーターをチャートウィンドウに表示させる #property indicator_chart_window // インジケーター描画用のバッファー数 #property indicator_buffers 3 // 1番目(ミドルバンド)の描画スタイル・色・ラベル #property indicator_type1 DRAW_LINE #property indicator_color1 clrAqua #property indicator_label1 "Middle" // 2番目(アッパーバンド) #property indicator_type2 DRAW_LINE #property indicator_color2 clrMagenta #property indicator_label2 "Upper" // 3番目(ロワーバンド) #property indicator_type3 DRAW_LINE #property indicator_color3 clrMagenta #property indicator_label3 "Lower" input int AveragePeriod = 20; // 平均期間 input double Deviation = 2.0; // 標準偏差(σ) // インジケータのバッファ double BufferMain[]; double BufferUpper[]; double BufferLower[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit(){ // Buffer配列を表示用として設定 SetIndexBuffer(0, BufferMain); SetIndexBuffer(1, BufferUpper); SetIndexBuffer(2, BufferLower); // 計算に必要な本数がそろうまでは線を描かない SetIndexDrawBegin(0, AveragePeriod); SetIndexDrawBegin(1, AveragePeriod); SetIndexDrawBegin(2, AveragePeriod); 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[]) { // 初回は全バー、2回目以降は新しいバーと現在足だけを計算する int limit = rates_total - prev_calculated; if(prev_calculated > 0) limit++; for(int i = limit - 1; i >= 0; i--){ // Main(ミドルバンド) BufferMain[i] = iBands( NULL, // 通貨ペア名, NULLは現在の通貨ペア 0, // 時間足, 0は現在の時間足、ENUM_TIMEFRAMES AveragePeriod, // 平均する期間 Deviation, // 標準偏差 0, // バンドシフト PRICE_CLOSE, // サンプリングする価格, ENUM_APPLIED_PRICE MODE_MAIN, // インジケータライン i // 0が現在値で過去へのシフト ); // Upper(アッパーバンド) BufferUpper[i] = iBands(NULL, 0, AveragePeriod, Deviation, 0, PRICE_CLOSE, MODE_UPPER, i); // Lower(ロワーバンド) BufferLower[i] = iBands(NULL, 0, AveragePeriod, Deviation, 0, PRICE_CLOSE, MODE_LOWER, i); } return rates_total; } |
コードのポイント
計算するバーを絞り、現在足は毎回計算し直す
OnCalculate() はティックが来るたびに呼ばれます。初回(prev_calculated が0)は全バーを計算し、2回目以降は新しくできたバーと現在足だけを計算します。
2回目以降は rates_total – prev_calculated が0(新しい足ができていない)または1(新しい足ができた)になります。そのままでは足が確定するまで現在足が計算されないので、1を足して現在足を毎回計算し直しています。
※以前のサンプルは Bars – prev_calculated のままループしていたため、2回目以降に現在足のバンドが更新されませんでした。この点を修正しています。
標準偏差は double 型で受け取る
iBands() の deviation 引数は double 型です。input も double にしておくと、1.5σ のような小数の設定もパラメータ画面から入力できます。
3本のラインは mode だけを変えて呼び出す
ミドル・アッパー・ロワーは、同じ引数のまま mode を MODE_MAIN、MODE_UPPER、MODE_LOWER と変えて iBands() を3回呼び出して取得します。
計算に足りない部分は描画しない
チャートの左端(古いバー)には、平均期間ぶんのデータがそろっていない部分があります。SetIndexDrawBegin() で描画開始位置を平均期間ぶんずらし、不正確な線が出ないようにしています。
パラメータの表示名
#property strict を宣言するとコンパイラのチェックが厳しくなりますが、input 変数の右側に書いたコメントが、パラメータ画面の表示名として使われるようになります。
|
1 |
input double Deviation = 2.0; // 標準偏差(σ) |
この例では、変数名の Deviation ではなく「標準偏差(σ)」と表示されます。

※画像は以前のサンプル(標準偏差の既定値1)での表示です。
標準偏差を1にすれば±1σ、3にすれば±3σのバンドになります。±1σと±2σを同時に表示したいときは、このインジケータを2つ挿入して標準偏差を変えてください。




















