Индикаторы: WildersDMI_v1

 

WildersDMI_v1:

Индикатор WildersDMI_v1.

Author: John Smith

 
Мой вариант дает другие значения.

 

Rosh писал:
Мой вариант дает другие значения.

______________

Рош, а где другой вариант?

 
fxxx:

Rosh писал:
Мой вариант дает другие значения.

______________

Рош, а где другой вариант?

Да вот:
//+------------------------------------------------------------------+
//|                                                   ADX Wilder.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                         https://www.metaquotes.net/ru|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/ru"
/* written by Rosh*/
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 MediumSeaGreen
#property indicator_color2 DodgerBlue
#property indicator_color3 Coral
#property indicator_color4 Brown
 
//---- input parameters
extern int       Period_ADX=14;
//---- buffers
double ADXBuffer[];
double PlusDiBuffer[];
double MinusDiBuffer[];
double ADXR_Buffer[];
 
double DX_Buffer[];
double Plus_DMBuffer[];
double Minus_DMBuffer[];
double TR_Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ADXBuffer);
   SetIndexDrawBegin(0,2*Period_ADX);
   SetIndexLabel(0,"ADX");
   SetIndexEmptyValue(0,EMPTY_VALUE);
   
   SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(1,PlusDiBuffer);
   SetIndexDrawBegin(1,Period_ADX);
   SetIndexLabel(1,"+DI");
   SetIndexEmptyValue(1,EMPTY_VALUE);
 
   SetIndexStyle(2,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(2,MinusDiBuffer);
   SetIndexDrawBegin(2,Period_ADX);
   SetIndexLabel(2,"-DI");
   SetIndexEmptyValue(2,EMPTY_VALUE);
 
   SetIndexStyle(3,DRAW_LINE,STYLE_DASH);
   SetIndexBuffer(3,ADXR_Buffer);
   SetIndexDrawBegin(3,3*Period_ADX);
   SetIndexLabel(3,"ADXR");
   SetIndexEmptyValue(3,EMPTY_VALUE);
 
   SetIndexBuffer(4,DX_Buffer);
   SetIndexBuffer(5,Plus_DMBuffer);
   SetIndexBuffer(6,Minus_DMBuffer);
   SetIndexBuffer(7,TR_Buffer);
 
   IndicatorDigits(0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   i,counted_bars=IndicatorCounted();
   int   limit1,limit2,limit3,limit4;
   double dm_plus, dm_minus,tr,TR14;
   double num1,num2,num3,summ;
   
   int counter1,counter2,counter3,counter4;
//----
   if (counted_bars==0)
      {
      limit1=Bars-2;
      limit2=Bars-1-Period_ADX;
      limit3=limit2-Period_ADX;
      limit4=limit3-Period_ADX;
      ArrayInitialize(Plus_DMBuffer,0);
      ArrayInitialize(Minus_DMBuffer,0);
      ArrayInitialize(TR_Buffer,0);
      ArrayInitialize(PlusDiBuffer,0);
      ArrayInitialize(MinusDiBuffer,0);
      ArrayInitialize(DX_Buffer,0);
 
      }   
 
   if (counted_bars>0)
      {
      limit1=Bars-counted_bars-1;
      limit2=limit1;
      limit3=limit1;
      limit4=limit1;
      }   
   for (i=limit1;i>=0;i--)
      {
      if (High[i]>High[i+1])  dm_plus=High[i]-High[i+1]; else dm_plus=0;
      if (Low[i+1]>Low[i])  dm_minus=Low[i+1]-Low[i]; else dm_minus=0;
      if (dm_plus==dm_minus)
         {
         dm_plus=0;
         dm_minus=0;
         }
      num1=MathAbs(High[i]-Low[i]);
      num2=MathAbs(High[i]-Close[i+1]);
      num3=MathAbs(Low[i]-Close[i+1]);
      tr=MathMax(num1,num2);
      tr=MathMax(tr,num3);
      Plus_DMBuffer[i]=dm_plus;
      Minus_DMBuffer[i]=dm_minus;
      TR_Buffer[i]=tr;
      
      counter1++;
      }
   for (i=limit2;i>=0;i--)
      {
      TR14=iMAOnArray(TR_Buffer,0,Period_ADX,0,MODE_SMMA,i);
      if (TR14!=0)
         {
         PlusDiBuffer[i]=iMAOnArray(Plus_DMBuffer,0,Period_ADX,0,MODE_SMMA,i)/TR14*100.0;
         MinusDiBuffer[i]=iMAOnArray(Minus_DMBuffer,0,Period_ADX,0,MODE_SMMA,i)/TR14*100.0;
         }
      else
         {
         PlusDiBuffer[i]=0.0;
         MinusDiBuffer[i]=0.0;
         }
      summ=PlusDiBuffer[i]+MinusDiBuffer[i];   
      if (summ!=0)DX_Buffer[i]=MathAbs(PlusDiBuffer[i]-MinusDiBuffer[i])/summ*100.0; else DX_Buffer[i]=0;
 
      if (counter2<5*Period_ADX) Print(Bars-1-i,"   ",DoubleToStr(PlusDiBuffer[i],Digits),"  ",DoubleToStr(MinusDiBuffer[i],Digits),"  ",DoubleToStr(TR14,Digits));
      counter2++;
      }
   for (i=limit3;i>=0;i--)  ADXBuffer[i]=iMAOnArray(DX_Buffer,0,Period_ADX,0,MODE_SMMA,i);
   for (i=limit4;i>=0;i--)  ADXR_Buffer[i]=(ADXBuffer[i]+ADXBuffer[i+Period_ADX])/2.0;
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Rosh:
Мой вариант дает другие значения.


 

SMMA...   или вопрос в другом?

 

Rosh, в твоем коде  отсутствует  описание еще 2-х паттернов для DM+ и DM-:

      else
      if (dm_plus > dm_minus)
         {  
         dm_plus=dm_plus;
         dm_minus=0;
         }
      else
      if (dm_plus < dm_minus)
         {  
         dm_plus=0;
         dm_minus=dm_minus;
         }

И в начале надо усреднять по простой средней.

   

 
igorad:

Rosh, в твоем коде  отсутствует  описание еще 2-х паттернов для DM+ и DM-:

   

И в начале надо усреднять по простой средней.

   


 Я делал индикатор строго по описанию автора. Книга есть на пауке.
 
Вот картинка с описанием по этим двум паттернам из оригинала:


Кстати, твоя с исправлениями и моя обновленная версия полностью совпадают.

 

Apparently all these versions having obvious bugs (see data on the left).

Igorad or someone else, care to point us to the original Wilder's description? Maybe there is more recent fixed version?



from top to bottom: MT4 version from year 2004; ADX Wilder by Rosh; WildersDMI, fixed v1.1 from igorad

 

Apparently all these versions having obvious bugs (see data on the left).

Igorad or someone else, care to point us to the original Wilder's description? Maybe there is more recent fixed version?

Извиняюсь, перевод:

Очевидно, все упомянутые здесь версии имеют ошибки (см. левую сторону рисунка).

Может, igorad или ещё кто-нибудь может скинуть линк на оригинальное описание Вайлдера? Или есть пофиксенная версия?

Причина обращения: