Errores, fallos, preguntas - página 434

 

komposter
Tienes razón. He cometido un error.
Gracias por su respuesta.

 
Silent:

Manual de referencia de MQL5 - Biblioteca estándar - Clases para organizar datos - CArrayObj (en la página web y en la ayuda):

2. El mecanismo de gestión de la memoria está desactivado.

En este caso, CArrayObj no es responsable de la liberación de memoria

Lo he arreglado, gracias.
 

Documentación. Sección de variables estáticas.

"...Las variables estáticas existen desde el momento de la ejecución del programa y se inicializan una vez antes de llamar a la función especializada OnInit()..."

Comprobación del código del Asesor Experto:

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

"Colocación" del EA en el gráfico:

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

Sin quitar el EA del gráfico, cambiamos el periodo del gráfico:

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

¿Se supone que funciona así?

En realidad, interpreté la información de la documentación como una inicialización forzada de las variables estáticas en cualquier llamada de la función OnInit(), independientemente de que fuera causada por la recompilación o por un cambio de símbolo o algo más...

Resulta que estaba equivocado. Por favor, acláreme: ¿cuáles son las excepciones a esta regla?

 

Cuando se cambian los parámetros de entrada, es el mismo "lío".

Sin embargo, cuando se cambia la cuenta, se gestiona correctamente: las variables estáticas se reinicializan.

Me pregunto cómo cambiar el símbolo del gráfico sin borrar al experto(REASON_CHARTCHANGE).

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
voix_kas:

Documentación. Sección de variables estáticas.

"...Las variables estáticas existen desde el momento de la ejecución del programa y se inicializan una vez antes de llamar a la función especializada OnInit()..."

Comprobación del código del Asesor Experto:

"Colocación" del EA en el gráfico:

Sin quitar el EA del gráfico, cambiamos el periodo del gráfico:

¿Se supone que funciona así?

Sí, debería funcionar.

El programa (su código) ya ha sido cargado una vez y sólo realiza una reinicialización en caliente (Deinit/Init sin descarga de código). En este caso, el propio desarrollador debe encargarse de una correcta inicialización del entorno.

 
Renat:

Sí, debería funcionar así.

El programa (su código) ya está cargado una vez y sólo hace una reinicialización en caliente (Deinit/Init sin descarga de código). En este caso, el desarrollador debe preocuparse por la correcta inicialización del entorno.

En primer lugar, tu comentario contradice claramente la definición en la documentación: inicializar una vez antes de llamar a OnInit(). Entonces debería especificar claramente la definición en la documentación: "...inicializar una vez antes de llamar a OnInit(). primero llamar a OnInit()".
En segundo lugar, tu comentario contradice claramente el caso de cambio de cuenta, en el que MT, obviamente, da de baja a la fuerza al Asesor Experto y lo restaura de nuevo.

¿Puede plantearse la cuestión fundamental de si las variables estáticas deben reiniciarse forzosamente en cada llamada (no sólo en la primera) a OnInit() para su consideración/voto?

 

En general, es curioso cómo funcionan las cosas.
A primera vista, pensé que la función OnDenit es una especie de destructor, y OnInit - el constructor del Asesor Experto.
De hecho, resulta que OnInit es un evento múltiple (dentro del tiempo de vida de expert). Entonces no está claro, ¿por qué necesitamos generar explícitamente el evento OnDenit si sabemos que el EA no termina su operación (por ejemplo, en caso de cambio de periodo del gráfico)?

Y otra pregunta.
Elmotivo de desinicialización de REASON_CHARTCHANGE es que se ha cambiado el símbolo o el periodo de un gráfico.
Por favor, explique cómo se puede cambiar el símbolo de un gráfico sin borrar el EA en él?

 
voix_kas:

Y otra pregunta.
Motivo de la desinicialización REASON_CHARTCHANGE - El símbolo del gráfico o el periodo se ha modificado.
Por favor, explique cómo se puede cambiar el símbolo de un gráfico sin borrar el EA en él?

ChartSetSymbolPeriod()
 
voix_kas:

En realidad, es gracioso.
Por mi intuición, pensé que la función OnDenit era una especie de destructor y la función OnInit era el constructor del Asesor Experto.
De hecho, parece que OnInit es un evento múltiple (dentro de la vida de un Asesor Experto). Entonces no está claro, ¿por qué necesitamos generar explícitamente el evento OnDenit si sabemos que el EA no termina su operación (por ejemplo, en caso de cambio de periodo del gráfico)?

Y otra pregunta.
El motivo de la desinicialización de REASON_CHARTCHANGE - El símbolo o el período de un gráfico ha sido cambiado.
Por favor, explique cómo se puede cambiar el símbolo de un gráfico sin borrar el EA en él.

De la misma manera que se llamaba todo en MT4. Y no se sabe, si el experto termina su trabajo o no (para este propósito en los parámetros OnDeinit se caen, aunque la razón de la posible activación de OnInit es fácil de saber, también).

2. Es muy sencillo, en la configuración del terminal permita que el Asesor Experto opere cuando el símbolo y el período cambien.

A continuación, seleccione otro símbolo en la visión general del mercado y "suéltelo" en el gráfico con el ratón.

El EA en todo caso, con la inicialización normal después del cambio de símbolo/periodo "no se borrará" (se "Reiniciará en caliente" como dijo Renat más abajo). Si lo vemos a un nivel simple, el Asesor Experto podrá operar bajo ciertas configuraciones del terminal.

Yedelkin:
ChartSetSymbolPeriod()
Otra opción, pero programática. :)
 
voix_kas:

En primer lugar, tu comentario contradice claramente la definición en la documentación: se inicializan una vez antes de llamar a OnInit(). Entonces debería especificar claramente la definición en la documentación: "...inicializar una vez antes de llamar a OnInit(). primero llamada OnInit()".

Sí, esto debería definirse con más precisión en la documentación.


En segundo lugar, tu comentario contradice claramente el caso de cambio de cuenta, en el que obviamente MT da de baja a la fuerza el EA y lo restaura de nuevo.

Sí, cuando se cambia la cuenta, el Asesor Experto obviamente se descarga de la memoria y realiza un reinicio en frío. Lo hicimos a propósito.


¿Podemos introducir/votar una pregunta fundamental sobre la necesidad de la reinicialización forzada de las variables estáticas en cada (no sólo en la primera) llamada de OnInit()?

Por desgracia, no. Esto sólo se puede solucionar reiniciando en frío el Asesor Experto.