Secuencia de ejecución de Init() y DeInit()

 

Hola a todos.

Me encuentro con el siguiente problema

Tengo un indicador o Asesor Experto.

Hay dos funciones en él - Init() y DeInit()

¿Cuál es la secuencia de ejecución de estas funciones cuando cambio de TF (marco temporal)?

Entiendo que cuando inicio o adjunto el indicador, el Init() debería funcionar.

Al borrarlo del gráfico debería ejecutarDeInit()

Al cambiar de TF, primero debería funcionarDeInit() del TF actual y luego debería funcionarInit() del nuevo TF

Sin embargo, no siempre se ejecuta en esta secuencia, lo que estropea la lógica de la escritura del programa.

Adjunto una muestra del indicador y los registros.

Por favor, avisen a quien haya resuelto este problema o simplemente olvídense de él.

Archivos adjuntos:
ERROR.mq5  2 kb
Log.txt  1 kb
 

¿Qué tipo de lógica se echa a perder?

Cuando se cambia de marco temporal, se crea una nueva copia del indicador que no sabe nada de la copia anterior. Durante un cierto periodo de tiempo (muy corto) ambas copias del indicador existen en paralelo. Entonces se descarga la copia anterior.

Lea la documentación https://www.mql5.com/ru/docs/runtime/running

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Cuando se cambia el marco temporal, se llama a OnInit cada vez y crea algunos inconvenientes.
 
Slawa:

¿Qué tipo de lógica se echa a perder?

Cuando se cambia de marco temporal, se crea una nueva copia del indicador que no sabe nada de la copia anterior. Durante un cierto periodo de tiempo (muy corto) ambas copias del indicador existen en paralelo. Entonces se excluye la copia anterior.

Lea la documentación https://www.mql5.com/ru/docs/runtime/running


Gracias por sus comentarios

Acerca de la "lógica de los despojos"

Escribí un indicador que reemplaza el gráfico principal (velas) con su propio tipo de dibujo DRAW_CANDLES

El objetivo es eliminar el gráfico de precios principal y mostrar sólo mi gráfico.

- Cuando Inite establece el color del gráfico principal en transparente.

Dibujo mi propio gráfico (según mis parámetros).


Ya que quiero restaurar el color del gráfico principal después de la eliminación de mi indicador

- En DeInit restauro el color del gráfico principal


Al cambiar el TF me refiero primero a DeInit (restaurar el color), y luego a Init (volver a ser transparente)


La ejecución de los comandos no es secuencial; periódicamente, al cambiar el TF

periódicamente el gráfico principal (con el color restaurado) se superpone a mi indicador.

He aquí una "metedura de pata lógica" por ejemplo.


