Operador Simples atrasa criação e Candles no metatrader!

 

Olá Pessoal!

Criei um indicador, só para treino mesmo (I'm noob), e, dentre os vários problemas corriqueiros, o pior. Usava tal indicador e este, por algum motivo que não entendo, trava o tempo de resposta do MetaTrader. Alguém poderia me dizer o porquê? O indicador "busca" suporte e traça a média.


Abaixo, o programa em si.

É notório que ele de longe está do jeito mais grosseiro. É o protótipo... mas esse deveria pesar mais que vários outros  indicadores trabalhando junto ao mesmo tempo?

Na verdade, fiz (a pouco) uma correção que PARECEter solucionado o problema. Mas não estou crendo que muda um if de lugar (junto com outro comandos afins) possa ter mudado tanto o desempenho. 

Imagino que várias indicadores, a priori, pese mais que um if fora de lugar. Estou certo?


//+------------------------------------------------------------------+
//|                                               Média Completa.mq5 |
//|                                                  Daniel Bandeira |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Daniel Bandeira"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Média
#property indicator_label1  "Média"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot SuporteAlto
#property indicator_label2  "SuporteAlto"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot SUporteBaixo
#property indicator_label3  "SUporteBaixo"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDarkTurquoise
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters
input int      Velas = 14;
//--- indicator buffers



double         MediaBuffer[]; //para a média
double         SuporteAltoBuffer[]; // para armazenar o "suporte" 
double         SUporteBaixoBuffer[]; //para armazenar a "resistencia"
bool           PrimeiraVez; // para analisar se o valor da resistencia deve ser refeito


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MediaBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SuporteAltoBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,SUporteBaixoBuffer,INDICATOR_DATA);
/*    for(int i=0;i<4;i++)
     {
       PlotIndexSetInteger(i,PLOT_LINE_COLOR,cor);
       PlotIndexSetInteger(i,PLOT_LINE_STYLE,cor
     }*/
     
   
//---
   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[])
  {
//---


   
    for (int k = 2*Velas - 1; k < rates_total; k++) // se o período (Velas) é de determinado valor
                                                    // para a determinação das resistências tal valor usa 
 { 					            // um invervalo que tem o dobro de tamanho
    MediaBuffer[k] = 0;
 
    PrimeiraVez = true;    
    
    
    
   for (int i=0;i<Velas;i++)
      {
   								//atualiza os valores de suporte para cada média   
    /*LINHA 1 */         if(PrimeiraVez) { SuporteAltoBuffer[k] = high[k];   SUporteBaixoBuffer[k] = low[k]; PrimeiraVez = false;}
         
		                      // considera a média entre a MEDIANA, FECHAMENTO e ABERTURA como valor do Candle
             MediaBuffer[k] += ((high[k+i-Velas+1]+low[k+i-Velas+1])/2+close[k+i-Velas+1]+open[k+i-Velas+1])/3/Velas ;
      
       
/* ==> AQUI É A SEMENTE DO MAL?* JUSTIFICA??  SÓ DE RETIRAR A LINHA 1*/
	       for(int m=0;m<2*Velas;m++) // esse trecho pesa tanto assim a conta?!?!?!?! Eu sei que ele é redundante, mas...
               {
             
             if (SuporteAltoBuffer[k] < high[k-2*Velas+1+m]) SuporteAltoBuffer[k] = high[k-2*Velas+1+m];
             if (SUporteBaixoBuffer[k] > low[k-2*Velas+1+m]) SUporteBaixoBuffer[k] = low[k-2*Velas+1+m];
              
               }
            
            
            
       }
   
   
   
   
   }
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Cara eu também sou noob, mas vc meteu 3 Loops "for" um dentro do outro, claro que "pesa tanto assim a conta".

e vc pode zerar os buffers na função OnInit()não vai ajudar no seu caso, mas já é uma economia:

 ArrayInitialize(MediaBuffer,EMPTY_VALUE);

  ArrayInitialize(SuporteAltoBuffer,EMPTY_VALUE);

  ArrayInitialize(SUporteBaixoBuffer,EMPTY_VALUE);

 
AnarcoPhysic:

Olá Pessoal!


Olá,

no seu post anterior já havia comentado sobre a otimização do indicador.  


//+------------------------------------------------------------------+
//|                                               Média Completa.mq5 |
//|                                                  Daniel Bandeira |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Daniel Bandeira"
#property link      ""
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
//--- plot Média
#property indicator_label1  "Média"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot SuporteAlto
#property indicator_label2  "SuporteAlto"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot SUporteBaixo
#property indicator_label3  "SUporteBaixo"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDarkTurquoise
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- input parameters
input int      Velas=14;
//--- indicator buffers

double         MediaBuffer[]; //para a média
double         SuporteAltoBuffer[]; // para armazenar o "suporte" 
double         SUporteBaixoBuffer[]; //para armazenar a "resistencia"
bool           PrimeiraVez; // para analisar se o valor da resistencia deve ser refeito

int            inicio;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MediaBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SuporteAltoBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,SUporteBaixoBuffer,INDICATOR_DATA);

   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(rates_total<2*Velas) return(0);                   // qtd. mínima de rates para calc do indicador.
   if(prev_calculated==0) inicio=2*Velas-1;  // rate inicial p/ calc da indicador
   else inicio=prev_calculated;                                 // último rate para o qual o indicador já foi calculado

   for(int k=inicio; k<rates_total; k++)
     {
      MediaBuffer[k]=0;
      PrimeiraVez=true;
      for(int i=0;i<Velas;i++)
        {
         if(PrimeiraVez)
           {
            SuporteAltoBuffer[k]=high[k];
            SUporteBaixoBuffer[k]=low[k];
            PrimeiraVez=false;
           }
         MediaBuffer[k]+=((high[k+i-Velas+1]+low[k+i-Velas+1])/2+close[k+i-Velas+1]+open[k+i-Velas+1])/3/Velas;
         for(int m=0;m<2*Velas;m++)
           {
            if(SuporteAltoBuffer[k] < high[k-2*Velas+1+m]) SuporteAltoBuffer[k] = high[k-2*Velas+1+m];
            if(SUporteBaixoBuffer[k]> low[k-2*Velas+1+m]) SUporteBaixoBuffer[k] = low[k-2*Velas+1+m];
           }
        }
     }

   return(rates_total-1); // N-1 velas para trás já foram calculadas
   
  }
//+------------------------------------------------------------------+
 
zuazo:

Cara eu também sou noob, mas vc meteu 3 Loops "for" um dentro do outro, claro que "pesa tanto assim a conta".

e vc pode zerar os buffers na função OnInit()não vai ajudar no seu caso, mas já é uma economia:

Certo. Mas loops simples destes poderiam pesar tanto? Como falei, eu vi isso e mudei. Mas não esperava que 1 indicador, pesaria como 100! Sacou?

 
Rogerio Giannetti Torres:


Olá,

no seu post anterior já havia comentado sobre a otimização do indicador.  


Me surpreendeu pesar tanto. Mas parece que foi só para mim! KKK

Muito obrigado pela sua presente ajuda! Muito valiosa! Aprendi e aprendo bastante com você! Valeu!

Razão: