ChartSetSymbolPeriod: EA não reinicializa após troca de ativo ou TF

 

Olá a todos,

Já postei no fórum em inglês mas ainda não consegui resolver, quem sabe aqui em português alguém tem uma luz?

Meu EA utiliza ChartSetSymbolPeriod para modificar o ativo e/ou o timeframe.

Às vezes funciona corretamente: o EA DeInitializa, muda o ativo e/ou o timeframe no gráfico, e reinicia automaticamente, como deveria ser.

Muitas vezes, no entanto, está ocorrendo que o EA DeInitializa, muda o ativo e/ou o timeframe, mas não reinicia. Simplesmente termina a execução, deixando o gráfico sem nenhum EA rodando.

Eu sei que ChartSetSymbolPeriod é assíncrono, portanto pensei que alguma coisa no meu código executando após a chamada da função poderia estar interferindo. Já tentei diversas soluções, como:

  • Chamar a função a partir de diferentes pontos do código (OnTick, OnTimer);
  • KillTimer antes de chamar a função;
  • Colocar Sleeps em pontos estratégicos (após chamar a função, no OnDeInit);
  • Chamar explicitamente OnInit() no final do OnDeInit;

Mas ainda não achei a solução definitiva. Simplesmente, às vezes o EA não reinicializa.

Será que alguém tem alguma outra sugestão?

Obrigado!

(Não creio que seja relevante, mas só como informação, a principal razão pela qual uso ChartSetSymbolPeriod é para mudar os contratos de mini-índice e mini-dólar no vencimento)

Documentação sobre MQL5: Operações de Gráficos / ChartSetSymbolPeriod
Documentação sobre MQL5: Operações de Gráficos / ChartSetSymbolPeriod
  • www.mql5.com
Modifica o valor do símbolo e o período do gráfico especificado. A função é assíncrona, ou seja...
 
Rogerio Celentano Szterling:

Olá a todos,

Já postei no fórum em inglês mas ainda não consegui resolver, quem sabe aqui em português alguém tem uma luz?

Meu EA utiliza ChartSetSymbolPeriod para modificar o ativo e/ou o timeframe.

Às vezes funciona corretamente: o EA DeInitializa, muda o ativo e/ou o timeframe no gráfico, e reinicia automaticamente, como deveria ser.

Muitas vezes, no entanto, está ocorrendo que o EA DeInitializa, muda o ativo e/ou o timeframe, mas não reinicia. Simplesmente termina a execução, deixando o gráfico sem nenhum EA rodando.

Eu sei que ChartSetSymbolPeriod é assíncrono, portanto pensei que alguma coisa no meu código executando após a chamada da função poderia estar interferindo. Já tentei diversas soluções, como:

  • Chamar a função a partir de diferentes pontos do código (OnTick, OnTimer);
  • KillTimer antes de chamar a função;
  • Colocar Sleeps em pontos estratégicos (após chamar a função, no OnDeInit);
  • Chamar explicitamente OnInit() no final do OnDeInit;

Mas ainda não achei a solução definitiva. Simplesmente, às vezes o EA não reinicializa.

Será que alguém tem alguma outra sugestão?

Obrigado!

(Não creio que seja relevante, mas só como informação, a principal razão pela qual uso ChartSetSymbolPeriod é para mudar os contratos de mini-índice e mini-dólar no vencimento)

hum, se já ti responderam que "desabilitar algoritmos em troca de ativos e periodos tem que estar desmarcado", voce já desmarcou? Além disso, tem algum erro que da nas trocas de ativo nesses casos especificos que encerra? já pensou em talvez não "desligar tudo" usando o parametro de entrada do ondeinit? Por exemplo, em casos de desenhos em tela as vezes é muita vantagem não destruir todos os desenhos em troca de timeframe (REASON_CHARTCHANGE).

 
Ricardo Rodrigues Lucca #:

hum, se já ti responderam que "desabilitar algoritmos em troca de ativos e periodos tem que estar desmarcado", voce já desmarcou? Além disso, tem algum erro que da nas trocas de ativo nesses casos especificos que encerra? já pensou em talvez não "desligar tudo" usando o parametro de entrada do ondeinit? Por exemplo, em casos de desenhos em tela as vezes é muita vantagem não destruir todos os desenhos em troca de timeframe (REASON_CHARTCHANGE).

Olá Ricardo, obrigado pela resposta.

Sim, "desabilitar Algotrading em troca de ativos" está desmarcado.

Não dá nenhum erro nesses casos específicos que encerra.

Eu já tentei "não fazer nada" no OnDeinit nesses casos, colocando na primeira linha do OnDeInit

if(reason==REASON_CHARTCHANGE)
  return;

Nada disso resolveu. Continuo quebrando a cabeça aqui.

 

Olá Rogério.


Problema estranho, principalmente porque a função ChartSetSymbolPeriod não costuma remover o EA do gráfico.

Basta observar que as variáveis, objetos, etc. permanecem com o mesmo valor se vc não desinicializá-los.

Meu melhor palpite é que algum erro depois do ChartSetSymbolPeriod e o OnInit está provocando a remoção do EA. O problema é que todos os que pensei deixaria alguma pista na aba Experts ou na aba Diário.

Testei fazendo propositalmente "array out of range", acessar ponteiro inválido, remover explicitamente através de ExpertRemove e também provocando estouro de pilha ao fazer chamadas cruzadas entre funções (Neste meu caso o EA só ficou travado, mas não foi removido). Também criei um loop infinito no OnDeinit esperando pra ver se o Metatrader derrubava o EA, mas ele não derrubou quando o motivo foi REASON_CHARTCHANGE.

Todos estes erros deixaram alguma mensagem na aba Experts.

Se vc provocar um INIT_FAILED no OnInit, pode não aparecer na aba Experts, mas vai aparecer na aba Diário.

De qualquer forma ainda acho que vale a pena explorar se não há algum erro destes tipos.

 
Rogerio Celentano Szterling #:

Olá Ricardo, obrigado pela resposta.

Sim, "desabilitar Algotrading em troca de ativos" está desmarcado.

Não dá nenhum erro nesses casos específicos que encerra.

Eu já tentei "não fazer nada" no OnDeinit nesses casos, colocando na primeira linha do OnDeInit

Nada disso resolveu. Continuo quebrando a cabeça aqui.

Só pra titulo de esclarecimento, voce esta testando usando o EA "ao vivo", correto? Não é testador de estrategia?
 
JULIANO MARANGONI #:

Olá Rogério.


Problema estranho, principalmente porque a função ChartSetSymbolPeriod não costuma remover o EA do gráfico.

Basta observar que as variáveis, objetos, etc. permanecem com o mesmo valor se vc não desinicializá-los.

Meu melhor palpite é que algum erro depois do ChartSetSymbolPeriod e o OnInit está provocando a remoção do EA. O problema é que todos os que pensei deixaria alguma pista na aba Experts ou na aba Diário.

Testei fazendo propositalmente "array out of range", acessar ponteiro inválido, remover explicitamente através de ExpertRemove e também provocando estouro de pilha ao fazer chamadas cruzadas entre funções (Neste meu caso o EA só ficou travado, mas não foi removido). Também criei um loop infinito no OnDeinit esperando pra ver se o Metatrader derrubava o EA, mas ele não derrubou quando o motivo foi REASON_CHARTCHANGE.

Todos estes erros deixaram alguma mensagem na aba Experts.

Se vc provocar um INIT_FAILED no OnInit, pode não aparecer na aba Experts, mas vai aparecer na aba Diário.

De qualquer forma ainda acho que vale a pena explorar se não há algum erro destes tipos.

Olá Juliano, por alguma razão não fui notificado de sua resposta por aqui. Desculpe a demora em responder.

Incrivelmente, ainda não consegui resolver o problema. Acabei desistindo e optei por outro caminho.

Obrigado por todos os seus testes tentando reproduzir o problema!

 
Ricardo Rodrigues Lucca #:
Só pra titulo de esclarecimento, voce esta testando usando o EA "ao vivo", correto? Não é testador de estrategia?

Correto, ao vivo.