Séquence d'exécution de Init() et DeInit() - page 22

 
fxsaber:
La solution au problème

C'est-à-dire que le problème est d'ajouter DEUX lignes identiques à un indicateur.


Code de la bibliothèque


Y a-t-il quelque chose de plus simple, de plus clair et de plus vivant ?

J'ai également besoin d'un nom de variable globale pour chaque instance de l'indicateur, au cas où il y aurait deux indicateurs avec des paramètres différents dans le graphique).

 
Dmitry Fedoseev:


Cela ne peut-il pas être plus simple, plus clair et plus évident ?

Non.

De plus, chaque instance d'indicateur a besoin de son propre nom de variable globale, au cas où il y aurait deux indicateurs avec des paramètres différents dans le graphique).

Vous ne devriez pas le faire, car deux instances de l'indicateur avec des paramètres différents sur un même graphique contredit l'usage, qui est souhaité dans cette branche.

Par conséquent, si vous lancez la deuxième instance, elle ne fonctionnera pas tant que la première n'aura pas été déchargée.

 
fxsaber:

Pas du tout.

...



#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);
  }
//+------------------------------------------------------------------+
C'est le cas ?
 
Dmitry Fedoseev:
C'est le cas ?

Non, bien sûr que non. Handle-chart doit nécessairement être écrit dans le nom d'une variable globale.

Et ma solution est obtenue en ajoutant seulement deux lignes. C'est un peu plus simple.

#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:

Non, bien sûr que non. Handle-chart doit nécessairement être écrit dans le nom d'une variable globale.

Et ma solution est obtenue en ajoutant seulement deux lignes. C'est un peu plus simple.


Et la logique (algorithme) elle-même est la même ?
 
fxsaber:

....

Et ma solution est obtenue en ajoutant seulement deux lignes. C'est un peu plus simple.

Et appeler des fonctions comme SetIndexBuffer avec un délai et non dans l'init standard ne vous dérange pas ? Vous êtes absolument sûr que c'est bon ?

 
Dmitry Fedoseev:

La logique (algorithme) est-elle la même ?
Oui.
 
Dmitry Fedoseev:

Comptez combien de lignes j'ai et combien vous avez... deux lignes cela ajoute, un sacré paquet d'absurdités où - deux lignes.

Vous n'avez pas compté - c'est beaucoup.

Il suffit d'en ajouter exactement deux pour que tout indicateur ait la propriété convoitée de cette discussion.

 
fxsaber:

Vous n'avez pas compté - c'est beaucoup.

Il suffit d'en ajouter deux pour que tout indicateur devienne un élément souhaitable de cette discussion.


C'est la dixième question. C'est une question de goût. Mais mon code est quand même 5 fois plus petit et lisible :/

Ce qui est plus intéressant, c'est ceci :

L'appel de la fonction SetIndexBuffer avec un délai et non dans l'inite standard ne prête pas à confusion ? Êtes-vous absolument sûr que c'est normal ?

 
Dmitry Fedoseev:

L'appel de la fonction SetIndexBuffer avec un délai et non dans l'init standard ? Êtes-vous absolument sûr que c'est normal ?

Absolument. L'appel à OnCalculate causera probablement des problèmes, mais ceux-ci sont résolus par des modifications simples de la bibliothèque. Il sera possible de le clarifier lundi.

En principe, une seule ligne peut suffire.

Raison: