#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!

You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
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