Could you suggest function or technique similar to iMAOnArray in MQL5?
double iMAOnArray(
double array[], // array with data
int total, // number of elements
int ma_period, // MA averaging period
int ma_shift, // MA shift
int ma_method, // MA averaging method
int shift // shift
);
There is a great article about migration to MQL5, it can be found here:
https://www.mql5.com/en/articles/81
It also includes translation for iMAOnArray on MQL5.

- 2010.05.17
- Sergey Pavlov
- www.mql5.com
Here is the MQL5 version of iMAOnArray():
double iMAOnArray(double& array[], int period, int ma_shift, ENUM_MA_METHOD ma_method, int shift){
double buf[], arr[];
int total = ArraySize(array);
if(total <= period)
return 0;
if(shift > total - period - ma_shift)
return 0;
switch(ma_method) {
case MODE_SMA: {
total = ArrayCopy(arr, array, 0, shift + ma_shift, period);
if (ArrayResize(buf, total) < 0)
return 0;
double sum = 0;
int i, pos = total-1;
for (i = 1; i < period; i++, pos--)
sum += arr[pos];
while (pos >= 0) {
sum += arr[pos];
buf[pos] = sum / period;
sum -= arr[pos + period - 1];
pos--;
}
return buf[0];
}
case MODE_EMA: {
if (ArrayResize(buf, total) < 0)
return 0;
double pr = 2.0 / (period + 1);
int pos = total - 2;
while (pos >= 0) {
if (pos == total - 2)
buf[pos+1] = array[pos+1];
buf[pos] = array[pos] * pr + buf[pos+1] * (1-pr);
pos--;
}
return buf[shift+ma_shift];
}
case MODE_SMMA: {
if (ArrayResize (buf, total) < 0)
return(0);
double sum = 0;
int i, k, pos;
pos = total - period;
while (pos >= 0) {
if (pos == total - period) {
for (i = 0, k = pos; i < period; i++, k++) {
sum += array[k];
buf[k] = 0;
}
}
else
sum = buf[pos+1] * (period-1) + array[pos];
buf[pos]=sum/period;
pos--;
}
return buf[shift+ma_shift];
}
case MODE_LWMA: {
if (ArrayResize (buf, total) < 0)
return 0;
double sum = 0.0, lsum = 0.0;
double price;
int i, weight = 0, pos = total-1;
for(i = 1; i <= period; i++, pos--) {
price = array[pos];
sum += price * i;
lsum += price;
weight += i;
}
pos++;
i = pos + period;
while (pos >= 0) {
buf[pos] = sum / weight;
if (pos == 0)
break;
pos--;
i--;
price = array[pos];
sum = sum - lsum + price * period;
lsum -= array[i];
lsum += price;
}
return buf[shift+ma_shift];
}
}
return 0;
}

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Could you suggest function or technique similar to iMAOnArray in MQL5?
double array[], // array with data
int total, // number of elements
int ma_period, // MA averaging period
int ma_shift, // MA shift
int ma_method, // MA averaging method
int shift // shift
);