PD: (((Lea la documentaciónhttps://www.mql5.com/ru/docs/runtime/running )))

Si cambia el símbolo o el marco de tiempo del gráfico, al que está unido el Asesor Experto, el Asesor Experto no se descarga ni se carga. En este caso, los manejadoresOnDeinit() en el antiguo símbolo/línea de tiempo yOnInit() en el nuevo símbolo/línea de tiempo (si está disponible) son llamadosconsistentemente, los valores de las variables globales y lasvariables estáticas no son restablecidos. Todos los eventos recibidos para un EA antes de la finalización de la inicialización (OnInit()) se saltan.


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


En cuanto a.

"se crea una nueva copia del indicadorque no sabe nada de la copia anterior"

Por qué entonces DeInit borra los objetos que fueron creados en la nueva copia Init. Si es sólo una copia.



 
Petros Shatakhtsyan:
Cuando se cambia el marco de tiempo, se llama a OnInit cada vez y causa algunos inconvenientes.


¿Qué significa llamar a OnInit cada vez que

Para qué sirve OnInit - para inicializar todas las variables y parámetros una vez

Por ejemplo

Quiero escribir un indicador que cree un marcador de texto en un gráfico con el marco temporal actual.

Al borrar el indicador se elimina esta marca de texto del gráfico.

Y al cambiar el TF actualizaría su contenido a uno nuevo (eliminando el antiguo y creando uno nuevo).

Lo que obtenemos

Un par de veces hemos cambiado el TF y la marca de texto ha desaparecido. (Así que primero ha actuado OnInit y luego DeInit, que ha eliminado esta marca).

Luego, unas cuantas veces más cambió la TF y apareció.

Esto no está bien.

 
nmaratr:

si son objetos gráficos, pertenecen a la sala de chat y puede acceder a ellos cualquier software que se ejecute en esa sala de chat
 
Alexander Bereznyak:

si son objetos gráficos, pertenecen al chat y son accesibles por cualquier programa que se ejecute en este chat.


Entonces, ¿cómo se puede resolver este problema? (¿Alguien lo tiene?)

O aceptarlo como está. Que para acelerar los cálculos, es posible ejecutar los comandos de forma no secuencial.

Lo que es contrario a la documentación


Cuando se cambia un símbolo o un marco temporal de un gráfico, al que está unido el Asesor Experto, el Asesor Experto no se descargará y cargará. En este caso

secuencialmente

Se llama a los manejadoresOnDeinit() en el símbolo/línea de tiempo antigua yOnInit() en el nuevo símbolo/línea de tiempo (si está disponible)

 
nmaratr:


Entonces, ¿se puede resolver este problema? (¿Le ha funcionado a alguien?)



Me uno al autor de este hilo. La pregunta no es realmente ociosa. Y muy específico.
Descubrí este problema hace mucho tiempo. Me puse en contacto con servicedesk allá por junio de 2016 con un ejemplo absolutamente similar al del autor de este hilo. Lo ignoraron: sigue siendo un tema abierto:

Aplicación a servicedesk

Por supuesto que he hecho un traspaso de parámetros en indicador al cambiar de TF, habiendo pasado mucho tiempo en él. Pero no quiero hacer una tarea sencilla con diamantes.
Pero los desarrolladores, por favor, implementen la posibilidad de crear variables globales especiales en los indicadores que no se reinicien durante los cambios de marco temporal. En los Asesores Expertos la reinicialización no se produce en el momento del cambio de TF, en el indicador sí. Si existiera la posibilidad de no reinicializar algunas variables y arrays en los indicadores, no se produciría la sincronización de OnInit y OnDeinit, y se abrirían nuevas e interesantes oportunidades para los programadores. No creo que esta posibilidad de desinicialización de variables afecte a la seguridad de los programas.

¿Para qué sirve?
Hay muchas situaciones.

Por ejemplo:
-Cuando arranco el indicador, realizo cálculos de variables, matrices de índices, matrices de datos, independientes del TF, y pueden ser bastante largos y voluminosos. La pregunta es por qué tengo que hacerlo cada vez que cambio el TF.
- No puedo cambiar los parámetros del indicador a través de la ventana de parámetros, sino por comodidad y claridad directamente desde el gráfico con el ratón (puedes ver y utilizar este indicador, que lo consigue de una manera más complicada). Y los ajustes no se pierden cada vez que se cambia el TF.

 

Este asunto se resuelve como dos dedos... Sabes que...

En OnDeinit es necesario condicionar el motivo de desinicialización antes de borrar el objeto... Si no es un cambio de periodo, el objeto se elimina. Y ESO ES TODO...

 
Alexey Viktorov:

Este asunto se resuelve como dos dedos... Sabes que...

En OnDeinit es necesario condicionar el motivo de desinicialización antes de borrar el objeto... Si NO es un cambio de periodo, el objeto se elimina. Y ESO ES TODO...

¿Así que eso es todo?
He estado experimentando y utilizando este código de razón (REASON_CHARTCHANGE) al máximo. De qué sirve si todas las variables vuelven a su estado original y se puede ejecutar OnDeinit después de OnInit del nuevo TF