Navigation:Home > Content >

wildersdmi.mq5

Time: 2012-08-08 | Download file:wildersdmi.mq5

//+------------------------------------------------------------------+
//|                                                   WildersDMI.mq5 |
//|                           Copyright © 2007, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: [email protected] |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2007, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"
//---- описание индикатора
#property description ""
//---- отрисовка индикатора в отдельном окне
#property indicator_separate_window
//---- для расчёта и отрисовки индикатора использовано четыре буфера
#property indicator_buffers 4
//---- использовано четыре графических построения
#property indicator_plots   4
//+----------------------------------------------+
//| Параметры отрисовки индикатора ADX           |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде линии
#property indicator_type1   DRAW_LINE
//---- в качестве цвета линии индикатора использован Blue цвет
#property indicator_color1  clrBlue
//---- линия индикатора 1 - непрерывная кривая
#property indicator_style1  STYLE_SOLID
//---- толщина линии индикатора 1 равна 2
#property indicator_width1  2
//---- отображение лэйбы индикатора
#property indicator_label1  "ADX"
//+----------------------------------------------+
//| Параметры отрисовки индикатора +DI           |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде линии
#property indicator_type2   DRAW_LINE
//---- в качестве цвета линии индикатора использован Green цвет
#property indicator_color2  clrGreen
//---- линия индикатора 2 - пунктир
#property indicator_style2  STYLE_DASHDOT
//---- толщина линии индикатора 2 равна 1
#property indicator_width2  1
//---- отображение лэйбы индикатора
#property indicator_label2  "+DI"
//+----------------------------------------------+
//| Параметры отрисовки индикатора -DI           |
//+----------------------------------------------+
//---- отрисовка индикатора 3 в виде линии
#property indicator_type3   DRAW_LINE
//---- в качестве цвета линии индикатора использован Tomato цвет
#property indicator_color3  clrTomato
//---- линия индикатора 3 - пунктир
#property indicator_style3  STYLE_DASHDOT
//---- толщина линии индикатора 3 равна 1
#property indicator_width3  1
//---- отображение лэйбы индикатора
#property indicator_label3  "-DI"
//+----------------------------------------------+
//| Параметры отрисовки индикатора ADXR          |
//+----------------------------------------------+
//---- отрисовка индикатора 4 в виде линии
#property indicator_type4   DRAW_LINE
//---- в качестве цвета линии индикатора использован Orange цвет
#property indicator_color4  clrOrange
//---- линия индикатора 4 - непрерывная кривая
#property indicator_style4  STYLE_SOLID
//---- толщина линии индикатора 4 равна 2
#property indicator_width4  2
//---- отображение лэйбы индикатора
#property indicator_label4  "ADXR"
//+----------------------------------------------+
//|  объявление констант                         |
//+----------------------------------------------+
#define RESET 0 // константа для возврата терминалу команды на пересчёт индикатора

//+----------------------------------------------+
//|  ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА                |
//+----------------------------------------------+
input uint MA_Length=1;    // Period of additional smoothing 
input uint DMI_Length=14;  // Period of DMI
input uint ADX_Length=14;  // Period of ADX
input uint ADXR_Length=14; // Period of ADXR
input bool UseADX=true;    // Use ADX
input bool UseADXR=true;   // Use ADXR
input int  Shift=0;        // сдвиг индикатора по горизонтали в барах
//+----------------------------------------------+
//---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов
double ADX[];
double PDI[];
double MDI[];
double ADXR[];
//---- Объявление целых переменных начала отсчёта данных
int min_rates_total;
double alfa1,alfa2;
//---- Объявление целых переменных для хендлов индикаторов
int CMA_Handle,LMA_Handle,HMA_Handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
//---- Инициализация переменных начала отсчёта данных
   min_rates_total=int(MA_Length+1+ADXR_Length);
   alfa1=1.0/DMI_Length;
   alfa2=1.0/ADX_Length;

