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

