How to use one indicators values to create a moving average in mql4 (for an EA) without calculating it muanually
- Baki Hanma: I can do this by using a horrible for-loop and use the shift function to add up and then divide by the amount I shifted it.
Drop your unnecessary if inside the loop.
for(int i = 2; i <= lookback; i++){ Vol01 += iVolume(_Symbol,PERIOD_CURRENT,i); } vol1 = Vol01/(lookback - 1); }
-
There is nothing "horrible" about for loops. Write them correctly and use modular coding.
vol1 = sma_on_array(Volume, 2, lookback+1); ////////////////////////////////////////////////////////////// template<typename T> double sma_on_array(const T& array[], int iBeg=0, int iEnd=WHOLE_ARRAY){ if(iEnd == WHOLE_ARRAY) iEnd = ArraySize(array); return sum_array(array, iBeg, iEnd) / double(iEnd - iBeg); } template<typename T> double sum_array(const T& array, int iBeg, int iEnd){ T sum=0; while(iBeg < iEnd) sum += array[iBeg++]; return sum; }
- Baki Hanma: . I know the proper way to do this is by using the MA-ON-ARRAY, function, but there is little to no documentation on how one actually does this. I know how to make arrays etc. but I'm confused to what the array is actually supposed to be holding.
Set the array to as-series, fill the array, call the function to get the MA where you want. Obviously, it has to be holding what you want the average of.
double v[]; ArraySetAsSeries(v, true); int vSize=ArrayCopySeries(v, MODE_VOLUME) int iBeg=2, iEnd=lookback+1, length=lEnd - iBeg + 1; double smaVol=iMAOnArray(v, vSize, length, 0, MODE_SMA, iBeg);
- Baki Hanma: If i made an array with a length of 50, an then used the FILL-ARRAY & ARRAY-SET-AS-SERIES function, inputting the values from the indicator, & then used the MA-ON-ARRAY, with the values from the array, what exactly is this doing?
Obviously, it is computing the moving average of what you put into the array.
int iBeg=2, iEnd=lookback+1, length=lEnd - iBeg + 1, smaLength=length; double v[]; ArrayResize(v, length); ArraySetAsSeries(v, true); for(int iV=0; iBeg < iEnd; ++iBeg, ++iV) v[iV] =iCustom(…, iBeg); double smaVol=iMAOnArray(v, length, smaLength, 0, MODE_SMA, 0);
- Baki Hanma: does this mean that the MA length would need to be less than the array length?
For SMA/LWMA, less than or equal. For EMA see How MT4 calculate its EMA & MACD ?? The formula used by MT4 seems to be different than the formula generally used by other platform. - Technical Indicators - MQL5 programming forum #2.4 (2019)
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
Evening gents, I've been trying to do a calculation where it takes the values of an indicator and then creates a moving average from that. I can do this by using a horrible for-loop and use the shift function to add up and then divide by the amount I shifted it.
ex:
However, when using this method with more complex indicators, it causes mt4 to being extremely slow. I know the proper way to do this is by using the MA-ON-ARRAY, function, but there is little to no documentation on how one actually does this. I know how to make arrays etc. but I'm confused to what the array is actually supposed to be holding. If i made an array with a length of 50, an then used the FILL-ARRAY & ARRAY-SET-AS-SERIES function, inputting the values from the indicator, & then used the MA-ON-ARRAY, with the values from the array, what exactly is this doing? does this mean that the MA length would need to be less than the array length?