//---- получение хендла индикатора iMA
   CMA_Handle=iMA(NULL,0,MA_Length,0,MODE_EMA,PRICE_CLOSE);
   if(CMA_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iMA");

//---- получение хендла индикатора iMA
   HMA_Handle=iMA(NULL,0,MA_Length,0,MODE_EMA,PRICE_HIGH);
   if(HMA_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iMA");

//---- получение хендла индикатора iMA
   LMA_Handle=iMA(NULL,0,MA_Length,0,MODE_EMA,PRICE_LOW);
   if(LMA_Handle==INVALID_HANDLE) Print(" Не удалось получить хендл индикатора iMA");

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(0,ADX,INDICATOR_DATA);
//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(ADX,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(1,PDI,INDICATOR_DATA);
//---- осуществление сдвига индикатора 2 по горизонтали на Shift
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 2 на min_rates_total
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(PDI,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(2,MDI,INDICATOR_DATA);
//---- осуществление сдвига индикатора 1 по горизонтали на Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 3 на min_rates_total
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(MDI,true);

//---- превращение динамического массива в индикаторный буфер
   SetIndexBuffer(3,ADXR,INDICATOR_DATA);
//---- осуществление сдвига индикатора 2 по горизонтали на Shift
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- осуществление сдвига начала отсчёта отрисовки индикатора 4 на min_rates_total
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- индексация элементов в буфере как в таймсерии
   ArraySetAsSeries(ADXR,true);

//---- инициализации переменной для короткого имени индикатора
   string short_name="WildersDMI("+string(MA_Length)+","+string(DMI_Length)+","+string(ADX_Length)+","+string(ADXR_Length)+")";
//--- создание имени для отображения в отдельном подокне и во всплывающей подсказке
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);

//--- определение точности отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//----
  }
//+------------------------------------------------------------------+
//| 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(BarsCalculated(CMA_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора
     {
      limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров
      sPDI_=0;
      sMDI_=0;
      STR_=0;
      
      for(bar=rates_total-1; bar>limit && !IsStopped(); bar--) ADX[bar]=0;
     }
   else
     {
      limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров
     }

   to_copy=limit+2;

//---- копируем вновь появившиеся данные в массивы
   if(CopyBuffer(CMA_Handle,0,0,to_copy,CMA)<=0) return(RESET);
   if(CopyBuffer(HMA_Handle,0,0,to_copy,HMA)<=0) return(RESET);
   if(CopyBuffer(LMA_Handle,0,0,to_copy,LMA)<=0) return(RESET);

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

//---- основной цикл расчёта индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      double AvgHigh =HMA[bar];
      double AvgHigh1=HMA[bar+1];
      double AvgLow  =LMA[bar];
      double AvgLow1 =LMA[bar+1];
      double AvgClose1=CMA[bar+1];
      double hres=AvgHigh-AvgHigh1;
      double lres=AvgLow1-AvgLow;
      double Bulls=0.5*(MathAbs(hres)+hres);
      double Bears=0.5*(MathAbs(lres)+lres);
      
      if(Bulls>Bears) Bears=0;
      else if(Bulls0)
        {
         PDI[bar]=100*sPDI/STR;
         MDI[bar]=100*sMDI/STR;
        }
      else
        {
         PDI[bar]=0;
         MDI[bar]=0;
        }

      if(UseADX)
        {
         double res=PDI[bar]+MDI[bar];
         if(res>0) DX=100*MathAbs(PDI[bar]-MDI[bar])/res;
         else DX=0;

         ADX[bar]=ADX[bar+1]+alfa2*(DX-ADX[bar+1]);
         if(UseADXR) ADXR[bar]=0.5*(ADX[bar]+ADX[bar+ADXR_Length]);
         else ADXR[bar]=0;
        }
      else ADX[bar]=0;

      if(bar)
        {
         sPDI_=sPDI;
         sMDI_=sMDI;
         STR_=STR;
        }

     }
//----     
   return(rates_total);
  }
//+------------------------------------------------------------------+

Recommend