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

 

MovingAverages:

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

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

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

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

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

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

Автор: MetaQuotes Software Corp.

 

В строке:

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

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

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

 

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

Зачем нужен последний параметр 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, криво работают другие функции и выдает ошибку деления на ноль.

 
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:

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

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

int weightsum1;
int weightsum2;

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

Проверил, объявлением int weightsum1; int weightsum2; ... на глобальном уровне. Расчеты делает правильно.
 
Maxim Khrolenko #:
В функции ExponentiaMA мне не совсем понятен смысл ввода 3-го параметра prev_value. Понятно, что в чистой формуле расчёта средней нужно значение предыдущего периода, но по-моему функция была бы понятнее обывателю если бы сама внутри себя считала это значение и в функцию надо было бы вводить только 3 данные как для SimpleMA.

Совершенно согласен! Не понятно как её использовать. В итоге выбрал ExponentialMAOnBuffer, так как так и не понял, где брать  prev_value. Эти фунции нужны, чтобы не вызывать из советника внешний индикатор, считать всё внутри. Разраб предложил что?

Мне это напомнило цитату из мультика "Простоквашино" - "Что бы продать что-то не нужное, надо сначала купить что-то не нужное, а у нас денег нет."

 
Konstantin Efremov #:

Совершенно согласен! Не понятно как её использовать. В итоге выбрал ExponentialMAOnBuffer, так как так и не понял, где брать  prev_value. Эти фунции нужны, чтобы не вызывать из советника внешний индикатор, считать всё внутри. Разраб предложил что?

Мне это напомнило цитату из мультика "Простоквашино" - "Что бы продать что-то не нужное, надо сначала купить что-то не нужное, а у нас денег нет."

Да, присоединяюсь. То же относится и к:

//+------------------------------------------------------------------+
//| Smoothed Moving Average                                          |
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- check period
   if(period>0 && period<=(position+1))
     {
      if(position==period-1)
        {
         for(int i=0; i<period; i++)
            result+=price[position-i];

         result/=period;
        }

      result=(prev_value*(period-1)+price[position])/period;
     }

   return(result);
  }

Причём, неважно как рассчитается код, выделенный жёлтым. Всё равно результатом будет зелёная строка. И это в стандартных библиотеках MT5! М-дааа!

Доработайте функцию, а то толку от неё никакого. А в MQL5 очень требуется, когда требуется просчитать значения MA на нескольких инструментах. Причём заранее неизвестно каких. Не формировать же хендлы MA всех инструментов из обзора рынка!

 
Konstantin Efremov #:

Совершенно согласен! Не понятно как её использовать. В итоге выбрал ExponentialMAOnBuffer, так как так и не понял, где брать  prev_value. Эти фунции нужны, чтобы не вызывать из советника внешний индикатор, считать всё внутри. Разраб предложил что?

Мне это напомнило цитату из мультика "Простоквашино" - "Что бы продать что-то не нужное, надо сначала купить что-то не нужное, а у нас денег нет."

Andrey Kaunov #:

Да, присоединяюсь. То же относится и к:

Причём, неважно как рассчитается код, выделенный жёлтым. Всё равно результатом будет зелёная строка. И это в стандартных библиотеках MT5! М-дааа!

Доработайте функцию, а то толку от неё никакого. А в MQL5 очень требуется, когда требуется просчитать значения MA на нескольких инструментах. Причём заранее неизвестно каких. Не формировать же хендлы MA всех инструментов из обзора рынка!

Ну можно было поискать в CodeBase и посмотреть там. Я не один использовал эту библиотеку… 

MA on ATR
MA on ATR
  • www.mql5.com
Индикатор Moving Average по значениям индикатора Average True Range
Причина обращения: