Скачать MetaTrader 5

Ошибка в расчете стандартной функции LWMA в МТ4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114287
Forex Trader  
Уважаемые разработчики!
При построении пользовательского индикатора обнаружил, что LWMA в iMAonArray( ) считается с большой ошибкой. Пришлось пересчитать ее со всеми циклами. Результаты прикладываю.
Красная линия при использовании стандартной функции, желтой - мой вариант расчета.
На всякий случай прикладываю коды обеих вариантов.
Видимо у Вас в начале допущена какая-то ошибка и она лавинообразно нарастает в конце.
Таким образом использовать стандартную функцию LWMA (onArray) не представляется возможным. А ведь многие уже наверное пытались использовать эту функцию, а результат-то она выдает неправильный.



//*****************************************
#property indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1 Red
#property  indicator_width1 2
//==================================
extern int hrma=12;
//------------------------
double dma[],Hma[];
double sum_2,sum,sum_sq,w_2,w,w_sq;
int pma,pma_2,psq;
//*************************************
int init()
{
   IndicatorBuffers(2);
   //--------------------
   SetIndexBuffer(0,Hma);
   //--------------------
   SetIndexBuffer(1,dma);
   return(0);
}
//**************************************************************
int start()
{
   int cbi,cbi2,IC=IndicatorCounted();
   if (Bars-IC<3) {cbi=Bars-IC-1; cbi2=cbi;} else 
   {
      pma=hrma*60/Period()/2;
      pma_2=pma/2;
      psq=MathSqrt(pma);
      cbi=Bars-pma-1;
      cbi2=cbi-psq;
   }
   //---------------------------------------------------
   for(int i=cbi; i>=0; i--) dma[i]=2*iMA(NULL,0,pma_2,0,3,0,i)-iMA(NULL,0,pma,0,3,0,i);
   
   for(i=cbi2; i>=0; i--) 
   {
     Hma[i]=iMAOnArray(dma,0,psq,0,3,i);
   }
   //---------------------------------------------------
   return(0);
}
//************************************************************



//*****************************************
#property indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1 Gold
#property  indicator_width1 2
//==================================
extern int hrma=12;
//------------------------
double dma[],Hma[];
double sum_2,sum,sum_sq,w_2,w,w_sq;
int pma,pma_2,psq;
//*************************************
int init()
{
   IndicatorBuffers(2);
   //--------------------
   SetIndexBuffer(0,Hma);
   //--------------------
   SetIndexBuffer(1,dma);
   return(0);
}
//**************************************************************
int start()
{
   int cbi,cbi2,IC=IndicatorCounted();
   if (Bars-IC<3) {cbi=Bars-IC-1; cbi2=cbi;} else 
   {
      pma=hrma*60/Period()/2;
      pma_2=pma/2;
      psq=MathSqrt(pma);
      cbi=Bars-pma-1;
      cbi2=cbi-psq;
      w_2=0.0; for(int j=1; j<=pma_2; j++) w_2+=j;
      w=0.0; for(j=1; j<=pma; j++) w+=j;
      w_sq=0.0; for(j=1; j<=psq; j++) w_sq+=j;
   }
   //---------------------------------------------------
   for(int i=cbi; i>=0; i--) 
   {
      sum_2=0.0;
      for (int n=1; n<=pma_2; n++) 
      {  
         sum_2+=Close[i+pma_2-n]*n;
      }
      sum=0.0;
      for (n=1; n<=pma; n++) 
      {  
         sum+=Close[i+pma-n]*n;
      }  
      dma[i]=2*sum_2/w_2-sum/w;
   }
   for(i=cbi2; i>=0; i--) 
   {
      sum_sq=0.0;
      for (n=1; n<=psq; n++) 
      {  
         sum_sq+=dma[i+psq-n]*n;
      }  
      Hma[i]=sum_sq/w_sq;
   }
   //---------------------------------------------------
   return(0);
}
//************************************************************








Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий