Indicador de médias móveis lento

 

Olá pessoal,

Tenho um indicador que usa 6 diferentes médias móveis que usam tem como parâmetros de preço um indicador personalizado que fiz.

O código funciona perfeitamente, porém para otimização está muito lento. E gostaria de saber o que posso fazer para melhorar o desempenho.

Infelizmente não posso publicar o código do indicador, mas garanto que a sintaxe está correta. Quero apenas saber se existem macetes para melhorar a velocidade de cálculo das médias móveis.

PS.: Já tentei usar iMA() e SimpleMAOnBuffer().

 
Sidnei Da Silva Santos Junior:

Olá pessoal,

Tenho um indicador que usa 6 diferentes médias móveis que usam tem como parâmetros de preço um indicador personalizado que fiz.

O código funciona perfeitamente, porém para otimização está muito lento. E gostaria de saber o que posso fazer para melhorar o desempenho.

Infelizmente não posso publicar o código do indicador, mas garanto que a sintaxe está correta. Quero apenas saber se existem macetes para melhorar a velocidade de cálculo das médias móveis.

PS.: Já tentei usar iMA() e SimpleMAOnBuffer().

Olá Sidnei

Poderia elaborar um pouco mais o que o seu indicador faz? O problema de performance pode estar aí, na maneira em que escreveu o código.

 
Eduardo Fernando Teixeira:

Olá Sidnei

Poderia elaborar um pouco mais o que o seu indicador faz? O problema de performance pode estar aí, na maneira em que escreveu o código.

Eu dei uma disfarçada no código mas a mecânica é essa abaixo:


#property copyright "Sidnei da Silva Santos Junior"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   1

//--- plot PresencaInstitucional
#property indicator_label1  "PresencaInstitucional"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrWhiteSmoke
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double         PresencaInstitucional[];

double MEDIA_1[];
double MEDIA_2[];
double MEDIA_3[];
double MEDIA_4[];
double MEDIA_5[];
double MEDIA_6[];

input int Periodo1=0;//iNSIRA O PERIODO DE ANALISE 1
input int Periodo2=0;//iNSIRA O PERIODO DE ANALISE 2
input int Periodo3=0;//iNSIRA O PERIODO DE ANALISE 3
input int Periodo4=0;//iNSIRA O PERIODO DE ANALISE 4
input int Periodo5=0;//iNSIRA O PERIODO DE ANALISE 5
input int Periodo6=0;//iNSIRA O PERIODO DE ANALISE 6

