Navigation:Home > Content >

rsiimproved.mq5

Time: 2017-09-11 | Download file:rsiimproved.mq5

//+------------------------------------------------------------------+
//|                                                  RSIImproved.mq5 |
//|                                  Copyright © 2010, Fedor Igumnov |
//|                                           igumnovfedor@yandex.ru |
//+------------------------------------------------------------------+
#property description "За основу взят код оригинального RSI"
#property description "Считает разность между первым RSI и перевернутым вторым RSI(100-RSI2),"
#property description " а также скорость изменения этой разности."
//---- авторство индикатора
#property copyright "Fedor Igumnov"
#property link      "igumnovfedor@yandex.ru"
//---- номер версии индикатора
#property version   "1.00"
//---- отрисовка индикатора в отдельном окне
#property indicator_separate_window
//---- для расчёта и отрисовки индикатора использовано четыре буфера
#property indicator_buffers 4
//---- использовано три графических построения
#property indicator_plots   3
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде облака
#property indicator_type1   DRAW_FILLING
//---- в качестве цвета бычей линии индикатора использованы
#property indicator_color1  clrLime,clrDeepPink
//---- отображение бычей лэйбы индикатора
#property indicator_label1  "RSI Original;RSI Rotated"
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 2            |
//+----------------------------------------------+
//---- отрисовка индикатора в виде гистограммы
#property indicator_type2 DRAW_HISTOGRAM
//---- в качестве цвета гистограммы использован Gray
#property indicator_color2 clrGray
//---- линия индикатора - сплошная
#property indicator_style2 STYLE_SOLID
//---- толщина линии индикатора равна 2
#property indicator_width2 2
//---- отображение лэйбы индикатора
#property indicator_label2 "Delta"
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 3            |
//+----------------------------------------------+
//---- отрисовка индикатора в виде линии
#property indicator_type3   DRAW_LINE
//---- в качестве цвета линии индикатора использован clrOrange цвет
#property indicator_color3 clrOrange
//---- линия индикатора - непрерывная кривая
#property indicator_style3  STYLE_SOLID
//---- толщина линии индикатора равна 1
#property indicator_width3  1
//---- отображение лэйбы индикатора
#property indicator_label3  "Delta Speed"

//+----------------------------------------------+
//|  объявление констант                         |
//+----------------------------------------------+
#define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input uint RSIPeriodOriginal=14; // период оригинального RSI
input uint RSIPeriodRotated=7;   // период перевёрнутого RSI
input int  Shift=0; // сдвиг индикатора по горизонтали в барах 
//+----------------------------------------------+
//---- объявление динамических массивов, которые будут в 
// дальнейшем использованы в качестве индикаторных буферов
double RSIBufferOriginal[],RSIBufferRotated[],Delta[],DeltaSpeed[];
//---- Объявление целых переменных начала отсчёта данных
int min_rates_total,RSIPeriodOriginal1,RSIPeriodRotated1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
//---- Инициализация переменных начала отсчёта данных
   min_rates_total=int(MathMax(RSIPeriodOriginal,RSIPeriodRotated))+1;
   RSIPeriodOriginal1=int(RSIPeriodOriginal-1);
   RSIPeriodRotated1=int(RSIPeriodRotated-1);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(0,RSIBufferOriginal,INDICATOR_DATA);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(RSIBufferOriginal,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(1,RSIBufferRotated,INDICATOR_DATA);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(RSIBufferRotated,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(2,Delta,INDICATOR_DATA);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(Delta,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(3,DeltaSpeed,INDICATOR_DATA);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(DeltaSpeed,true);

//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);

//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 2 на min_rates_total
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);

//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 3 на min_rates_total
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);

//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 4 на min_rates_total
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);

//---- инициализации переменной для короткого имени индикатора
   string shortname;
   StringConcatenate(shortname,"RSI Improved(",RSIPeriodOriginal,", ",RSIPeriodRotated,", ",Shift,")");
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- определение точности отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,0);

//---- количество  горизонтальных уровней индикатора 5   
   IndicatorSetInteger(INDICATOR_LEVELS,5);
//---- значения горизонтальных уровней индикатора   
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,+70);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,+30);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,0);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,3,-30);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,4,-70);
//---- в качестве цветов линий горизонтальных уровней использованы серый и розовый цвета  
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrBlueViolet);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrMagenta);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrBlue);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,3,clrMagenta);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,4,clrBlueViolet);
//---- в линии горизонтального уровня использован короткий штрих-пунктир  
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DASH);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_DASHDOTDOT);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,3,STYLE_DASHDOTDOT);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,4,STYLE_DASH);
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator 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; // стартовый номер для расчёта всех баров
      positive1=0;
      negative1=0;
      positiverot1=0;
      negativerot1=0;
     }
   else
     {
      limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров
     }

//---- индексация элементов в массивах как в таймсериях  
   ArraySetAsSeries(close,true);

   MaxBar=rates_total-min_rates_total-1;

//---- основной цикл расчёта индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      double sumn=0.0;
      double sump=0.0;
      
      if(bar==MaxBar)
        {
         int kkk=rates_total-2;
         //---- initial accumulation
         while(kkk>=bar)
           {
            rel=close[kkk]-close[kkk+1];
            if(rel>0) sump+=rel;
            else      sumn-=rel;
            kkk--;
           }
           
         positive=sump/RSIPeriodOriginal;
         negative=sumn/RSIPeriodOriginal;
         positiverot=sump/RSIPeriodRotated;
         negativerot=sumn/RSIPeriodRotated;
        }
      else
        {
         //---- smoothed moving average
         rel=close[bar]-close[bar+1];
         
         if(rel>0) sump=+rel;
         else      sumn=-rel;
         
         positive=(positive1*RSIPeriodOriginal1+sump)/RSIPeriodOriginal;
         negative=(negative1*RSIPeriodOriginal1+sumn)/RSIPeriodOriginal;
         positiverot=(positiverot1*RSIPeriodRotated1+sump)/RSIPeriodRotated;
         negativerot=(negativerot1*RSIPeriodRotated1+sumn)/RSIPeriodRotated;
        }

      if(negative) RSIBufferOriginal[bar]=100.0-100.0/(1+positive/negative);
      else RSIBufferOriginal[bar]=0.0;
       

      if(negativerot) RSIBufferRotated[bar]=100-(100.0-100.0/(1+positiverot/negativerot));
      else RSIBufferRotated[bar]=0.0;

      Delta[bar]=RSIBufferOriginal[bar]-RSIBufferRotated[bar];
      DeltaSpeed[bar]=Delta[bar+1]-Delta[bar];

      if(bar)
        {
         positive1=positive;
         negative1=negative;
         positiverot1=positiverot;
         negativerot1=negativerot;
        }
     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Recommend