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

 
fxsaber:

En principio, se podría hacer con una sola línea.

Hizouna línea.
 
Nikolai Semko:


¿Dónde es inequívoco?

Prueba este ejemplo primitivo. Comprenderá la "singularidad" al cambiar el TF.

En este ejemplo, en OnInit se crea un objeto con las coordenadas de la hora y el precio actuales. En OnCalculate este objeto se mueve junto con el precio.

En OnDeinit simplemente se elimina (lógicamente).

Al cambiar el TF, resulta que el objeto aparece y luego desaparece.
¿Por qué ocurre esto?
Porque a veces OnDeinit del TF antiguo borra lo que ya se ha creado en OnInit del nuevo TF. No es un error. ¿Qué debe pensar el programador que creó este ejemplo y no leyó esta rama?



¿Qué sentido tiene utilizar un ejemplo primitivo de un colegiado?

Utiliza un ejemplo de código MUY correcto en su lugar.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if(ObjectFind(0, "InitDeinit") < 0)                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
     Print(__FUNCTION__, " создан InitDeinit");
    }
    
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,50); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(UninitializeReason() != REASON_CHARTCHANGE)      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete(0,"InitDeinit");
     ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print(__FUNCTION__, "  InitDeinit удалён");
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Alexey Viktorov:

Mejor utilizar un ejemplo de código prácticamente correcto.

Es lo mismo. El objeto puede ser eliminado a través de Deinit de la copia del indicador irrelevante. Y el OnInit del actual se realiza ANTES de este evento.

Pero es mucho mejor mostrar la transferencia de cualquier información desde OnDeinit de la copia antigua a OnInit de la nueva. En realidad, esta es la cuestión.

 
fxsaber:
Esto es lo mismo. El objeto puede ser eliminado a través de Deinit de la copia del indicador irrelevante. Y el OnInit del actual se realiza ANTES de este evento.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

En todos los demás casos, excepto cuando se desenchufe el ordenador, el objeto se borrará.

 
fxsaber:


Pero es mucho mejor mostrar el paso de cualquier información desde OnDeinit de la copia antigua a OnInit de la nueva. De hecho, esta es la cuestión.

Hace tiempo que me di cuenta de que las soluciones sencillas no son tu fuerte. :-)))
 
Alexey Viktorov:

En todos los demás casos, excepto cuando se desenchufe el ordenador, el objeto se borrará.

Has demostrado una solución a un problema de discusión privada. La general se formula como sigue
fxsaber:

Pasar de forma fiablecualquier información de OnDeinit de la copia antigua a OnInit de la copia nueva.

Lo que, en consecuencia, requiere una clara secuencia de ejecución OnDeinit/OnInit. Nunca he necesitado esto, pero he aplicado la idea de la solución sin ningún problema.

 
fxsaber:
Has demostrado la solución a un problema de discusión privada. Una general puede formularse como sigue

Lo que, en consecuencia, requiere una clara secuencia de ejecución OnDeinit/OnInit. Nunca lo he necesitado, pero he aplicado la idea de la solución sin ningún problema.

Bueno, no estoy en contra. Pero rascarme la oreja derecha con el dedo meñique izquierdo no es lo mío. En lugar de una prueba tan simple para escribir"eso"... Ni siquiera sé cómo llamarlo. Que sea para el aficionado, porque el masoquismo tiene derecho a existir. Con todo el respeto a su profesionalidad en la programación.

 
Alexey Viktorov:

En lugar de un cheque tan simple, escribe"eso"...

Así que no has entendido el problema que se está discutiendo en este hilo.
 
fxsaber:
Así que no has entendido la esencia del problema que se discute en este hilo.

Lo entiendo, pero has trasladado la discusión del problema a tus capacidades (no pequeñas).

Y después de todo mi respuesta fue a un ejemplo específico de un código de un potro, y no en respuesta a sus habilidades y un ejemplo de transferencia de datos con la regulación de la secuencia de ejecución On_Init y On_Deinit.

¿Cuál es el objetivo de continuar el diálogo? ¿Intentas convencerme de que rascarse la oreja derecha con el dedo meñique izquierdo es muy agradable? ¿O de otra manera?

 
Alexey Viktorov:

¿O es un objetivo diferente?

El ejemplo que has rehecho no se ajustaba perfectamente al problema que estabas comentando. Podrías mostrar otro ejemplo que no tuviera solución a través deUninitializeReason.
Razón de la queja: