Seqüência de execução Init() e DeInit()

 

Olá a todos!

Estou enfrentando o seguinte problema

Eu tenho um indicador ou consultor especializado.

Há duas funções nele - Init() e DeInit()

Qual é a seqüência de execução dessas funções quando eu mudo o TF (timeframe)?

Entendo que quando eu iniciar ou anexar o indicador, o Init() deve funcionar.

Ao excluí-lo do gráfico, ele deve executarDeInit()

Ao mudar o TF, a princípio oDeInit() do TF atual deve funcionar e depois oInit() do novo TF deve funcionar

Entretanto, nem sempre é executado nesta seqüência, o que estraga a lógica de escrever o programa.

Anexei uma amostra do indicador e dos registros.

Por favor, avise quem resolveu este problema ou simplesmente esqueça-o!

Arquivos anexados:
ERROR.mq5  2 kb
Log.txt  1 kb
 

Que tipo de lógica é estragada?

Quando você muda o cronograma, uma nova cópia do indicador é criada e não sabe nada sobre a cópia anterior. Durante um certo período de tempo (muito curto), ambas as cópias do indicador existem em paralelo. Depois, a cópia anterior é descarregada.

Leia a documentação https://www.mql5.com/ru/docs/runtime/running

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quando você muda o cronograma, o OnInit é chamado todas as vezes e cria alguns inconvenientes.
 
Slawa:

Que tipo de lógica é estragada?

Quando você muda o cronograma, uma nova cópia do indicador é criada e não sabe nada sobre a cópia anterior. Durante um certo período de tempo (muito curto), ambas as cópias do indicador existem em paralelo. Em seguida, a cópia anterior é excluída.

Leia a documentação https://www.mql5.com/ru/docs/runtime/running


Obrigado por seu feedback

Sobre "estrago lógico".

Escrevi um indicador que substitui o gráfico principal (castiçais) por seu próprio tipo de desenho DRAW_CANDLES

O objetivo é remover a tabela de preços principal e exibir somente a minha tabela.

- Quando a Inite define a cor da carta principal como transparente.

Desenho minha própria carta (de acordo com meus parâmetros).


Como eu quero restaurar a cor do gráfico principal após a remoção do meu indicador

- No DeInit eu restauro a cor da carta principal


Ao mudar o TF quero dizer primeiro DeInit (restaurar a cor), e depois Init (voltar a ser transparente)


A execução dos comandos não é seqüencial; periodicamente, ao alterar o TF

periodicamente a tabela principal (com a cor restaurada) é sobreposta ao meu indicador.

Aqui está um "parafuso lógico", por exemplo.


PS: (((Ler documentaçãohttps://www.mql5.com/ru/docs/runtime/running )))

Se você mudar o símbolo ou o cronograma do gráfico, ao qual o Expert Advisor está anexado, o Expert Advisor não é descarregado e carregado. Neste caso , os manipuladoresOnDeinit() no antigo símbolo/linha de tempo eOnInit() no novo símbolo/linha de tempo (se disponível) são chamadosconsistentemente, valores de variáveis globais evariáveis estáticas não são redefinidos. Todos os eventos recebidos para uma EA antes da conclusão da inicialização (OnInit()) são ignorados.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


A respeito.

"é criada uma nova cópia do indicadorque nada sabe sobre a cópia anterior"

Por que então o DeInit apaga objetos que foram criados na nova cópia Init. Se for apenas uma cópia.



 
Petros Shatakhtsyan:
Quando o cronograma é alterado, o OnInit é chamado a cada vez e causa alguns inconvenientes.


O que significa chamar o OnInit todas as vezes

Para que serve o OnInit - para rubricar todas as variáveis e parâmetros uma vez

Por exemplo

Quero escrever um indicador que crie um marcador de texto em um gráfico com o cronograma atual.

Ao apagar o indicador, ele remove esta marca de texto do gráfico.

E ao mudar a TF atualizaria seu conteúdo para um novo (removendo o antigo e criando um novo).

O que recebemos

Algumas vezes mudamos o TF e a marca de texto desapareceu. (Assim, inicialmente o OnInit e depois o DeInit agiram, o que removeu este rótulo).

Então, poucas vezes mais mudou a TF e ela apareceu.

Isto não está certo.

 
nmaratr:

se forem objetos gráficos, eles pertencem à sala de bate-papo e podem ser acessados por qualquer software em execução nessa sala
 
Alexander Bereznyak:

se forem objetos gráficos, eles pertencem ao chat e são acessíveis por qualquer programa em execução neste chat.


Então, como este problema pode ser resolvido ??? (Alguém tem ????)

Ou aceitar como está. Que, para acelerar os cálculos, é possível executar comandos de forma não seqüencial.

O que é contrário à documentação


Ao alterar um símbolo ou um cronograma de um gráfico, ao qual o Expert Advisor está anexado, o Expert Advisor não será descarregado e carregado. Neste caso, a

sequencialmente

Os manipuladoresOnDeinit() no símbolo/cronograma antigo eOnInit() no novo símbolo/cronograma (se disponível) são chamados

 
nmaratr:


Então, este problema pode ser resolvido ??? (Funcionou para alguém ????)



Eu me junto ao autor desta linha. A pergunta realmente não é ociosa. E muito específico.
Descobri este problema há muito tempo. Entrei em contato com o Servicedesk em junho de 2016 com um exemplo absolutamente semelhante ao do autor deste tópico. Eles o ignoraram - ainda é um tópico em aberto:

Aplicação para servicedesk

É claro que eu fiz uma transferência de parâmetro em indicador ao mudar o TF, tendo gasto muito tempo com isso. Mas eu não quero fazer uma tarefa simples com diamantes.
Mas os desenvolvedores, por favor, implementem a possibilidade de criar variáveis globais especiais em indicadores que não serão reinicializados durante as mudanças de tempo. No Expert Advisors a reinicialização não acontece no momento da mudança da TF, no indicador ela acontece. Se houvesse a possibilidade de não reinicializar algumas variáveis e matrizes nos indicadores, a sincronização do OnInit e OnDeinit não ocorreria, e novas oportunidades interessantes para os programadores se abririam. Não creio que esta possibilidade de desinicialização variável afete a segurança dos programas.

Para que serve?
Há muitas situações.

Por exemplo:
-Quando começo o indicador, faço cálculos de variáveis, matrizes de índice, matrizes de dados, independentes da TF, e elas podem ser bastante longas e volumosas. A questão é por que tenho que fazer isso cada vez que mudo o TF.
- Não posso alterar os parâmetros do indicador através da janela de parâmetros, mas por conveniência e clareza diretamente do gráfico com um mouse (você pode ver e usar este indicador, o que o atinge de uma maneira mais complicada). E as configurações não são perdidas toda vez que você muda o TF.

 

Esta questão é resolvida como dois dedos... Você sabe o que...

No OnDeinit é necessário condicionar o motivo da desinicialização antes de apagar o objeto... Se não for uma mudança de período, então o objeto é apagado. E É SÓ ISSO...

 
Alexey Viktorov:

Esta questão é resolvida como dois dedos... Você sabe o que...

No OnDeinit é necessário condicionar o motivo da desinicialização antes de apagar o objeto... Se não for uma mudança de período, então o objeto é apagado. E É SÓ ISSO...

É isso aí!?
Tenho experimentado e utilizado este código de motivo (REASON_CHARTCHANGE) em toda a sua extensão. Mas qual é a utilidade se todas as variáveis forem novamente definidas para seu estado original e o OnDeinit puder ser executado após o OnInit do novo TF
Razão: