iBandsOnArray()関数

iBandsOnArray()関数は、配列に格納された価格データからボリンジャーバンドを算出し、その値を返します。
配列内の価格データを使用するため、通貨ペア名、時間枠、適用価格の指定は必要としません。
価格データは事前に用意しておく必要があります。
ボリンジャーバンドは左から右に(古い価格データから新しい価格データに向かって)計算されます。右から左に(新しい価格データから古い価格データに向かって)計算するためには、ArraySetAsSeries()関数を使用します。

iBandsOnArray()関数について

iBandsOnArray()関数の()括弧内は次のように指定します。

iBandsOnArray(データ配列, 配列要素数, 計算期間, 標準偏差, インジケーターシフト数, ライン種類, シフト数)

データ配列
価格データが格納されている配列を指定します。

配列要素数
配列の要素数を指定します。0(ゼロ)は全要素を指定したことになります。

計算期間
計算する期間(ローソク足の本数)を整数で指定します。

標準偏差
主線からの偏差を数値で指定します。

インジケーターシフト数
インジケーターの表示をシフトする(ずらす)ローソク足の本数を整数で指定します。

ライン種類
インジケーターラインの種類を次の表の整数または定数で指定します。

上ライン 1 MODE_UPPER
下ライン 2 MODE_LOWER

シフト数
ローソク足何本分前かを指定します。

サンプルコード

#property strict
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 DodgerBlue    // RSI
#property indicator_color2 LightSeaGreen // middle line
#property indicator_color3 LightSeaGreen // Upper band
#property indicator_color4 LightSeaGreen // Lower band

//--- indicator parameters
extern int RSIPeriod = 14;
extern int BandsPeriod = 20;
extern double BandsDeviation = 2.0;

//---- buffers
double rsi[];    // RSI
double middle[]; // middle line
double upper[];  // Upper band
double lower[];  // Lower band

//+------------------------------------------------------------------+
int OnInit(void)
{
//--- indicator buffers mapping
   IndicatorShortName("RSI Bands"); 

   SetIndexBuffer(0,rsi);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,"RSI");

   SetIndexBuffer(1,middle);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexLabel(1,"Bands SMA");

   SetIndexBuffer(2,upper);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexLabel(2,"Bands Upper");

   SetIndexBuffer(3,lower);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexLabel(3,"Bands Lower");

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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 i;
   int limit;
   if (prev_calculated == 0)
      limit = rates_total - 1;
   else
      limit = rates_total - prev_calculated;
   
   // RSIの値を配列rsiに格納する
   for(i=limit-1; i>=0; i--)
   { 
      rsi[i] = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);
   }

   // iBandsOnArray()関数で配列rsiからボリンジャーバンドの各値を取得する
   for(i=limit-1; i>=0; i--)
   { 
      middle[i] = iBandsOnArray(rsi, 0, BandsPeriod, BandsDeviation, 0, MODE_MAIN, i);
      upper[i] = iBandsOnArray(rsi, 0, BandsPeriod, BandsDeviation, 0, MODE_UPPER, i);
      lower[i] = iBandsOnArray(rsi, 0, BandsPeriod, BandsDeviation, 0, MODE_LOWER, i);
   }

   return(rates_total);
}

上記のサンプルコードは、RSIラインと、そのボリンジャーバンドを表示するインジケーターのコードです。
「RSIラインのボリンジャーバンド」を取得するために、iBandsOnArray()関数を使用しています。