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

 
fxsaber:
La solución al problema

Es decir, todo el problema es añadir DOS líneas iguales a cualquier indicador.


Código de la biblioteca


¿Hay algo más sencillo, más claro y más vivo?

También necesito un nombre de variable global para cada instancia del indicador, en caso de que haya dos indicadores con diferentes parámetros en el gráfico).

 
Dmitry Fedoseev:


¿No puede ser más sencillo, más claro y más obvio?

No.

También cada instancia de indicador necesita su propio nombre de variable global, en caso de que haya dos indicadores con diferentes parámetros en el gráfico).

No debe hacerlo, porque dos instancias del indicador con diferentes parámetros en un gráfico contradicen el uso, que se quiere en esta rama.

Por lo tanto, si se inicia la segunda instancia, simplemente no funcionará hasta que se descargue la primera.

 
fxsaber:

De ninguna manera.

...



#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property  indicator_label1  "Label1"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1

string gvName;

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
   gvName=MQLInfoString(MQL_PROGRAM_NAME);
   
   if(GlobalVariableCheck(gvName)){
      EventSetMillisecondTimer(1);      
   }
   else{
      GlobalVariableSet(gvName,1);
      NewInit();
   }
   return(INIT_SUCCEEDED);
}

void NewInit(){
   // все что было в ините должно быть здесь
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
}

void OnDeinit(const int r){
   GlobalVariableDel(gvName);
}

void OnTimer(){
   if(!GlobalVariableCheck(gvName)){
      EventKillTimer();      
      GlobalVariableSet(gvName,1);
      NewInit();
   }

}  
//+------------------------------------------------------------------+
//| 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[])
  {

   for(int i=rates_total-10;i<rates_total;i++)Label1Buffer[i]=close[i];

   return(rates_total);
  }
//+------------------------------------------------------------------+
¿Lo es?
 
Dmitry Fedoseev:
¿Lo es?

No, claro que no. La carta-manija debe escribirse necesariamente en el nombre de una variable global.

Y mi solución se consigue añadiendo sólo dos líneas. Es algo más sencillo.

#include <Init_Sync.mqh> // Делает синхронизированными Init/Deinit индикаторов

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property  indicator_label1  "Label1"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   return(INIT_SUCCEEDED);
}

void OnTimer(){
  CHECK_INIT_SYNC;
   }

//+------------------------------------------------------------------+
//| 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[])
  {

   for(int i=rates_total-10;i<rates_total;i++)Label1Buffer[i]=close[i];

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
fxsaber:

No, claro que no. La carta-manija debe escribirse necesariamente en el nombre de una variable global.

Y mi solución se consigue añadiendo sólo dos líneas. Esto es algo más sencillo.


¿Y la lógica (algoritmo) en sí es la misma?
 
fxsaber:

....

Y mi solución se consigue añadiendo sólo dos líneas. Esto es algo más sencillo.

¿Y llamar a funciones como SetIndexBuffer con un retraso y no en el init estándar no te molesta? ¿Estás absolutamente seguro de que está bien?

 
Dmitry Fedoseev:

¿La lógica (algoritmo) es la misma?
Sí.
 
Dmitry Fedoseev:

Cuenta cuántas líneas tengo yo y cuántas tienes tú... dos líneas que añade, un infierno de tonterías a donde - dos líneas.

No has contado - es mucho.

Basta con añadir dos para que cualquier indicador tenga la codiciada propiedad de esta discusión.

 
fxsaber:

No has contado - es mucho.

Basta con añadir dos para que cualquier indicador tenga la codiciada propiedad de esta discusión.


Esta es la décima pregunta. Es una cuestión de gustos. Pero aun así mi código es 5 veces más pequeño y legible :/

Más interesante es esto:

¿Llamar a la función SetIndexBuffer con un retraso y no en el inite estándar no es confuso? ¿Está absolutamente seguro de que esto es normal?

 
Dmitry Fedoseev:

¿Se llama a la función SetIndexBuffer con un retraso y no en el init estándar? ¿Está absolutamente seguro de que esto es normal?

Por supuesto. Llamar a OnCalculate probablemente causará problemas, pero esto se resuelve con fáciles ediciones de la biblioteca. Será posible aclararlo el lunes.

En principio, una línea puede ser suficiente.