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.
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.
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.
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.
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".
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!
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 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...
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?
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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:
Autor: MetaQuotes Software Corp.