Скачать MetaTrader 5

Библиотеки: MovingAverages

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Automated-Trading
Админ
102521
Automated-Trading  

MovingAverages:

Библиотека MovingAverages входит в стандартную поставку терминала MetaTrader 5.

Она содержит функции для вычисления различных скользящих средних. Всего в библиотеке 8 функций, которые можно разбить на 2 группы однотипных функций по 4 в каждой.

Первая группа - это функции, которые получают массив и просто возвращают значение скользящей на указанной позиции:

Эти функции предназначены для однократного получения значения средней на массиве и не оптимизированы под многократные вызовы. Если вы хотите использовать функцию из этой группы в цикле (для вычисления значений средней с последующей записью каждого вычисленного значения в массив), то вам необходимо самостоятельно позаботиться об организации оптимального алгоритма.

Вторая группа функций предназначена для заполнения массива-приемника значениями скользящей средней на основе массива исходных значений:

  • SimpleMAOnBuffer() - заполняет выходной массив buffer[] значениями простой средней от массива price[];
  • ExponentialMAOnBuffer() - заполняет выходной массив buffer[] значениями экспоненциальной средней от массива price[];
  • SmoothedMAOnBuffer() - заполняет выходной массив buffer[] значениями сглаженной средней от массива price[];
  • LinearWeightedMAOnBuffer() - заполняет выходной массив buffer[] значениями линейно-взвешенной средней от массива price[].

Автор: MetaQuotes Software Corp.

Andrey F. Zelinsky
32038
Andrey F. Zelinsky  

В строке:

   if(period<=1 || rates_total-begin<period) return(0);

должно быть нестрогое равенство:

   if(period<1 || rates_total-begin<period) return(0);
В противном случае, если, например, скомпилировать код поставки MACD.mq5 и задать InpSignalSMA=1, то Сигнальная линия будет равная нулю, а должна быть равна линии MACD.

 

Maxim Khrolenko
7344
Maxim Khrolenko  
В функции ExponentiaMA мне не совсем понятен смысл ввода 3-го параметра prev_value. Понятно, что в чистой формуле расчёта средней нужно значение предыдущего периода, но по-моему функция была бы понятнее обывателю если бы сама внутри себя считала это значение и в функцию надо было бы вводить только 3 данные как для SimpleMA.
Roman Sukhorukov
1116
Roman Sukhorukov  

Зачем нужен последний параметр weightsum в

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum) 

 притом что у остальных 3-х функций он отсутствует. Если он все таки нужен, то как его использовать при инициализации внешней переменной weightsum=0, криво работают другие функции и выдает ошибку деления на ноль.

elibrarius
1860
elibrarius  
Roman Sukhorukov:

Зачем нужен последний параметр weightsum в

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum) 

 притом что у остальных 3-х функций он отсутствует. Если он все таки нужен, то как его использовать при инициализации внешней переменной weightsum=0, криво работают другие функции и выдает ошибку деления на ноль.

В аналогичном индикаторе Custom Moving Average.mq5, поставляемого с терминалом, она объявлена внутри функции:

   static int weightsum;

как static, т.е. не будет сбрасываться при каждом новом пересчете индикатора. В индикаторах static int weightsum - не пересекаются, т.к. это разные потоки и у них свои переменные.

Но, полагаю, что если мы будем считать 2 или боле LWMA (запуская из эксперта) с разными периодами, то weightsum должна быть у каждого своя, а не 1 для всех путем объявления static внутри функции.

Т.о. нужно для каждого LWMA, нужно иметь свою глобальную переменную, которую будем передавать в LinearWeightedMAOnBuffer(),

Например если 2 LWMA, то глобально д.б. объявлены

int weightsum1;
int weightsum2;

и затем нужно передавать их функции.

Если я неправильно понял - прошу поправить.

elibrarius
1860
elibrarius  
elibrarius:

Т.о. нужно для каждого LWMA, нужно иметь свою глобальную переменную, которую будем передавать в LinearWeightedMAOnBuffer(),

Например если 2 LWMA, то глобально д.б. объявлены

int weightsum1;
int weightsum2;

и затем нужно передавать их функции.

Проверил, объявлением int weightsum1; int weightsum2; ... на глобальном уровне. Расчеты делает правильно.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий