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