Média Móvel sem a função iMA

 

Estou utilizando médias móveis sem a função iMA. Na média simples eu fiz com o código abaixo e funciona perfeitamente:

{
 double average = 0.0;
 for(int i=0; i<period; i++)
 {
  average += rates[i].close;
 }
 average /= period;
 Print(average);
}

Porém, na média exponencial estou encontrando dificuldades. Alguém, por favor, poderia me ajudar? O correto seria algo parecido conforme fiz, mostrado abaixo:

{
 ArraySetAsSeries(exp_average, true);
 double alpha = 2.0 / (period + 1.0);
 for(int i=0; i<period; i++)
 {
  exp_average[i] = rates[i].close * alpha + exp_average[i+1] * (1 - alpha);
  Print(exp_average[i]);
 }
}

Creio que o problema esteja no array da média exponencial anterior, onde não sei como calcular o primeiro valor.

 
Victor Hugo:

Estou utilizando médias móveis sem a função iMA. Na média simples eu fiz com o código abaixo e funciona perfeitamente:

Porém, na média exponencial estou encontrando dificuldades. Alguém, por favor, poderia me ajudar? O correto seria algo parecido conforme fiz, mostrado abaixo:

Creio que o problema esteja no array da média exponencial anterior, onde não sei como calcular o primeiro valor.

Boa tarde, Victor Hugo.

Consegui localizar dois pontos de atenção no seu código de média móvel exponencial:

1 - Como você disse, é necessário definir o primeiro valor antes de iniciar o cálculo das demais posições. Se você procurar pela média móvel em  \Indicators\Examples, vai encontrar o código usado pelo metatrader para gerar o indicador. Ele realiza o cálculo da média duas vezes, sendo que, no primeiro laço, ele utiliza o valor do próprio preço como a primeira posição e, no segundo, os resultados previamente calculados:


void CalculateEMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int    i,limit;
   double SmoothFactor=2.0/(1.0+InpMAPeriod);
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      limit=InpMAPeriod+begin;
      ExtLineBuffer[begin]=price[begin];
      for(i=begin+1;i<limit;i++)
         ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
     }
   else limit=prev_calculated-1;
//--- main loop
   for(i=limit;i<rates_total && !IsStopped();i++)
      ExtLineBuffer[i]=price[i]*SmoothFactor+ExtLineBuffer[i-1]*(1.0-SmoothFactor);
//---
  }
//+-


2 - O outro ponto é que na linha 6 do seu código me parece que houve um erro de digitação: 

 exp_average[i] = rates[i].close * alpha + exp_average[i+1] * (1 - alpha);

Em vez de [i+1]. seria [i-1], caso contrário você estaria utilizar um valor ainda não calculado pelo seu código, possivelmente igual a zero.

Sigo à disposição,

Daniela Reis.

Razão: