OnDeinit in Indikatoren - Seite 7

 

Entwickler, Sie haben irgendwo einen Fehler.

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

Sehen Sie sich den Screenshot von Comment nach dem Schließen des Terminals und dem Öffnen nach 1 Minute an.

Anzahl der initialisierten Elemente und dass das erste, zweite, dritte und vierte Element des Puffers leer ist.

Der Indikator zählt nur den 0-ten Puffer. Warum also 2 Kerzen?


 
Oh, ja. Die englische Hilfe sagt auch, dassArrayInitialize nichts zurückgibt.

 
eevviill:

Entwickler, Sie haben irgendwo einen Fehler.

Sehen Sie sich den Screenshot von Comment nach dem Schließen des Terminals und dem Öffnen nach 1 Minute an.

Anzahl der initialisierten Elemente und dass das erste, zweite, dritte und vierte Element des Puffers leer ist.

Der Indikator zählt nur den 0-ten Puffer. Warum also 2 Kerzen?


Denn wenn Sie einen neuen Balken analysieren, prüfen Sie nicht die Anzahl der Balken, sondern nur die Zeit. Wenn Sie das Terminal starten oder die Verbindung mit dem Server während des Vorgangs unterbrechen, bevor die fehlenden (zum vollständigen Verlauf) Balken eintreffen, kommt ein Häkchen. Bei diesem Tick wird eine neue Kerze erstellt, aber es gibt eine Lücke (fehlender Verlauf) zwischen ihr und dem Verlauf im Terminal, der vom Server heruntergeladen und in das System eingefügt wird, und da Sie die Anzahl der Balken nicht analysieren, werden Sie denken, dass es bei der nächsten Berechnung keinen neuen Balken gibt, und dann erscheint die zweite Kerze. Nach dem Öffnen einer neuen Leiste wird diese verschwinden.
 
mql5:
Denn wenn Sie einen neuen Balken analysieren, prüfen Sie nicht die Anzahl der Balken, sondern beschränken sich darauf, die Zeit zu prüfen. Wenn Sie das Terminal starten oder die Verbindung mit dem Server während des Vorgangs unterbrechen, kommt ein Häkchen, bevor die fehlenden (zum vollständigen Verlauf) Balken ankommen. Bei diesem Tick wird eine neue Kerze erstellt, aber es gibt eine Lücke (fehlender Verlauf) zwischen ihr und dem Verlauf im Terminal, der vom Server heruntergeladen und in das System eingefügt wird, und da Sie die Anzahl der Balken nicht analysieren, werden Sie denken, dass es bei der nächsten Berechnung keinen neuen Balken gibt, und dann erscheint die zweite Kerze. Nach dem Öffnen einer neuen Leiste wird diese verschwinden.

Und es spielt keine Rolle, dass beim Deinitieren der Nullabgleich erfolgt, wenn das Terminal geschlossen ist?

 

Lassen Sie einen Testindikator laufen, der die Anzahl der Balken ausgibt.

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   
//--- return value of prev_calculated for next call
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

Dies wird im Protokoll ausgedruckt.

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


Vielleicht sagt Ihnen das, wo das Problem herkommt...

 
eevviill:

Bitte fragen Sie die Entwickler nach einer einfachen Antwort.

Wird die Funktion DeInit() in den an das Diagramm angehängten Programmen ausgeführt, wenn das Terminal geschlossen wird?

Streng genommen, nein.

OnDeinit wird ausgeführt. DeInit wird nur ausgeführt, wenn Sie es explizit von OnDeinit aus aufrufen.

Wenn Sie sich auf die alte Funktion deinit beziehen, bedenken Sie bitte, dass bei Funktionsnamen zwischen Groß- und Kleinschreibung unterschieden wird. Das heißt, deInit ist eine unbekannte Funktion, deinit ist ein Standard-Einstiegspunkt bei der Deinitialisierung (wie OnDeinit)

 
eevviill:

Und es spielt keine Rolle, dass bei Deinit der Nullabgleich stattfindet, wenn das Terminal geschlossen ist?

Wen interessiert das? Wenn das Terminal geschlossen wird, werden diese Puffer nicht mehr benötigt, da sie sofort freigegeben werden, wenn das Programm entladen wird, was unmittelbar nach OnDeinit geschieht

Versuchen Sie einfach, den Zeitrahmen zu ändern. OnDeinit wird funktionieren, die Puffer bleiben erhalten (weil das Programm in diesem Fall nicht entladen wird), aber niemand garantiert, dass ihr Inhalt aus dem "Vorleben" stammt

Lesen Sie endlich die Dokumentation! https://docs.mql4.com/ru/runtime/running und https://docs.mql4.com/ru/runtime/event_fire#d einit

 
stringo:

Wen interessiert das? Wenn Sie das Terminal schließen, werden diese Puffer nicht mehr benötigt, da sie sofort freigegeben werden, wenn das Programm entladen wird, was unmittelbar nach OnDeinit geschieht

Versuchen Sie einfach, den Zeitrahmen zu ändern. OnDeinit wird funktionieren, die Puffer bleiben erhalten (da das Programm in diesem Fall nicht entladen wird), aber niemand garantiert, dass ihr Inhalt aus dem "Vorleben" stammt

Lesen Sie endlich die Dokumentation! https://docs.mql4.com/ru/runtime/running und https://docs.mql4.com/ru/runtime/event_fire#d einit

In meinem Fall werden die Puffer also bereits aufgeteilt, wenn das Diagramm erneut geöffnet wird?
 
eevviill:
In meinem Fall werden die Puffer also gegabelt, wenn der Graph wieder geöffnet wird?

Sie haben keine Pufferbifurkation.

So füllen Sie Ihren Puffer selbst auf. Das erste Mal, wenn Sie es zeichnen; das zweite Mal, wenn Sie einen Teil der Daten erhalten. Beide Male arbeiten Sie mit demselben Time[0]-Wert.

 
stringo:

Sie haben keinen Puffersplit.

So füllen Sie Ihren Puffer selbst auf. Das erste Mal beim Rendering und das zweite Mal beim Eintreffen der Daten. Beide Male arbeiten Sie mit demselben Time[0]-Wert.

GUT.

Bitte korrigieren Sie die englische Hilfe und das war's.

Auch die englische Hilfe sagt, dassArrayInitialize nichts zurückgibt.

Grund der Beschwerde: