Indicadores não aparecem na Tela do MT5

 

Olá pessoal estou testando um EA com ADX mas quando rodo o EA o ADX não aparace na tela do Mt5.

Quando rodo o back test ele aparece porém com o valor de períodos incorreto.

Eu ja reinstalei o Mt5 e não resolveu.

O ativo que negocio é mini Dolar e mini Indice.

Vocês tem alguma ideia do que pode estar faltando no código ou alguma configuração do MT5?


Vejam como estou iniciando o indicador:


int OnInit()
  { 
  
   TimeToStruct(StringToTime(inicio), horario_inicio);
   TimeToStruct(StringToTime(termino), horario_termino);
   TimeToStruct(StringToTime(fechamento), horario_fechamento);
   
   //Verifica se os horários foram iniciados corretamente
   if(horario_inicio.hour > horario_termino.hour || (horario_inicio.hour == horario_termino.hour && horario_inicio.min > horario_termino.min))
   {
      printf("Parametros de horarios inválidos");
      return INIT_FAILED;
   }
      
   //Verifica se os horários foram iniciados corretamente   
   if(horario_termino.hour > horario_fechamento.hour || (horario_termino.hour == horario_fechamento.hour && horario_termino.min > horario_fechamento.min))
   {
      printf("Parametros de horarios inválidos");
      return INIT_FAILED;
   }
   
   if(!simbolo.Name(_Symbol))
   {
      printf("Ativo inválido");
      return INIT_FAILED;
   }
  
//--- atribuir p/ os manupuladores

   TesterHideIndicators(true);
   adxHandle = iADX(_Symbol, _Period, periodoAdx);
   
   ArraySetAsSeries(adx, true);
   ArraySetAsSeries(diMenos, true);
   ArraySetAsSeries(diMais, true);
   
   ChartIndicatorAdd(0,0,adxHandle);

   return(INIT_SUCCEEDED);
  }
 
João Bernardes:

...

tenta isso..

int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);

int OnInit()
 {
  ....
   if(ChartIndicatorsTotal(0,total)<1)
   {
    ChartIndicatorAdd(0,total,handle);
   }
 }
 
Jonathan Pereira:

tenta isso..


Cara agora o ADX apareceu na janela de negociação, porém quando eu fecho o MT5 e abro de novo ele insere outro ADX com o mesmo valor de período do inicial, isso tbm acontece na janela de back test.

Aqui esta o código como deixei com a sua modificação sugerida:


int OnInit()
  { 
  
   TimeToStruct(StringToTime(inicio), horario_inicio);
   TimeToStruct(StringToTime(termino), horario_termino);
   TimeToStruct(StringToTime(fechamento), horario_fechamento);
   
   //Verifica se os horários foram iniciados corretamente
   if(horario_inicio.hour > horario_termino.hour || (horario_inicio.hour == horario_termino.hour && horario_inicio.min > horario_termino.min))
   {
      printf("Parametros de horarios inválidos");
      return INIT_FAILED;
   }
      
   //Verifica se os horários foram iniciados corretamente   
   if(horario_termino.hour > horario_fechamento.hour || (horario_termino.hour == horario_fechamento.hour && horario_termino.min > horario_fechamento.min))
   {
      printf("Parametros de horarios inválidos");
      return INIT_FAILED;
   }
   
   if(!simbolo.Name(_Symbol))
   {
      printf("Ativo inválido");
      return INIT_FAILED;
   }
  
//--- atribuir p/ os manupuladores

   TesterHideIndicators(true);
   adxHandle = iADX(_Symbol, _Period, periodoAdx);
   
   ArraySetAsSeries(adx, true);
   ArraySetAsSeries(diMenos, true);
   ArraySetAsSeries(diMais, true);
   
   if(ChartIndicatorsTotal(0,total)<1)
   {
    ChartIndicatorAdd(0,total,adxHandle);
   }

   return(INIT_SUCCEEDED);
  }
 
João Bernardes:

...

int adxHandle = INVALID_HANDLE;
int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   adxHandle = iADX(Symbol(), Period(), 14);

//ArraySetAsSeries(adx, true);
//ArraySetAsSeries(diMenos, true);
//ArraySetAsSeries(diMais, true);
   if(ChartIndicatorsTotal(0,total) < 1)
     {
      ChartIndicatorAdd(0,total,adxHandle);
     }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ChartIndicatorDelete(0, total, ChartIndicatorName(0, total, 0));
   adxHandle=INVALID_HANDLE;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+
 
Jonathan Pereira:

Desculpe não entendi bem oque você sugeriu neste código.


Poderia explicar melhor.

 
João Bernardes:

...

Faltou vc Desinicializar o código.

void OnDeinit(const int reason)
  {
//---
   ChartIndicatorDelete(0, total, ChartIndicatorName(0, total, 0));
   adxHandle=INVALID_HANDLE;
  }
 
João Bernardes:

Olá pessoal estou testando um EA com ADX mas quando rodo o EA o ADX não aparace na tela do Mt5.

Quando rodo o back test ele aparece porém com o valor de períodos incorreto.

