Secuencia de ejecución de Init() y DeInit() - página 2

 
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...


Sí, no puedo eliminar algún objeto o recurso en el cambio de TF, puedo guardar incluso algunas pequeñas matrices a través de objeto-recurso, y escribir en la información de recursos sobre el cambio de TF, pero el punto es¿Cómo debo informar a la unidad de que el marco temporal ha cambiado y los datos antiguos deben ser leídos? ¿No está mal?
 
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 descarga la copia anterior.

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


He leído la descripción del enlace, pero no he encontrado esa información, como la que has dado. Y si realmente es así, es un gran problema para los desarrolladores de indicadores. Es muy extraño y muy malo que se adopte esa lógica para recargar los indicadores cuando se cambia de timeframe. ¿Por qué necesitamos la existencia de dos copias del mismo indicador en la memoria? ¿Quién se beneficia de ello? ¿Qué es lo que da? Sería más lógico completar la ejecución de una copia del indicador, descargarla y sólo entonces cargar la siguiente copia.
 
Nikolai Semko:
¿Y eso es todo?
He estado experimentando y utilizando este código de razón (REASON_CHARTCHANGE) tanto como sea posible. Y de qué sirve si todas las variables vuelven a su estado original, y OnDeinit puede ejecutarse después de OnInit de un nuevo TF
Sólo he leído sobre el borrado de un objeto en la desinicialización y sólo respondía a este problema. Es más complicado con el ahorro de los cálculos anteriores. Y aparentemente este problema nunca se resolverá. Slava respondió a esta pregunta, nuevo indicador, nuevos cálculos. Y esto es justo.
 
Alexey Viktorov:
Slava ha respondido a esta pregunta, nuevo indicador, nuevos cálculos. Y esto es justo.
La cuestión es que el indicador es el mismo, pero el marco temporal es nuevo. Y la pregunta es sobre la desincronización de la unidad y la desunión, es decir, se produce la secuencia inversa (ilógica) de ejecución, y a veces es lógica. No hay nada peor para un programador que un error de flotación y lógica.
 
Alexey Viktorov:
Y aparentemente este problema nunca se resolverá.

Y tengo fe en el equipo de desarrollo, son grandes tipos y han hecho una cantidad increíble y harán más. Todavía no me he puesto a ello. Es cierto, siempre hay que recibir información de ellos con campanas y silbatos. :))
Mi tarea es convencerles de que hay que hacerlo. Aunque no excluyo que me convenzan de que es mejor no hacerlo, quizás no entiendo algo.
 
Nikolai Semko:

Y tengo fe en el equipo de desarrollo, son grandes tipos y han hecho una cantidad increíble y harán más. Todavía no me he puesto a ello. Pero siempre tengo que pedirles opinión también con las panderetas. :))
Mi tarea es convencerles de que hay que hacerlo. Aunque no excluyo que me convenzan de que es mejor no hacerlo, quizás no entiendo algo.


Slawa, ¿qué significa la frase de la documentación"Las bibliotecasno manejan ningún evento"?

Muy vago

 
nmaratr:

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

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


Quiero que se restaure 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í, por ejemplo, un "desglose lógico".


Tal vez para intentar asignar a los objetos gráficos el periodo TF como componente de su prefijo de nombre,

y luego aplicar algo como esto:

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

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

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


Quiero que se restaure 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í, por ejemplo, un "desglose lógico".

Por supuesto que es mejor cuando todo sucede en una secuencia lógica, pero como tenemos que trabajar con lo que tenemos, podemos mover el color del gráfico principal a OnCalculate con la comprobación del valor actual.
 
Nikolai Semko:
¿Y eso es todo?
He estado experimentando y utilizando este código de razón (REASON_CHARTCHANGE) tanto como sea posible. Y de qué sirve si todas las variables vuelven a tener el estado original, y OnDeinit puede ejecutarse después de OnInit del nuevo TF


Intenta actualizar el terminal a la versión 1065. En las versiones anteriores se producía un error de reinicialización justo durante el cambio de horario. Puede ayudar :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


Intenta actualizar el terminal a la versión 1065. En las versiones anteriores se producía un error de reinicialización con sólo cambiar el marco temporal. Podría ayudar :)

https://www.mql5.com/ru/forum/187690

Estamos hablando de MT5
Razón de la queja: