It's called a Simple Moving Average and is the most basic of indicators build into every platform I know (and that includes MetaTrader).
The MQL4 function for it (and several other types of moving averages) is "iMA()". If you need to apply it to custom data, then use "iMAOnArray()".

- docs.mql4.com
...I would need to save each value into it's own variable and divide by the number of variables manually. There has to be a better way than that....
I cannot comment on MQL4, but if you look in the MQL5 official library, you will see that's basically how they do it using an array and a loop.
So no harm in copying that way if there is no function in MQL4
I'm trying to write a custom indicator that relies on finding the average value over a past number of bars, but I'm having trouble figuring out how to write the function, although it should be simple, but I don't see an "average" function prebuilt into mql4 and I don't think I would need to save each value into it's own variable and divide by the number of variables manually. There has to be a better way than that. For instance, if I want to find the average value of the Close price minus the Open prices over the past x number of bars, how would I be able to do that? Any ideas on writing a simple script that doesn't make me save each bar value into it's own variable, which would be cumbersome if I had more than say 10 bars, and then manually divide by the number of bars?
ArraySetAsSeries(Buf_Par,true);
double AveP = iMAOnArray(Buf_Par,0, 15, 0,MODE_SMA, i);
Buf_AveP[i] = AveP;
To close this topic, some code contribution for everyone:
/////////////////////////////////////// // // Mean series object // template <typename T> struct object_mean { private: // Local storage T _ring_buffer[]; T _sum_value; int ptr; int _size; bool is_full; public: // Constructors object_mean() : _sum_value (NULL), ptr (-1), _size (NULL), is_full (false) { }; object_mean(const int size) : { reset(size); }; object_mean(const object_mean& p_in) { operator=(p_in); }; // Operators void operator=(const object_mean& p_in) { _sum_value = p_in._sum_value; ptr = p_in.ptr; _size = p_in._size; is_full = p_in.is_full; ArrayCopy(_ring_buffer, p_in._ring_buffer); }; const T operator[](const int p_in) const { return(_ring_buffer[p_in]); }; // Buffer functions const bool reset(const int size) { _sum_value = NULL; ptr = -1; is_full = false; _size = ArrayResize(_ring_buffer, size); return(ArrayInitialize(_ring_buffer, NULL) == size); }; // Mean functions void add(const T p_in) { ptr++; is_full |= (ptr == _size); ptr = ptr % _size; update(p_in); }; void update(const T p_in) { _sum_value += (p_in - _ring_buffer[ptr]); _ring_buffer[ptr] = p_in; }; const T get() const { return(_sum_value / ((is_full) ? _size : (ptr + 1))); }; // Min/Max functions const int max() const { int idx = ptr; for(int cnt = (is_full) ? (_size - 1) : ptr; (cnt >= NULL) && !_StopFlag; cnt--) { idx = (_ring_buffer[idx] < _ring_buffer[cnt]) ? cnt : idx; } return(idx); }; const int min() const { int idx = ptr; for(int cnt = (is_full) ? (_size - 1) : ptr; (cnt >= NULL) && !_StopFlag; cnt--) { idx = (_ring_buffer[idx] > _ring_buffer[cnt]) ? cnt : idx; } return(idx); }; };
I am open to suggestions for improvements.
How to use:
object_mean<double> test; // Default constructor, alternative use a specific constructor like this: object_mean<int> test(5); test.reset(5); // Set the length, if default constructor has been used, it is necessery to call this function before using the object. test.add(1.0); // Add some values test.add(2.0); test.add(3.0); printf("%f", test.get()); // Get current mean test.update(4.0); // Update a value, not adding a new value to the mean array, but updating the last added value printf("%f", test.get()); // Get current mean test.add(3.0); // Add more values test.add(5.0); printf("%f", test.get()); // Get current mean // More than 5 values added, first value gets overwritten test.add(6.0); printf("%f", test.get()); // Get current mean printf("Max: %f", test[test.max()]); // Get the maximum value in the series, max() returns an index. printf("Min: %f", test[test.min()]); // Get the minimum value in the series, min() returns an index.
template<typename T> T array_mean(const T& arr[], int iBeg, int iEnd){ return array_sum(arr, iBeg, iEnd) / (iEnd - iBeg); } template<typename T> T array_sum(const T& arr[], int iBeg, int iEnd){ T sum=0; for(; iBeg < iEnd; ++iBeg) sum += arr[iBeg]; return sum; }Simple code.

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I'm trying to write a custom indicator that relies on finding the average value over a past number of bars, but I'm having trouble figuring out how to write the function, although it should be simple, but I don't see an "average" function prebuilt into mql4 and I don't think I would need to save each value into it's own variable and divide by the number of variables manually. There has to be a better way than that. For instance, if I want to find the average value of the Close price minus the Open prices over the past x number of bars, how would I be able to do that? Any ideas on writing a simple script that doesn't make me save each bar value into it's own variable, which would be cumbersome if I had more than say 10 bars, and then manually divide by the number of bars?