EA sai do grafico se mudar o TimeFrame

 

Boa noite!


Meu EA tem varios indicadores a escolha, porem quando eu seleciono algum que fique na sub-Janela como o IFR, MACD, OBV e mudo o timeframe o EA sai do grafico. 

Alguem sabe me dizer por que isso so acontece com esses tipos de indicadores? Com os que vao na janela principal como BB e Media movel nao ocorre esse erro


Me ajudem por favor!

 
ramaziero:


Boa noite.


Aparentemente o erro ocorre em OnInit(). Se você puder postar ao menos essa parte do código, talvez alguém consiga lhe ajudar.

 
Meu OnInit tem mais de 400 linhas, mas vamos la rs...
Ele inclui criação dos Handles de 5 indicadores, validações de conta, simbolo etc...
Tem tambem um codigo de alteração de label de um painel que tenho no EA.

Mas acho q oque interessa pra vcs é a parte dos Handles ne?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

   //Traz o numero da conta e valida se ela pode usar este robo 
   ResetLastError();
   if(validaConta()==false)
    {
     ExpertRemove();
     Print("ATENÇÃO: Conta ", login, " não esta liberada para este robô.");
     return INIT_FAILED;
    }


   // Definição do símbolo utilizado para a classe responsável
   if(!simbolo.Name(_Symbol))
     {
      Print("Ativo Inválido!");
      return INIT_FAILED;
     }



   // Identifica o tipo da conta(Hedge ou Netting) e o Modo da conta (Demo, Real ou Torneio)
   tipoConta = TipoDeConta();
   modoConta = ModoDaConta();
   
   
   //Pega a Altura e Largura da maquina
   Altura = ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0);
   Largura = ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);


   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| CRIAÇÃO E VERIFICAÇÃO DOS HANDLES E INDICADORES                  |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


   //    ##### CRIAÇÃO DO BANDAS DE BOLLINGER   #####
   if(BB_LigDesl)
   {
      BB_Handle = iBands(_Symbol, _Period, BB_Periodo, BB_Deslocamento, BB_Desvio, BB_Preco);
   
      if(BB_Handle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle Bandas de Bollinger");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, 0, BB_Handle))
      {
         Print("Erro ao adicionar o indicador Bandas de Bollinger");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[0]=1;    //Adiciona o numero 1 que é o ID do Bandas de Bollinger
      
      Print("Bandas de Bollinger adicionado ao Array no indice 0 com valor de ID 1.");
   }



   //    ##### CRIAÇÃO DO CRUZAMENTO DE MEDIAS #####
   if(MxM_LigDesl)
   {
      MM_CurtaHandle =  iMA(_Symbol, _Period, MxM_PeriodoCurto, MxM_Shift, MxM_Tipo, MxM_Preco);  
      MM_LongHandle  =  iMA(_Symbol, _Period, MxM_PeriodoLongo, MxM_Shift, MxM_Tipo, MxM_Preco);
   
      if(MM_CurtaHandle == INVALID_HANDLE || MM_LongHandle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle Cruzamento de medias");
         return INIT_FAILED;
      }
   
      if(MxM_PeriodoLongo <= MxM_PeriodoCurto)
      {
         Print("Parâmetros de médias incorretos");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, 0, MM_CurtaHandle) || !ChartIndicatorAdd(0, 0, MM_LongHandle))
      {
         Print("Erro ao adicionar as Médias Moveis");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[1]=2;    //Adiciona o numero 2 que é o ID da Media Movel
      
      Print("Cruzamento de Medias adicionado ao Array no indice 1 com valor de ID 2.");
   }



   //CRIAÇÃO DO IFR
   if(IFR_LigDesl)
   {
      IFR_Handle     =  iRSI(_Symbol, _Period, IFR_Periodo, IFR_Preco);
      
      if(IFR_Handle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle IFR");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, totalSubJanelas, IFR_Handle))
      {
         Print("Erro ao adicionar o indicador IFR");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[2]=3;    //Adiciona o numero 3 que é o ID do IFR
      totalSubJanelas += 1;
      
      Print("IFR adicionado ao Array no indice 2 com valor de ID 3.");
   }

   

   //CRIAÇÃO DO MACD
   if(MCD_LigDesl)
   {
      MCD_Handle     =  iMACD(_Symbol, _Period, MCD_Rapida, MCD_Lenta, MCD_Sinal, MCD_Preco);
      
      if(MCD_Handle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle MACD");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, totalSubJanelas, MCD_Handle))
      {
         Print("Erro ao adicionar o indicador MACD");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[3]=4;    //Adiciona o numero 4 que é o ID do MACD
      totalSubJanelas += 1;
      
      Print("MACD adicionado ao Array no indice 3 com valor de ID 4.");
   }


   
   //CRIAÇÃO DO ESTOCASTICO
   if(EST_LigDesl)
   {
      EST_Handle     =  iStochastic(_Symbol, _Period, EST_K, EST_D, EST_Slow, EST_Tipo, EST_Preco); 
      
      if(EST_Handle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle ESTOCASTICO");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, totalSubJanelas, EST_Handle))
      {
         Print("Erro ao adicionar o indicador ESTOCASTICO");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[4]=5;    //Adiciona o numero 5 que é o ID do MACD
      totalSubJanelas += 1;
      
      Print("ESTOCASTICO adicionado ao Array no indice 4 com valor de ID 5.");
   }



   //CRIAÇÃO DO OBV
   if(OBV_LigDesl)
   {
      OBV_Handle     =  iOBV(_Symbol, _Period, OBV_Volume);
      
      if(OBV_Handle == INVALID_HANDLE)
      {
         Print("Erro na criação do handle OBV");
         return INIT_FAILED;
      }
   
      if(!ChartIndicatorAdd(0, totalSubJanelas, OBV_Handle))
      {
         Print("Erro ao adicionar o indicador OBV");
         return INIT_FAILED;
      }
        
      totalIndicadores += 1;
      indicadoresON[5]=6;    //Adiciona o numero 6 que é o ID do OBV
      totalSubJanelas += 1;
      
      Print("OBV adicionado ao Array no indice 5 com valor de ID 6.");
   }
   


   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| CONFIGURAÇÕES DE TEMPO                                           |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

   //Criação das structs de tempo
   TimeToStruct(StringToTime(inicio), horario_inicio);
   TimeToStruct(StringToTime(termino), horario_termino);
   TimeToStruct(StringToTime(fechamento), horario_fechamento);

   //Verificação de inconsistências nos parâmetros de entrada
   if(horario_inicio.hour > horario_termino.hour || (horario_inicio.hour == horario_termino.hour && horario_inicio.min > horario_termino.min))
     {
      printf("Parâmetros de Horário inválidos!");
      return INIT_FAILED;
     }

   //Verificação de inconsistências nos parâmetros de entrada
   if(horario_termino.hour > horario_fechamento.hour || (horario_termino.hour == horario_fechamento.hour && horario_termino.min > horario_fechamento.min))
     {
      printf("Parâmetros de Horário inválidos!");
      return INIT_FAILED;
     }


   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| TEMPO DA LINHA VERTICAL                                          |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     

   time_start     =  StructToTime(horario_inicio);
   time_pre_end   =  StructToTime(horario_termino);
   time_end       =  StructToTime(horario_fechamento);



   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| VALIDAÇÃO DE PARAMETROS                                          |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


      
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| CRIAÇÃO DO PAINEL                                                |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   if(Painel==1)
     {
      CriarPainel();

      //Armazena algumas informações para o painel
      string posicao = status();
      double profit = conta.Profit();
      double result = ResultDia();
         
      //Informações dinamicas que estão dentro do painel
      ObjectSetString(0,"HoraServidor",OBJPROP_TEXT,0,TimeToString(TimeCurrent(),TIME_SECONDS));
      ObjectSetString(0,"HoraProxBarra",OBJPROP_TEXT,0,TimeToString(TimeProxBarra(),TIME_SECONDS));
      ObjectSetString(0,"Posicao",OBJPROP_TEXT,0,posicao);
         if(posicao=="Nenhuma") { ObjectSetInteger(0, "Posicao", OBJPROP_COLOR, clrWhite); }
         if(posicao=="Comprado") { ObjectSetInteger(0, "Posicao", OBJPROP_COLOR, clrDeepSkyBlue); }
         if(posicao=="Vendido") { ObjectSetInteger(0, "Posicao", OBJPROP_COLOR, clrCrimson); }
      ObjectSetString(0,"Lotes",OBJPROP_TEXT,0,DoubleToString(PositionGetDouble(POSITION_VOLUME),0));
      ObjectSetString(0,"ResultOpen",OBJPROP_TEXT,0,DoubleToString(PositionGetDouble(POSITION_PROFIT),0));
         if(profit==0) { ObjectSetInteger(0, "ResultOpen", OBJPROP_COLOR, clrWhite); }
         if(profit>0) { ObjectSetInteger(0, "ResultOpen", OBJPROP_COLOR, clrDeepSkyBlue); }
         if(profit<0) { ObjectSetInteger(0, "ResultOpen", OBJPROP_COLOR, clrCrimson); }
      ObjectSetString(0,"ResultTotal",OBJPROP_TEXT,0,(string)ResultDia());
         if(result==0) { ObjectSetInteger(0, "ResultTotal", OBJPROP_COLOR, clrWhite); }
         if(result>0) { ObjectSetInteger(0, "ResultTotal", OBJPROP_COLOR, clrDeepSkyBlue); }
         if(result<0) { ObjectSetInteger(0, "ResultTotal", OBJPROP_COLOR, clrCrimson); }
      //ObjectSetString(0,"Trades",OBJPROP_TEXT,0,IntegerToString(tradesss,4,' '));
      //ObjectSetString(0,"Acertos",OBJPROP_TEXT,0,IntegerToString(acertos,4,' '));
      
      ChartRedraw();
     }


   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| VALIDAÇÃO OK                                                     |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    

   saldoInicial = conta.Equity();               //Guarda o saldo inicial assim que o robo inicializa
   trade.SetExpertMagicNumber(m_magic);         //Guarda o Magic assim que o robo inicializa

   //Tira as cores de stop e take padrão do MT5
   ChartSetInteger(0,CHART_COLOR_STOP_LEVEL,0,clrNONE);

   //Printa as informações gerais ao inicializar
   Print("ROBO: Iniciando os trabalhos em ", TimeLocal(), " ", "com o saldo de R$ ", saldoInicial, " e resultado do dia em, R$ ", ResultDia(), " .");


   //Desenha a linha Vertical
   if(lineVert==1)
     {
      Linha_Vertical("Inicio",time_start,clrLime, STYLE_DOT, 1);
      Linha_Vertical("PreFinal",time_pre_end,clrOrange, STYLE_DOT, 1);
      Linha_Vertical("Final",time_end,clrRed, STYLE_DOT, 1);
     }


   //Inicializa o robo
   return(INIT_SUCCEEDED);

}
 
ramaziero:
Meu OnInit tem mais de 400 linhas, mas vamos la rs...
Ele inclui criação dos Handles de 5 indicadores, validações de conta, simbolo etc...
Tem tambem um codigo de alteração de label de um painel que tenho no EA.

Mas acho q oque interessa pra vcs é a parte dos Handles ne?

Bom dia, o problema está relacionado à utilização da função ChartIndicatorAdd(). Segue um exemplo simplificado para tentar ajudar na solução do seu problema. Você pode testar também executar essa função que deleta os indicadores do gráfico em OnDeinit(), ao invés de OnInit():

//+------------------------------------------------------------------+
//|                                                     TESTANDO.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

//=== Global input variables
input bool BB_LigDesl  = true;
input bool MxM_LigDesl = true;
input bool IFR_LigDesl = true;

//=== Global internal variables

//--- Indicators
int BB_Handle, MM_CurtaHandle, MM_LongHandle, IFR_Handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //| CRIAÇÃO E VERIFICAÇÃO DOS HANDLES E INDICADORES                  |
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

   long TotalWind;
   int TotalIndi, SubWind;
   string NameIndi;
   if(ChartGetInteger(0,CHART_WINDOWS_TOTAL,0,TotalWind))
     {
      for(int i=0;i<TotalWind;i++)
        {
         TotalIndi=ChartIndicatorsTotal(0,i);
         for(int j=0;j<TotalIndi;j++)
           {
            NameIndi = ChartIndicatorName(0,i,0);
            if(!ChartIndicatorDelete(0,i,NameIndi))
              {
               Print("Could not delete indicator ", NameIndi, ".");
               return INIT_FAILED;
              }
           }
        }   
     }


   //    ##### CRIAÇÃO DO BANDAS DE BOLLINGER   #####
   if(BB_LigDesl)
     {
      BB_Handle = iBands(_Symbol, _Period, 20, 0, 2, PRICE_CLOSE);
   
      if(BB_Handle == INVALID_HANDLE)
        {
         Print("Erro na criação do handle Bandas de Bollinger");
         return INIT_FAILED;
        }
   
      if(!ChartIndicatorAdd(0, 0, BB_Handle))
        {
         Print("Erro ao adicionar o indicador Bandas de Bollinger");
         return INIT_FAILED;
        }
     }



   //    ##### CRIAÇÃO DO CRUZAMENTO DE MEDIAS #####
   if(MxM_LigDesl)
     {
      MM_CurtaHandle =  iMA(_Symbol, _Period, 12, 0, MODE_SMA, PRICE_CLOSE);  
      MM_LongHandle  =  iMA(_Symbol, _Period, 26, 0, MODE_SMA, PRICE_CLOSE);
   
      if(MM_CurtaHandle == INVALID_HANDLE || MM_LongHandle == INVALID_HANDLE)
        {
         Print("Erro na criação do handle Cruzamento de medias");
         return INIT_FAILED;
        }
      
      if(!ChartIndicatorAdd(0, 0, MM_CurtaHandle) || !ChartIndicatorAdd(0, 0, MM_LongHandle))
        {
         Print("Erro ao adicionar as Médias Moveis");
         return INIT_FAILED;
        }
     }



   //CRIAÇÃO DO IFR
   if(IFR_LigDesl)
     {
      IFR_Handle     =  iRSI(_Symbol, _Period, 14, PRICE_CLOSE);
      
      if(IFR_Handle == INVALID_HANDLE)
        {
         Print("Erro na criação do handle IFR");
         return INIT_FAILED;
        }
   
      SubWind=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
      if(!ChartIndicatorAdd(0, SubWind, IFR_Handle))
      {
         Print("Erro ao adicionar o indicador IFR");
         return INIT_FAILED;
      }
        
   }
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
 
ramaziero:


Boa Tarde,

qdo. você muda o TF o EA reinicia, mas  suas variáveis não reiniciam , pode ser que você esteja executando um ExpertRemove() por que uma condição ficou marcada.  Portanto, certifique-se que as suas variáveis sejam inicializadas no OnInit().  O programa anexo  demonstra o que eu estou dizendo.

Arquivos anexados:
Exp_Teste0.mq5  11 kb
Razão: