Уважаемые разработчики!
При построении пользовательского индикатора обнаружил, что 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);
}
//************************************************************
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
При построении пользовательского индикатора обнаружил, что 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); } //************************************************************