лови
//+------------------------------------------------------------------+
//| BandsOnArray.mq4 |
//| Copyright © 2008, Serega Lykov |
//| http://mtexperts.narod.ru/ |
//| Наложение BollingerBands на какой-либо массив данных (индикатор) |
//+------------------------------------------------------------------+
// Данный индикатор накладывает BollingerBands на индикатор RSI.
// Вы можете изменить его, для наложение на какой-либо другой индикатор
#property copyright "Copyright © 2008, Serega Lykov"
#property link "http://mtexperts.narod.ru/"
//---- свойства индикатора ------------------------------------------+
// в зависимости от индикатора на который накладывается BB,
// надо закомментировать одну из этих двух строк
#property indicator_separate_window // BB накладывается на индикатор из отдельного окна (типа CCI, RSI, MACD и т.п.)
//#property indicator_chart_window // BB накладывается на индикатор из окна с графиком цены (типа MA, BollingerBands и т.п.)
// количество линий индикатора: 3 для BB, плюс линии индикатора, на который накладывается BB
// максимальное значение = 8
#property indicator_buffers 4 // 3 (BB) + 1 (RSI)
// цвет для каждой линии BB
#property indicator_color1 SeaGreen // цвет средней линии BB
#property indicator_color2 SeaGreen // цвет верхней линии BB
#property indicator_color3 SeaGreen // цвет нижней линии BB
// цвет для каждой линии индикатора на который накладывается BB
#property indicator_color4 Red // линии индикатора на который накладывается BB
//---- внешние параметры --------------------------------------------+
// параметры расчёта BollingerBands
extern int BandsPeriod = 20; // период усреднения
extern int BandsMethod = 0; // метод усреднения: 0 = Simple, 1 = Exponential,
// 2 = Smoothed, 3 = Weighted
extern int BandsShift = 0; // сдвиг индикатора относительно ценового графика
extern double BandsDeviations = 2.0; // отклонение
// параметры индикатора на который накладывается BB
extern int RSIPeriod = 14; // период RSI
extern int RSIPrice = 0; // цена наложения RSI: 0 = PRICE_CLOSE, 1 = PRICE_OPEN,
// 2 = PRICE_HIGH, 3 = PRICE_LOW, 4 = 0PRICE_MEDIAN,
// 5 = PRICE_TYPICAL, 6 = PRICE_WEIGHTED
//---- буфферы ------------------------------------------------------+
// массивы используемые для расчёта BollingerBands
double MiddleBuffer[]; // массив для средней линии BB
double UpperBuffer[]; // массив для верхней линии BB
double LowerBuffer[]; // массив для нижней линии BB
// массивы используемые для индикатора на который накладывается BB
double RSIBuffer[]; // массив для линии индикатора RSI
//---- глобальные переменные ----------------------------------------+
// у меня их здесь нет
//+------------------------------------------------------------------+
//| Функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
//---- установка "короткого" имени индикатора
IndicatorShortName("Bands("+BandsPeriod+","+DoubleToStr(BandsDeviations,2)+") On RSI"+"("+RSIPeriod+")");
//---- установка точности значений индикатора
IndicatorDigits(Digits); // та же, что и на ценовом графике
//---- установка горизонтальных уровней
SetLevelValue(0,70); // если indicator_chart_window,
SetLevelValue(1,30); // то уровни лучше удалить
SetLevelValue(2,50); // Вообще, уровни - это кому как нравится
//---- установка параметров линий BollingerBands
// установка стиля линий индикатора
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);
// установка массивов для линий индикатора
SetIndexBuffer(0,MiddleBuffer);
SetIndexBuffer(1,UpperBuffer);
SetIndexBuffer(2,LowerBuffer);
// установка начального бара отрисовки линий индикатора
SetIndexDrawBegin(0,RSIPeriod+BandsPeriod+BandsShift);
SetIndexDrawBegin(1,RSIPeriod+BandsPeriod+BandsShift);
SetIndexDrawBegin(2,RSIPeriod+BandsPeriod+BandsShift);
// установка названий линий индикатора
SetIndexLabel(0,"MiddleBB");
SetIndexLabel(1,"UpperBB");
SetIndexLabel(2,"LowerBB");
//---- установка параметров линий индикатора на который накладывается BB
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(3,RSIBuffer);
SetIndexDrawBegin(3,RSIPeriod);
SetIndexLabel(3,"RSI");
//---- конец инициализации
return(0);
}
//+------------------------------------------------------------------+
//| Bollinger Bands On Array |
//+------------------------------------------------------------------+
int start()
{
// если на графике мало баров, то индикатор не считается
if(Bars <= RSIPeriod+BandsPeriod) return(0);
// количество неизменённых после последнего вызова индикатора баров
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
// последний посчитанный бар будет пересчитан
if(counted_bars > 0) counted_bars--;
int limit = Bars - counted_bars;
//---- сначала высчитываются линии индикатора на который накладывается BB
for(int i=limit; i>=0; i--)
{
RSIBuffer[i] = iRSI(NULL,0,RSIPeriod,RSIPrice,i);
}
//---- затем накладываем BB на линию индикатора
for(i=0; i<limit; i++) MiddleBuffer[i] = iMAOnArray(RSIBuffer,0,BandsPeriod,BandsShift,BandsMethod,i);
while(i >= 0)
{
double sum = 0.0;
int k = i + BandsPeriod - 1;
double oldval = MiddleBuffer[i];
while(k >= i)
{
double newres = RSIBuffer[k] - oldval;
sum = sum + newres * newres;
k--;
}
double deviation = BandsDeviations * MathSqrt(sum/BandsPeriod);
UpperBuffer[i] = oldval + deviation;
LowerBuffer[i] = oldval - deviation;
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+