OnDeinit en los indicadores - página 5

 
mql5:
Intentaré explicarlo de nuevo (con los dedos):
  1. El terminal se puso en marcha X tiempo después de la última puesta en marcha
  2. Iniciada la descarga del historial, que falta (el terminal estuvo inactivo durante X minutos)
  3. Llamada a OnCalculate para el indicador sobre el historial disponible prevtime = último tiempo de historial conocido, tamaño del buffer del indicador N barras
  4. Mientras se descarga el historial desde el servidor, llega un tick
  5. Llamada a OnCalculate del indicador, donde Time[0] es un tiempo de tick, el indicador lo memoriza como prevtime, el tamaño del buffer del indicador es N+1 barras (entre N y N+1 barras hay un hueco en el historial)
  6. Después de que se descargue el historial, se llama de nuevo a OnCalculate, pero esta vez no hay ningún hueco en el historial, sino que prevtime tiene la misma fecha que Time[0] - no hay ninguna barra nueva (respectivamente, no se borran los búferes en el indicador), el tamaño del búfer de las barras del indicador N+X/Timeframe y IndBuffer[0] no son los mismos que en el paso 5



¿Qué tiene que ver el tiempo previo con esto?

Pregunto por qué no funciona.

/////////////////////////////////////
void OnDeinit(const int reason)
{
 ArrayInitialize(body_up,EMPTY_VALUE);
ArrayInitialize(body_down,EMPTY_VALUE);
ArrayInitialize(shadow_up,EMPTY_VALUE);
ArrayInitialize(shadow_down,EMPTY_VALUE);
  ArrayInitialize(yell_body_up,EMPTY_VALUE);
ArrayInitialize(yell_body_down,EMPTY_VALUE);
ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
ArrayInitialize(yell_shadow_down,EMPTY_VALUE);


}
 
eevviill:

¿Qué tiene esto que ver con prevtime?

Pregunto por qué no funciona.

¿Y cómo sabes que no funciona? ¿Cómo se comprueba?

¿Y por qué inicializar los búferes de los indicadores antes de descargarlos? Ya está descargado, ¿no?

Los búferes de los indicadores deben ser inicializados cuando todos los valores de los indicadores sean recalculados completamente:

int OnCalculate(..)
{
   ...
   if (<необходимо пересчитать все значения индикатора, например, если limit == Bars - 1>)
   {
      ArrayInitialize(...);
   }
   ...
}
 
eevviill:

Aquí. Hago una puesta a cero del buffer para esto. Inite ya ha dicho que no se puede hacer eso.

Quiero deinir. Pero ahí tampoco funciona. ¿Por qué?

¿Qué tiene que ver init() y deinit()? La operación es necesaria en un lugar muy diferente. Lo repetiré de nuevo. Tras el cálculo, se cargó el historial.

He hecho una versión que funciona.

Archivos adjuntos:
 
Scriptong:

¿Cómo se sabe si no funciona? ¿Cómo se comprueba?


https://forum.mql4.com/ru/65066/page2#1015138
 
Vinin:

¿Qué tiene que ver init(), deinit()? La operación es necesaria en otro lugar. Lo repetiré. Tras el cálculo se ha cargado el historial.

Hice una versión de trabajo.

Aun así, acerté a la primera con su recomendación.

Me pregunto por qué el deinit no funciona para poner a cero las matrices.

 
eevviill:
https://forum.mql4.com/ru/65066/page2#1015138

Has dado un enlace al código que funciona en OnCalculate. He preguntado cómo sabes que la inicialización en DeInit no funciona. Permítame especificar, por si acaso, que después de OnDeinit() no funciona nada del código del indicador (ni OnInit(), ni OnCalculate()). Por lo tanto, puede comprobar la puesta a cero de las matrices sólo en OnDeinit() mismo.

 
Scriptong:

Has dado un enlace al código que funciona en OnCalculate. He preguntado cómo sabes que la inicialización en DeInit no funciona. Permítanme especificar, por si acaso, que después de OnDeinit() nada del código del indicador funciona (ni OnInit(), ni OnCalculate()). Por lo tanto, se puede comprobar el hecho de poner a cero las matrices sólo en OnDeinit() mismo.

He proporcionado un enlace a

OperaciónAbrió el indicador M1 - terminal cerrado - lo abrió en un par de minutos. El resultado está en las capturas de pantalla.

Así es como lo pruebo.

 
eevviill:

Aun así, acerté a la primera con su recomendación.

Me pregunto por qué deinit no funciona con la puesta a cero de los arrays.

¿O no funciona el deinit cuando el terminal está cerrado?
 
eevviill:
¿O el deinit no funciona cuando el terminal está cerrado?
Lo hace, pero no tiene sentido borrar los búferes de los indicadores - no se guardan.
 
mql5:
Funciona, pero no tiene sentido borrar los búferes de los indicadores: no se guardan.

¿Por qué?

¿Por qué se guarda el valor de la memoria intermedia 0 pero no se pone a cero?