int inicio, barras, m1,m2,m3,m4,m5,m6;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,PresencaInstitucional,INDICATOR_DATA);
   SetIndexBuffer(1,MEDIA_1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,MEDIA_2,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,MEDIA_3,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,MEDIA_4,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,MEDIA_5,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,MEDIA_6,INDICATOR_CALCULATIONS);
   
   m1 = iMA(Symbol(),Period(),Periodo1,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
   m2 = iMA(Symbol(),Period(),Periodo2,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
   m3 = iMA(Symbol(),Period(),Periodo3,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
   m4 = iMA(Symbol(),Period(),Periodo4,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
   m5 = iMA(Symbol(),Period(),Periodo5,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
   m6 = iMA(Symbol(),Period(),Periodo6,0,MODE_SMA,(iCustom(Symbol(),Period(),"Institucionais.ex5")));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

if(prev_calculated==0){inicio=0;barras=rates_total;}else{inicio=prev_calculated-1;barras=1;}
for(int i=inicio;i<rates_total;i++){

   CopyBuffer(m1,0,0,barras,MEDIA_1);
   CopyBuffer(m2,0,0,barras,MEDIA_2);
   CopyBuffer(m3,0,0,barras,MEDIA_3);
   CopyBuffer(m4,0,0,barras,MEDIA_4);
   CopyBuffer(m5,0,0,barras,MEDIA_5);
   CopyBuffer(m6,0,0,barras,MEDIA_6);

   if ((MEDIA_1[i]  > MEDIA_2[i])  && (MEDIA_3[i]  > MEDIA_4[i])  && (MEDIA_5[i]  > MEDIA_6[i])  ) {
            PresencaInstitucional[i] =1;
            
      } else if ( (MEDIA_1[i]  < MEDIA_2[i])  && (MEDIA_3[i]  < MEDIA_4[i])  && (MEDIA_5[i]  < MEDIA_6[i])  ) {
            PresencaInstitucional[i]=-1;
            
      }
         else{PresencaInstitucional[i]=0;}

}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Sidnei Da Silva Santos Junior:

Eu dei uma disfarçada no código mas a mecânica é essa abaixo:


Você está chamando um iCustom dentro do iMA, por 6 vezes, talvez o peso esteja aí. Se você quiser ajuda aqui nesse fórum precisa ser um pouco mais aberto com o seu objetivo, senão fica difícil poder te ajudar.

 
Eduardo Fernando Teixeira:

Você está chamando um iCustom dentro do iMA, por 6 vezes, talvez o peso esteja aí. Se você quiser ajuda aqui nesse fórum precisa ser um pouco mais aberto com o seu objetivo, senão fica difícil poder te ajudar.

Que tipo de objetividade?

O indicador em si funciona, o ponto é que preciso deixar ele muito mais leve para realizar testes de robustez. O indicador do iCustom é um cálculo de volume ponderado por preço.

 
Sidnei Da Silva Santos Junior:

Que tipo de objetividade?

O indicador em si funciona, o ponto é que preciso deixar ele muito mais leve para realizar testes de robustez. O indicador do iCustom é um cálculo de volume ponderado por preço.

Objetividade no sentido de não querer revelar o que realmente este seu indicador faz. Entendo que você está criando algo original e não gostaria de ser copiado, mas aí você se complica na hora de pedir algum tipo de ajuda.

 
Eduardo Fernando Teixeira:

Objetividade no sentido de não querer revelar o que realmente este seu indicador faz. Entendo que você está criando algo original e não gostaria de ser copiado, mas aí você se complica na hora de pedir algum tipo de ajuda.

Na verdade é que tem um contrato em cima do trabalho e judicialmente sofro penalidades se for exposta a ideia.

 
Sidnei Da Silva Santos Junior:

Na verdade é que tem um contrato em cima do trabalho e judicialmente sofro penalidades se for exposta a ideia.

Te entendo, sem problemas.

Meu palpite é este excesso de indicadores que deixam o MT lento. Se fossem apenas as médias móveis acredito que seria mais rápido, pois o código delas é muito bem escrito e leve, mas o problema pode vir realmente do seu iCustom, pois você está calculando um indicador a partir de outro. Se for isso infelizmente não tem muito o que fazer, o processo será lento mesmo.

Eu rodo uns scripts que carregam e calculam indicadores de diversos ativos diferentes, e também roda bem pesado, principalmente na primeira vez que executa.

 
Sidnei Da Silva Santos Junior:

Na verdade é que tem um contrato em cima do trabalho e judicialmente sofro penalidades se for exposta a ideia.

Você tem que entender que o MQL é uma tecnolgia um tanto arcaica para os dias de hoje. É simples de usar e eficiente em muitas situações, mas de repente utilizar outra plataforma com alguma linguagem mais avançada possa resolver seu problema.

 
Eduardo Fernando Teixeira:

Você tem que entender que o MQL é uma tecnolgia um tanto arcaica para os dias de hoje. É simples de usar e eficiente em muitas situações, mas de repente utilizar outra plataforma com alguma linguagem mais avançada possa resolver seu problema.

Entendo, vou procurar mais soluções e testar uma melhora no sentido de carregar o iCustom. Esse indicador do iCustom eu consigo calculá-lo dentro desse script sem problemas pois fui eu que desenvolvi também.

Outro detalhe é que ao carregar apenas o indicador do iCustom no gráfico da série contínua ele foi bem mais rápido.
Você conhece alguma outra forma de chamar o iCustom apenas uma vez pra cálcular a média e depois ir trocando os períodos?

 
Sidnei Da Silva Santos Junior:

Entendo, vou procurar mais soluções e testar uma melhora no sentido de carregar o iCustom. Esse indicador do iCustom eu consigo calculá-lo dentro desse script sem problemas pois fui eu que desenvolvi também.

Outro detalhe é que ao carregar apenas o indicador do iCustom no gráfico da série contínua ele foi bem mais rápido.
Você conhece alguma outra forma de chamar o iCustom apenas uma vez pra cálcular a média e depois ir trocando os períodos?

não saberia dizer, não tenho muita experiência com o iCustom

Razão: