//+------------------------------------------------------------------+ //| Rj_SlidingRange.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 clrOrange,clrBlue //--- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //--- толщина линии индикатора равна 2 #property indicator_width2 2 //--- отображение метки индикатора #property indicator_label2 "Middle Rj_SlidingRange" //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //--- отрисовка индикатора в виде линии #property indicator_type3 DRAW_LINE //--- в качестве цвета линии индикатора использован розовый цвет #property indicator_color3 clrMagenta //--- линия индикатора - непрерывная кривая #property indicator_style3 STYLE_SOLID //--- толщина линии индикатора равна 2 #property indicator_width3 2 //--- отображение метки индикатора #property indicator_label3 "Lower Rj_SlidingRange" //+-----------------------------------+ //| Входыне параметры индикатора | //+-----------------------------------+ input uint CalcPeriodRange=5; input int Shift=0; // Сдвиг индикатора по горизонтали в барах //+-----------------------------------+ //--- индикаторные буферы double UpperBuffer[]; double MiddleBuffer[]; double LowerBuffer[]; double ColorMiddleBuffer[]; //--- объявление целочисленных переменных начала отсчета данных int min_rates_total; //+------------------------------------------------------------------+ //| Rj_SlidingRange Channel indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- инициализация констант min_rates_total=int(CalcPeriodRange+1); //--- превращение динамического массива в индикаторный буфер 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_SlidingRange(",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); } //--- if(prev_calculated>rates_total || prev_calculated<=0) limit--; //--- основной цикл раскраски сигнальной линии for(int bar=limit; bar>=0 && !IsStopped(); bar--) { if(MiddleBuffer[bar+1]MiddleBuffer[bar]) ColorMiddleBuffer[bar]=0; } //--- return(rates_total); } //+------------------------------------------------------------------+