//+------------------------------------------------------------------+ //| Rj_SlidingRangeRj_Digit.mq5 | //| Copyright © 2011,RJ Rjabkov Alexander | //| rj-a@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011,RJ Rjabkov Alexander" #property link "rj-a@mail.ru" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буферов #property indicator_buffers 4 //---- использовано три графических построения #property indicator_plots 3 //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type1 DRAW_LINE //---- в качестве цвета линии индикатора использован зелёный цвет #property indicator_color1 clrLime //---- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width1 2 //---- отображение метки индикатора #property indicator_label1 "Upper Rj_SlidingRange" //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде многоцветной линии #property indicator_type2 DRAW_COLOR_LINE //---- в качестве цветов двухцветной линии использованы #property indicator_color2 clrMagenta,clrBlue //---- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора равна 4 #property indicator_width2 4 //---- отображение метки индикатора #property indicator_label2 "Middle Rj_SlidingRange" //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета линии индикатора использован красный цвет #property indicator_color3 clrRed //---- линия индикатора - непрерывная кривая #property indicator_style3 STYLE_SOLID //---- толщина линии индикатора равна 2 #property indicator_width3 2 //---- отображение метки индикатора #property indicator_label3 "Lower Rj_SlidingRange" //+-----------------------------------+ //| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА | //+-----------------------------------+ input uint CalcPeriodRange=5; input uint Digit=2; // количество разрядов округления input int Shift=0; // Сдвиг индикатора по горизонтали в барах //+-----------------------------------+ //---- индикаторные буферы double UpperBuffer[]; double MiddleBuffer[]; double LowerBuffer[]; double ColorMiddleBuffer[]; double PointPow10; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //+------------------------------------------------------------------+ //| Rj_SlidingRange Channel indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- Инициализация констант min_rates_total=int(CalcPeriodRange+1); PointPow10=_Point*MathPow(10,Digit); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,UpperBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); //---- осуществление сдвига индикатора по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(UpperBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,MiddleBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); //---- осуществление сдвига индикатора по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(MiddleBuffer,true); //---- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(2,ColorMiddleBuffer,INDICATOR_COLOR_INDEX); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(ColorMiddleBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(3,LowerBuffer,INDICATOR_DATA); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0); //---- осуществление сдвига индикатора по горизонтали на Shift PlotIndexSetInteger(2,PLOT_SHIFT,Shift); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(LowerBuffer,true); //---- инициализации переменной для короткого имени индикатора string shortname; StringConcatenate(shortname,"Rj_SlidingRangeRj_Digit(",CalcPeriodRange,")"); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- завершение инициализации } //+------------------------------------------------------------------+ //| Rj_SlidingRange Channel 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[] ) { //---- проверка количества баров на достаточность для расчёта if(rates_totalrates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров else limit=rates_total-prev_calculated; // стартовый номер для расчёта только новых баров //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); //---- основной цикл расчёта индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { int iii=bar+int(CalcPeriodRange)-1; double b1=0,b2=0; while(iii>=bar) { b1+=High[ArrayMaximum(High,iii,CalcPeriodRange)]; b2+=Low[ArrayMinimum(Low,iii,CalcPeriodRange)]; iii--; } UpperBuffer[bar]=b1/CalcPeriodRange; LowerBuffer[bar]=b2/CalcPeriodRange; MiddleBuffer[bar]=NormalizeDouble((UpperBuffer[bar]+LowerBuffer[bar])/2,_Digits); MiddleBuffer[bar]=PointPow10*MathRound(MiddleBuffer[bar]/PointPow10); UpperBuffer[bar]=PointPow10*MathRound(UpperBuffer[bar]/PointPow10); LowerBuffer[bar]=PointPow10*MathRound(LowerBuffer[bar]/PointPow10); } if(prev_calculated>rates_total || prev_calculated<=0) limit--; //---- Основной цикл раскраски сигнальной линии for(int bar=limit; bar>=0 && !IsStopped(); bar--) { ColorMiddleBuffer[bar]=ColorMiddleBuffer[bar+1]; if(MiddleBuffer[bar+1]MiddleBuffer[bar]) ColorMiddleBuffer[bar]=0; } //---- return(rates_total); } //+------------------------------------------------------------------+