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

 
Комбинатор:

Cuando cambie laf.

Si los indicadores tienen basura en sus búferes desde el antiguo marco temporal, puede afectar también a los temporizadores.

Es más bonito

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Nueva versión de MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

Al pasar de una cuenta a otra, la variable _Digits del indicador no cambia.

 
fxsaber:
Es más bonito.
Con todos los dígitos diferentes, parece que se va por todas partes, yo dejé de cruzar esas cuentas en el mismo terminal hace unos 5 años.
 
fxsaber:
Es más bonito.

Esto es para los que hablan de la consistencia adecuada en MT4.

Observa y entiende que no todo es tan bonito en MT4.

 
fxsaber:
La cola es inequívoca.


Bueno, ¿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 borra (lógicamente).

Cuando cambiamos el TF, el objeto aparece y luego desaparece.
¿Por qué ocurre esto?
Porque a veces OnDeinit de la antigua TF borra algo que ya ha sido creado en OnInit de la nueva TF. No es un error. ¿Qué debería pensar el programador que creó este ejemplo y no leyó esta rama?

Demostración de la ambigüedad de la secuencia OnInit y OnDeinit


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"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:
 
Nikolai Semko:

Bueno, donde está ella sola.

Allí se habló del temporizador.
 
fxsaber:
Allí se mencionó el temporizador.

Cuál es la diferencia. Puedes poner EventSetTimer en Unite en lugar de la creación de objetos, y poner EventKillTimer en Deunite en lugar de la eliminación de objetos. Y esto no reducirá la incertidumbre, porque el temporizador establecido será asesinado por Deunite de la vieja TF, y a veces no lo hará. Y será aún peor, porque al menos puedes ver el objeto, pero no puedes ver el temporizador - si funciona o no.
 

Tal vez ya lo hayan inventado, no lo he leído entero. Si el indicador crea un panel, puede utilizar la variable global del terminal, aumentar su valor en 1 en el init y utilizarlo como aditivo a los nombres de los objetos gráficos.

Mi tarea era diferente - guardar los parámetros del panel, para ello creé variables globales del terminal en deinit. La solución es sencilla: crear variables globales del terminal en el inite y actualizar cada una de ellas a medida que cambian los parámetros en el panel gráfico. Sólo eliminar las variables en deinit si la desinicialización es causada por la eliminación del indicador.

 
Dmitry Fedoseev

Si el indicador crea un panel, se puede utilizar una variable global del terminal, aumentar su valor en 1 y utilizarlo como adición a los nombres de los objetos gráficos.
Estas son muletas. Sólo tienes que hacer la orden correcta en el terminal y ya está. Primero desinicie la instancia anterior, y sólo entonces inicie la nueva.
Nikolai Semko:


¿Qué debe pensar el programador que creó este ejemplo y no ha leído este hilo?

Estoy totalmente de acuerdo. Los no lectores no conocerán esta función y perderán el tiempo intentando descubrirla. Y eso sería cientos de personas... ...especialmente los que son principiantes.

Sólo hay que arreglar un error una vez y ya está.

 
Nikolai Semko:

Cuál es la diferencia. Puedes poner EventSetTimer en Unite en lugar de la creación de objetos, y poner EventKillTimer en Deunite en lugar de la eliminación de objetos. Esto no reducirá la incertidumbre, porque el temporizador establecido será asesinado por Deunite de la vieja TF, y a veces no lo hará. Y sería aún peor, porque al menos puedes ver el objeto, pero no puedes ver si el temporizador funciona o no.
Esto parece una tontería. Los temporizadores de las copias de los indicadores no tienen nada que ver entre sí.
 
elibrarius:
Todo son muletas. Sólo tienes que hacer el pedido correcto en el terminal y ya está. Primero desinicie la instancia anterior, y sólo entonces inicialice la nueva.

Estoy totalmente de acuerdo. Los no lectores no conocerán esta función y perderán el tiempo intentando descubrirla. Y eso sería cientos de personas... especialmente para los principiantes.

Lo único que hay que hacer es arreglar el fallo una vez y ya está.


¡A eso me refiero!
Personalmente, estoy en racha, ya que creo que tengo ventaja sobre la mayoría, pues sé cómo afrontarlo todo, no sólo con palabras, sino también con hechos. Ya he hecho parches y he añadido muletas a mis programas.

No entiendo por qué los desarrolladores se niegan obstinadamente a considerar esta "característica" como un error.
Por ejemplo:

Slawa:

Los indicadores deben utilizarse para el fin al que están destinados.

En otras palabras, la secuencia de cumplimiento del indicador OnInit y OnDeinit cuando el símbolo-períododel gráfico ha cambiado no debería preocupar a nadie

Pero en mi ejemplo con el gif animado de arriba, ¡hay un claro error para un programador que no haya leído este tema! ¿Qué es lo que no se hace de acuerdo con su finalidad?