Sequenza di esecuzione di Init() e DeInit() - pagina 22

 
fxsaber:
La soluzione del problema

Cioè il problema è aggiungere DUE delle stesse linee a qualsiasi indicatore.


Codice della biblioteca


C'è qualcosa di più semplice, più chiaro e più vivido?

Ho anche bisogno di un nome di variabile globale per ogni istanza dell'indicatore, nel caso ci siano due indicatori con parametri diversi nel grafico).

 
Dmitry Fedoseev:


Non può essere più semplice, più chiaro e più ovvio?

No.

Anche ogni istanza dell'indicatore ha bisogno del proprio nome di variabile globale, nel caso in cui ci siano due indicatori con parametri diversi nel grafico).

Non dovresti farlo, perché due istanze dell'indicatore con parametri diversi su un grafico contraddicono l'uso che si vuole fare in questo ramo.

Pertanto, se si avvia la seconda istanza, semplicemente non funzionerà fino a quando la prima non sarà scaricata.

 
fxsaber:

Assolutamente no.

...



#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 è?
 
Dmitry Fedoseev:
Lo è?

No, certo che no. Handle-chart deve necessariamente essere scritto nel nome di una variabile globale.

E la mia soluzione si ottiene aggiungendo solo due righe. È un po' più semplice.

#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, certo che no. Handle-chart deve necessariamente essere scritto nel nome di una variabile globale.

E la mia soluzione si ottiene aggiungendo solo due righe. Questo è un po' più semplice.


E la logica (algoritmo) stessa è la stessa?
 
fxsaber:

....

E la mia soluzione si ottiene aggiungendo solo due righe. Questo è un po' più semplice.

E chiamare funzioni come SetIndexBuffer con un ritardo e non nell'init standard non vi preoccupa? Sei assolutamente sicuro che vada bene?

 
Dmitry Fedoseev:

La logica (algoritmo) è la stessa?
Sì.
 
Dmitry Fedoseev:

Conta quante linee ho io e quante ne hai tu... due righe che aggiunge, un sacco di sciocchezze per dove - due righe.

Non hai contato - sono tanti.

Esattamente due sono sufficienti da aggiungere per qualsiasi indicatore per avere l'ambita proprietà di questa discussione.

 
fxsaber:

Non hai contato - sono tanti.

Esattamente due sono sufficienti da aggiungere per rendere qualsiasi indicatore una caratteristica desiderabile di questa discussione.


Questa è la decima domanda. È una questione di gusti. Ma comunque il mio codice è 5 volte più piccolo e leggibile :/

Più interessante è questo:

Chiamare la funzione SetIndexBuffer con un ritardo e non nell'inite standard non crea confusione? Sei assolutamente sicuro che sia normale?

 
Dmitry Fedoseev:

Si chiama la funzione SetIndexBuffer con un ritardo e non nell'init standard? Sei assolutamente sicuro che questo sia normale?

Assolutamente. Chiamare OnCalculate probabilmente causerà problemi, ma questo si risolve con semplici modifiche alla libreria. Sarà possibile chiarirlo lunedì.

In linea di principio, una linea può essere sufficiente.

Motivazione: