Media móvel de indicador

 

Bom dia Pessoal,


estou tentando fazer uma media móvel dentro do indicador de volume, fiz com uma media de 20 períodos coloquei assim no código:

                   for(int j=20;j<rates_total;j++)

                   {

                     mm_volume[j] = (volume[j] + volume[j-1] + volume[j-2] + volume[j-3] + volume[j-4] + volume[j-5] +

                     volume[j-6] + volume[j-7] + volume[j-8] + volume[j-9] + volume[j-10] + volume[j-11] + volume[j-12] + 

                     volume[j-13] + volume[j-14] + volume[j-15] + volume[j-16] + volume[j-17] + volume[j-18] + volume[j-19] +

                     volume[j-20])/20;

                   }


funciona, porém acho que não é a forma correta de fazer isso pois se colocar para o usuário alterar o período ficaria muito errado e poderia a gerar erros também.

gostaria de saber como seria uma forma correta utilizando boas praticas no código.


pensei em criar um array do tamanho da variável que armazena o período e alocar os valores daria certo? ou ficaria uma execução muito carregada? e filtrar para não ocorrer uma divisão por 0

 
Criar um método específico assim abaixo

Double calcularMedia(Int x)
{
  Double resposta = 0;
  For(Int i = x; i < 20 + x; i++){
    Resposta += volume(i);
  }
  Resposta = resposta/20;
  Return resposta;
}

Se for incluir no evento oncalculate

Coloque dentro do loop
For(Int j = 20; j < rates_total; j++){
   Volumemm[j] = calcularMedia (j);
}

Espero que isso te ajude, eu não fiz teste com o algoritmo, porque já funcionava EA em cálculo de média com qualquer dados reais como preço de fechamento, índice de força relativa, etc.
 
Arthur Vieira:
Criar um método específico assim abaixo

Double calcularMedia(Int x)
{
  Double resposta = 0;
  For(Int i = x; i < 20 + x; i++){
    Resposta += volume(i);
  }
  Resposta = resposta/20;
  Return resposta;
}

Se for incluir no evento oncalculate

Coloque dentro do loop
For(Int j = 20; j < rates_total; j++){
   Volumemm[j] = calcularMedia (j);
}

Espero que isso te ajude, eu não fiz teste com o algoritmo, porque já funcionava EA em cálculo de média com qualquer dados reais como preço de fechamento, índice de força relativa, etc.



fiz isso, mas o método perde a definição do array do volume por estar fora do oncalculate()
 
gustavo.alonso:
fiz isso, mas o método perde a definição do array do volume por estar fora do oncalculate()
Testar abaixo

No mqlrates tem o real_volume ou tick_volume
 Variável abaixo:

Double, int ou ulong Volumemm[100];
MqlRates tarifas[];

Dentro do oncalculate

Arraysetasseries(tarifas, true);

CopyRates(Symbol (),Período(), 0, Bars(Symbol(),Period()), tarifas);
If(prev_calculated > 0){

For(Int j = 0; j < ArraySize(Volumemm); j++){
   Volumemm[j] = calcularMedia (j);
}

}

Fora da oncalculate

Double calcularMedia(Int x)
{
  Double resposta = 0;
  For(Int i = x; i < 20 + x; i++){
    Resposta += tarifas[i].real_volume; 
    Ou resposta += tarifas[i].tick_volume;
  }
  Resposta = resposta/20;
  Return resposta;
}

 
gustavo.alonso:
fiz isso, mas o método perde a definição do array do volume por estar fora do oncalculate()

Segue o exemplo de indicador com calculo da média pelo volume em cada candle abaixo.

indicador com media móvel de volume

A cor verde é quando o volume é maior que a média, vermelha é quando o volume é abaixo da média, azul é quando volume é igual a média.

script

Segue o script

 
Arthur Vieira:

Segue o exemplo de indicador com calculo da média pelo volume em cada candle abaixo.

A cor verde é quando o volume é maior que a média, vermelha é quando o volume é abaixo da média, azul é quando volume é igual a média.

Segue o script

você é d+ cara muito Obrigado, deu certo aqui.


Razão: