Init() und DeInit() Ausführungsreihenfolge - Seite 22

 
fxsaber:
Die Lösung des Problems

D.h. das ganze Problem ist das Hinzufügen von ZWEI gleichen Zeilen zu einem beliebigen Indikator.


Bibliothekscode


Gibt es etwas Einfacheres, Deutlicheres und Anschaulicheres?

Ich benötige auch einen globalen Variablennamen für jede Instanz des Indikators, falls es zwei Indikatoren mit unterschiedlichen Parametern im Diagramm gibt).

 
Dmitry Fedoseev:


Kann es nicht einfacher, klarer und offensichtlicher sein?

Nein.

Außerdem benötigt jede Indikatorinstanz ihren eigenen globalen Variablennamen, falls es zwei Indikatoren mit unterschiedlichen Parametern im Diagramm gibt.)

Das sollten Sie nicht tun, denn zwei Instanzen des Indikators mit unterschiedlichen Parametern in einem Diagramm widersprechen der Verwendung, die in diesem Zweig gewünscht ist.

Wenn Sie also die zweite Instanz starten, wird sie nicht funktionieren, bis die erste entladen ist.

 
fxsaber:

Niemals.

...



#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);
  }
//+------------------------------------------------------------------+
Ist es das?
 
Dmitry Fedoseev:
Ist es das?

Nein, natürlich nicht. Handle-Chart muss unbedingt in den Namen einer globalen Variablen geschrieben werden.

Und meine Lösung wird durch das Hinzufügen von nur zwei Zeilen erreicht. Es ist etwas einfacher.

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

Nein, natürlich nicht. Handle-Chart muss unbedingt in den Namen einer globalen Variablen geschrieben werden.

Und meine Lösung wird durch das Hinzufügen von nur zwei Zeilen erreicht. Dies ist etwas einfacher.


Und die Logik (der Algorithmus) selbst ist die gleiche?
 
fxsaber:

....

Und meine Lösung wird durch das Hinzufügen von nur zwei Zeilen erreicht. Dies ist etwas einfacher.

Und der Aufruf von Funktionen wie SetIndexBuffer mit einer Verzögerung und nicht im Standard-Init stört Sie nicht? Sind Sie absolut sicher, dass es in Ordnung ist?

 
Dmitry Fedoseev:

Ist die Logik (der Algorithmus) dieselbe?
Ja.
 
Dmitry Fedoseev:

Zählen Sie, wie viele Zeilen ich habe und wie viele Sie haben... zwei Zeilen, wozu noch eine ganze Menge Unsinn hinzukommt - zwei Zeilen.

Sie haben nicht mitgezählt - das ist eine Menge.

Genau zwei sind genug, um jedem Indikator die begehrte Eigenschaft dieser Diskussion zu verleihen.

 
fxsaber:

Sie haben nicht mitgezählt - das ist eine ganze Menge.

Genau zwei sind genug, um jedem Indikator die begehrte Eigenschaft dieser Diskussion zu verleihen.


Dies ist die zehnte Frage. Das ist eine Frage des Geschmacks. Aber trotzdem ist mein Code 5 mal kleiner und lesbar :/

Noch interessanter ist dies:

Der Aufruf der Funktion SetIndexBuffer mit einer Verzögerung und nicht in der Standard-Inite ist nicht verwirrend? Sind Sie absolut sicher, dass dies normal ist?

 
Dmitry Fedoseev:

Ist der Aufruf der SetIndexBuffer-Funktion mit einer Verzögerung und nicht in der Standard-Init? Sind Sie absolut sicher, dass dies normal ist?

Ganz genau. Der Aufruf von OnCalculate wird wahrscheinlich zu Problemen führen, aber das lässt sich durch einfache Änderungen in der Bibliothek lösen. Am Montag wird es möglich sein, dies zu klären.

Im Prinzip kann eine Zeile ausreichen.

Grund der Beschwerde: