OnDeinit en los indicadores - página 7

 

Desarrolladores, tienen un error en alguna parte.

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

Mira la captura de pantalla de Comment después de cerrar el terminal y abrirlo después de 1 minuto.

Número de elementos inicializados y que el primer, segundo, tercer y cuarto elemento del buffer está vacío.

El indicador sólo cuenta el buffer 0. Entonces, ¿por qué 2 velas?


 
Ah, sí. La ayuda en inglés también dice queArrayInitialize no devuelve nada.

 
eevviill:

Desarrolladores, tienen un error en alguna parte.

Mira la captura de pantalla de Comment después de cerrar el terminal y abrirlo después de 1 minuto.

Número de elementos inicializados y que el primer, segundo, tercer y cuarto elemento del buffer está vacío.

El indicador sólo cuenta el buffer 0. Entonces, ¿por qué 2 velas?


Porque cuando se analiza una nueva barra, no se comprueba el número de barras, sino que sólo se comprueba el tiempo. Cuando se inicia el terminal o se interrumpe la conexión con el servidor durante la operación, antes de que lleguen las barras que faltan (al historial completo), aparece un tick. En este tick, se crea una nueva vela, pero hay un hueco (falta de historia) entre ella y la historia en el terminal, que se descargará del servidor y se insertará en el sistema, y como no se analiza el número de barras, se pensará que no hay ninguna barra nueva en el siguiente cálculo, y es cuando aparece la segunda vela. Tras la apertura de un nuevo bar, éste desaparecerá.
 
mql5:
Porque cuando se analiza una nueva barra, no se comprueba el número de barras, sino que se limita a comprobar el tiempo. Cuando se inicia el terminal o se interrumpe la conexión con el servidor durante la operación, llega un tick antes de que lleguen las barras que faltan (al historial completo). En este tick, se crea una nueva vela, pero hay un hueco (falta de historia) entre ella y la historia en el terminal, que se descargará del servidor y se insertará en el sistema, y como no se analiza el número de barras, se pensará que no hay ninguna barra nueva en el siguiente cálculo, y es cuando aparece la segunda vela. Tras la apertura de un nuevo bar, éste desaparecerá.

¿Y no importa que en deinit la puesta a cero se produzca cuando el terminal está cerrado?

 

Vasily, ejecuta un indicador de prueba que imprima el número de barras.

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

Esto es lo que imprime en el registro.

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


Tal vez esto le diga de dónde viene el problema...

 
eevviill:

Por favor, pregunte a los desarrolladores para obtener una respuesta sencilla.

Cuando se cierra el terminal, ¿se ejecuta la función DeInit() en los programas adjuntos al gráfico?

Estrictamente hablando, no.

Se ejecuta OnDeinit. DeInit sólo se ejecutará si se llama explícitamente desde OnDeinit.

Si te refieres a la antigua función deinit, ten en cuenta también que los nombres de las funciones distinguen entre mayúsculas y minúsculas. Es decir, deInit es una función desconocida, deinit es un punto de entrada estándar en la desinicialización (como OnDeinit)

 
eevviill:

¿Y no importa que en deinit la puesta a cero tenga lugar cuando el terminal está cerrado?

¿A quién le importa? Cuando se cierra el terminal, estos búferes ya no son necesarios, porque se liberarán inmediatamente cuando se descargue el programa, lo que ocurre inmediatamente después de OnDeinit

Pruebe a cambiar sólo el marco temporal. OnDeinit funcionará, los buffers permanecerán (porque la descarga del programa no ocurre en este caso), pero nadie garantiza su contenido de la "vida pasada"

¡Lea por fin la documentación! https://docs.mql4.com/ru/runtime/running y https://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo:

¿A quién le importa? Cuando se cierra la terminal, estos búferes ya no son necesarios, porque serán liberados inmediatamente cuando se descargue el programa, lo que ocurre inmediatamente después de OnDeinit

Pruebe a cambiar sólo el marco temporal. OnDeinit funcionará, los buffers permanecerán (ya que la descarga del programa no ocurre en este caso), pero nadie garantiza su contenido de la "vida pasada"

¡Lea por fin la documentación! https://docs.mql4.com/ru/runtime/running y https://docs.mql4.com/ru/runtime/event_fire#deinit

Entonces, en mi caso, ¿los búferes ya se están dividiendo cuando se reabre el gráfico?
 
eevviill:
Entonces, en mi caso, ¿los búferes se bifurcan cuando se reabre el gráfico?

No tiene bifurcación de búferes.

Así es como se llena el búfer uno mismo. La primera vez, cuando se dibuja; la segunda, cuando se obtiene una porción de datos. Ambas veces se opera con el mismo valor de Time[0].

 
stringo:

No está teniendo una división del buffer.

Así es como se llena el búfer uno mismo. La primera vez en el momento de la representación y la segunda en la llegada de los datos. Ambas veces se opera con el mismo valor de Time[0].

BIEN.

Por favor, corrige la ayuda en inglés y ya está.

También la ayuda en inglés dice queArrayInitialize no devuelve nada.