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.
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); } //+------------------------------------------------------------------+
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.
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.
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.
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.
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.
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.
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?
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
- 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
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().