EMA & Hull MA indicator display problem
#property indicator_buffers 5 #property indicator_plots 2
if(rates_total < LongestPeriod) return (0); int limit, copyBars = 0; // Calculation of the starting number first for the bar recalculation loop if(prev_calculated > rates_total || prev_calculated <= 0) { copyBars = rates_total; // - LongestPeriod; limit = rates_total - LongestPeriod; } else { copyBars = rates_total - prev_calculated; if(prev_calculated > 0) copyBars++; limit = copyBars; } //--- MA1 ---------------------------------- CopyBuffer(HandleMA1, 0, 0, copyBars, BufferMA1); //--- MA2 ---------------------------------- //rates = rates_total; HullMACalculate(limit, BufferMA2, copyBars, MA2_Period);
SetIndexBuffer(4, BufferLWMA3, INDICATOR_CALCULATIONS);
ArraySetAsSeries(BufferLWMA3, true); void HullMACalculate(int limit, double& DataMA[], int copyBars, int period) { CopyBuffer(HandleLWMA1, 0, 0, copyBars, BufferLWMA1); CopyBuffer(HandleLWMA2, 0, 0, copyBars, BufferLWMA2); //ArrayResize(BufferLWMA3, rates); //ArrayInitialize(BufferLWMA3, 0); //ArraySetAsSeries(BufferLWMA3, true); for(int i = 0; i <= limit; i++) { BufferLWMA3[i] = 2.0 * BufferLWMA2[i] - BufferLWMA1[i]; } for(int i = 0; i <= limit; i++) { DataMA[i] = LWMACalculate(BufferLWMA3, (int) sqrt(period), i); } } //+------------------------------------------------------------------+ //| Linear Weighted Moving Average | //+------------------------------------------------------------------+ double LWMACalculate(double& price[], int period, int index) { double sum = 0.0; double weight = 0.0; for(int i = index; i < (index + period); i++) { weight += (period - (i - index)); sum += price[i] * (period - (i - index)); } return(sum / weight); }
In this way, BufferLWMA1 and BufferLWMA2 can be omitted.
void HullMACalculate(int limit, double& DataMA[], int copyBars, int period) { //CopyBuffer(HandleLWMA1, 0, 0, copyBars, BufferLWMA1); //CopyBuffer(HandleLWMA2, 0, 0, copyBars, BufferLWMA2); double LWMA1[1], LWMA2[1]; for(int i = 0; i <= limit; i++) { CopyBuffer(HandleLWMA1, 0, i, 1, LWMA1); CopyBuffer(HandleLWMA2, 0, i, 1, LWMA2); BufferLWMA3[i] = 2.0 * LWMA2[0] - LWMA1[0]; } for(int i = 0; i <= limit; i++) { DataMA[i] = LWMACalculate(BufferLWMA3, (int) sqrt(period), i); } }
I am greatly appreciative of your assistance, it functions exceptionally well.
I have one more inquiry, when I write a custom indicator like a custom Moving Average, should I also look back like the "limit" variable you have implemented?
Hope you have a wonderful day ahead!
Hi there, i'm currently learning MQL5 language. I've just write a indicator program about EMA and Hull MA crossover and stuck on a problem
The Hull MA doesn't update the value when a new bar appears. I am not sure why the indicator is behaving in this manner. Here is my code.
Can someone enlighten me on why this problem occurred as I am trying to find a solution for it? I am grateful!