Eu ja reinstalei o Mt5 e não resolveu.

O ativo que negocio é mini Dolar e mini Indice.

Vocês tem alguma ideia do que pode estar faltando no código ou alguma configuração do MT5?


Vejam como estou iniciando o indicador:


Você está confundindo tudo!

Instanciar a função interna iADX() não vai fazer com que o indicador apareça no gráfico.

Uma coisa é você ler dados do indicador ADX instanciado, outra é exibí-lo no gráfico.

Mostrar ou não mostrar as coisas no gráfico é uma área onde o MQL5 é uma m*... completamente inconsistente e confuso. Já partindo da premissa que, em tempo de compilação você explicitamente precisa mencionar quantos buffers de PLOT precisa... O que depois, em tempo de execução você fica amarrado com o que definiu em tempo de Compilação... Do ponto de vista de engenharia de software, é ridícula essa abordagem, mas enfim, é apenas um desabafo...

E quando entra o Backtest então, é um inferno... Ou ele duplica, ou não mostra nada, porque depende da lógica inicial que você aplicou em seu projeto.

No seu caso, deixe o código do jeito que estava, apenas lendo o iADX, pois afinal, o EA não precisa LER nada do gráfico, E, grave um template com o nome de tester.tpl com o ADX enfiado no gráfico, com as mesmas configurações que vc está usando no EA, e assim você será feliz, sem penalizar a performance do seu EA quando ele for pra conta real...

;)

 
Flavio Jarabeck:

Você está confundindo tudo!

Instanciar a função interna iADX() não vai fazer com que o indicador apareça no gráfico.

Uma coisa é você ler dados do indicador ADX instanciado, outra é exibí-lo no gráfico.

Mostrar ou não mostrar as coisas no gráfico é uma área onde o MQL5 é uma m*... completamente inconsistente e confuso. Já partindo da premissa que, em tempo de compilação você explicitamente precisa mencionar quantos buffers de PLOT precisa... O que depois, em tempo de execução você fica amarrado com o que definiu em tempo de Compilação... Do ponto de vista de engenharia de software, é ridícula essa abordagem, mas enfim, é apenas um desabafo...

E quando entra o Backtest então, é um inferno... Ou ele duplica, ou não mostra nada, porque depende da lógica inicial que você aplicou em seu projeto.

No seu caso, deixe o código do jeito que estava, apenas lendo o iADX, pois afinal, o EA não precisa LER nada do gráfico, E, grave um template com o nome de tester.tpl com o ADX enfiado no gráfico, com as mesmas configurações que vc está usando no EA, e assim você será feliz, sem penalizar a performance do seu EA quando ele for pra conta real...

;)

Aparece sim, só vc foçar com a função.

ChartIndicatorAdd

Em questões de performance é melhor reutilizar o indicado já instanciado no robô, uma vez que o indicador vai rodar em uma thread separada consumindo mais recursos...Concordo plenamente com vc que quando o assunto é plotar objetos no gráfico é um Deus nos acuda.

Mas com o código que eu postei acima não duplica código em momento algum, podendo recarrega-lo diversas vezes ou ate mesmo recompila-lo, pois forço a deleção dele na OnDenit.

Documentação sobre MQL5: Operações de Gráficos / ChartIndicatorAdd
Documentação sobre MQL5: Operações de Gráficos / ChartIndicatorAdd
  • www.mql5.com
"Após o lançamento no gráfico (e receber o erro no Jornal), abrir" "Propriedades do Expert Advisor e especificar   correto e os parâmetros do  ." //| Função de inicialização do Expert                                |                                                                                       ...
 
Jonathan Pereira:

Em questões de performance é melhor reutilizar o indicado já instanciado no robô, uma vez que o indicador vai rodar em uma thread separada consumindo mais recursos...Concordo plenamente com vc que quando o assunto é plotar objetos no gráfico é um Deus nos acuda.

Mas com o código que eu postei acima não duplica código em momento algum, podendo recarrega-lo diversas vezes ou ate mesmo recompila-lo, pois forço a deleção dele na OnDenit.

Aparentemente funcionou.

Menos no back test que aparece com o valor de período errado.

Vou acompanhar amanha durante o pregão.

Tem algo que eu possa fazer pra acertar no back test tbm?

 
João Bernardes:

Aparentemente funcionou.

Menos no back test que aparece com o valor de período errado.

Vou acompanhar amanha durante o pregão.

Tem algo que eu possa fazer pra acertar no back test tbm?

O Período só aparecera errado se vc passar errado, faço um debug e capture a variável desde o inicio, veja se não esta modificando seu valor em algum momento. Lembre-se que deve ser int a variável 

 
Jonathan Pereira:

O Período só aparecera errado se vc passar errado, faço um debug e capture a variável desde o inicio, veja se não esta modificando seu valor em algum momento. Lembre-se que deve ser int a variável 

Não acho que seja isso pq eu inicio ela como 18, na janela do gráfico aparece como 18 normalmente, somente no back test aparece 14.

Nos parametros de entrada também esta como 18 mas mesmo assim no back test aparece 14.

mas vou debugar mesmo assim.

Razão: