Bibliotecas: MovingAverages

 

MovingAverages:

A biblioteca MovingAverages é uma parte do pacote padrão do terminal cliente MetaTrader 5.

A biblioteca contém funções de cálculo dos diferentes tipos de moving averages. No total, há oito funções que podem ser divididas em dois grupos de funções do mesmo tipo, cada uma contendo quatro delas.

O primeiro grupo contém funções que recebem um array e simplesmente retornam um valor de uma média móvel em uma posição especificada:

Estas funções são destinadas para a obtenção do valor de uma média por vez para uma array, e não são otimizadas para várias chamadas. Se você precisa usar uma função deste grupo em um loop (para calcular os valores da média e escrever cada valor calculado em uma matriz), você vai ter que organizar um algoritmo otimizado.

O segundo grupo de funções é destinado a preencher uma matriz de valores de uma moving average com base em um array de valores iniciais:

  • SimpleMAOnBuffer() - preenche o array de saída buffer[] por valores de uma simple average do array price[];
  • ExponentialMAOnBuffer() - preenche o array de saída buffer[] por valores de uma exponential average do array price[];
  • SmoothedMAOnBuffer() - preenche o array de saída buffer[] por valores de uma smoothed average do array price[];
  • LinearWeightedMAOnBuffer() - preenche o array de saída buffer[] por valores de uma linear average do array price[].

Autor: MetaQuotes Software Corp.

 

Linha:

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

deve ser uma igualdade não estrita:

   if(period<1 || rates_total-begin<period) return(0);
Caso contrário, se, por exemplo, você compilar o código de entrega MACD.mq5 e definir InpSignalSMA=1, a linha Signal será igual a zero, embora deva ser igual à linha MACD.
 
Na função ExponentiaMA, não entendo muito bem o significado de inserir o terceiro parâmetro prev_value. É claro que, em uma fórmula pura para calcular a média, você precisa do valor do período anterior, mas, na minha opinião, a função seria mais clara para a pessoa comum se contasse esse valor internamente e apenas 3 dados tivessem que ser inseridos na função, como no caso do SimpleMA.
 

Por que você precisa do último parâmetro weightsum em

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

enquanto as outras 3 funções não o têm. Se ela ainda for necessária, como usá-la ao inicializar a variável externa weightsum=0, as outras funções funcionam de forma incorreta e geram o erro de divisão por zero.

 
Roman Sukhorukov:

Por que você precisa do último parâmetro weightsum em

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

enquanto as outras 3 funções não o têm. Se ela ainda for necessária, como usá-la ao inicializar a variável externa weightsum=0, as outras funções funcionam de forma incorreta e geram o erro de divisão por zero.

Em um indicador semelhante, o Custom Moving Average.mq5, fornecido com o terminal, ele é declarado dentro da função:

   static int weightsum;

como estático, ou seja, não será redefinido a cada novo recálculo do indicador. Nos indicadores static int weightsum - não se cruzam, porque são threads diferentes e têm suas próprias variáveis.

Mas suponho que, se contarmos 2 ou mais LWMAs (executadas a partir do Expert Advisor) com períodos diferentes, então weightsum deverá ser diferente para cada uma delas, e não 1 para todas, declarando static dentro da função.

Portanto, para cada LWMA, precisamos ter nossa própria variável global, que passaremos para LinearWeightedMAOnBuffer(),

Por exemplo, se houver 2 LWMAs, as seguintes variáveis devem ser declaradas globalmente

int weightsum1;
int weightsum2;

e então você precisa passá-las para a função.

Se eu tiver entendido errado, por favor, me corrija.

 
elibrarius:

Assim, para cada LWMA, precisamos ter uma variável global, que passaremos para LinearWeightedMAOnBuffer(),

Por exemplo, se houver 2 LWMAs, então as variáveis globais declaradas são

int weightsum1;
int weightsum2;

e, em seguida, você precisará passá-los para a função.

Verificado ao declarar int weightsum1; int weightsum2; ... em nível global. Ele faz os cálculos corretamente.
 
Maxim Khrolenko #:
Na função ExponentiaMA, não entendo muito bem o significado de inserir o terceiro parâmetro prev_value. Está claro que, em uma fórmula pura para calcular a média, você precisa do valor do período anterior, mas, na minha opinião, a função seria mais clara para a pessoa comum se contasse esse valor internamente e apenas 3 dados fossem inseridos na função, como no caso do SimpleMA.

Concordo plenamente! Não está claro como usá-la. No final, escolhi ExponentialMAOnBuffer porque não entendia de onde tirar o valor anterior. Essas funções são necessárias não para chamar um indicador externo do Expert Advisor, mas para ler tudo o que está dentro dele. O que o desenvolvedor sugeriu?

Isso me faz lembrar de uma citação do desenho animado "Prostokvashino" - "Para vender algo de que você não precisa, você deve primeiro comprar algo de que não precisa, e nós não temos dinheiro".

 
Konstantin Efremov #:

Concordo plenamente! Não está claro como usá-lo. No final, escolhi ExponentialMAOnBuffer, porque não entendia de onde tirar o valor anterior. Essas funções são necessárias não para chamar um indicador externo do Expert Advisor, mas para ler tudo o que está dentro dele. O desenvolvedor sugeriu o quê?

Isso me faz lembrar de uma citação do desenho animado "Prostokvashino" - "Para vender algo de que você não precisa, você deve primeiro comprar algo de que não precisa, e nós não temos dinheiro".

Sim, eu concordo. O mesmo se aplica a:

//+------------------------------------------------------------------+
//| Média móvel suavizada|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- período de verificação
   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);
  }

Não importa como o código em amarelo é calculado. O resultado ainda será uma string verde. E isso está nas bibliotecas padrão do MT5!

Melhore a função, caso contrário, ela será inútil. Na MQL5, ela é muito útil quando você precisa calcular os valores de MA em vários instrumentos. E não se sabe de antemão quais são eles. Não é possível formar alças MA de todos os instrumentos a partir da visão geral do mercado!

 
Konstantin Efremov #:

Concordo plenamente! Não está claro como usá-lo. No final, escolhi ExponentialMAOnBuffer, porque não entendia de onde tirar o valor anterior. Essas funções são necessárias não para chamar um indicador externo do Expert Advisor, mas para ler tudo o que está dentro dele. O desenvolvedor sugeriu o quê?

Isso me faz lembrar de uma citação do desenho animado "Prostokvashino" - "Para vender algo de que você não precisa, você deve primeiro comprar algo de que não precisa, e nós não temos dinheiro".

Andrey Kaunov #:

Sim, eu concordo com você. O mesmo se aplica a:

Não importa como o código destacado em amarelo é calculado. O resultado ainda será uma string verde. E isso está nas bibliotecas padrão do MT5!

Melhore a função, caso contrário, ela será inútil. Na MQL5, ela é muito útil quando você precisa calcular os valores de MA em vários instrumentos. E não se sabe de antemão quais são eles. Não é possível formar alças MA de todos os instrumentos a partir da visão geral do mercado!

Bem, você poderia pesquisar no CodeBase e dar uma olhada lá. Não sou o único que usou essa biblioteca...

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

Médias móveis:

Autor: MetaQuotes Software Corp.

Desculpe-me, mas o que é a variável "posição"?

double SimpleMA(const int position,const int period,const double &price[])
 
double SimpleMA( const int position, const int period, const double &price[])
  {
   double result= 0.0 ;
 //--- período de verificação 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

Bom dia

Está mais claro assim?