Fehler, Irrtümer, Fragen - Seite 434

 

Komposter
Sie haben Recht. Ich habe einen Fehler gemacht.
Ich danke Ihnen für Ihre Antwort.

 
Silent:

MQL5 Referenzhandbuch - Standardbibliothek - Klassen zum Organisieren von Daten - CArrayObj (auf der Website und in der Hilfe):

2. Der Speicherverwaltungsmechanismus ist deaktiviert.

In diesem Fall ist CArrayObj nicht für die Freigabe von Speicherplatz verantwortlich

Ich habe es korrigiert, danke.
 

Dokumentation. Abschnitt Statische Variablen.

"...Statische Variablen existieren ab dem Zeitpunkt der Programmausführung und werden einmalig initialisiert bevor die spezialisierte Funktion OnInit() aufgerufen wird..."

Überprüfung des Codes des Expert Advisors:

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

"Platzierung" des EA auf dem Chart:

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

Ohne den EA aus dem Chart zu entfernen, ändern wir die Chartperiode:

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

Soll das so funktionieren?

Ich habe die Informationen aus der Dokumentation tatsächlich als eine erzwungene Initialisierung von statischen Variablen bei jedem Aufruf der Funktion OnInit() interpretiert, unabhängig davon, ob dies durch eine Neukompilierung oder eine Änderung des Symbols oder etwas anderes verursacht wurde...

Es stellte sich heraus, dass ich mich geirrt hatte. Bitte klären Sie mich auf: Welche Ausnahmen gibt es von dieser Regel?

 

Wenn die Eingangsparameter geändert werden, ist es das gleiche "Durcheinander".

Wenn das Konto jedoch geändert wird, wird dies korrekt gehandhabt - die statischen Variablen werden neu initialisiert.

Ich frage mich, wie ich das Diagrammsymbol ändern kann, ohne den Experten zu löschen(REASON_CHARTCHANGE)?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
voix_kas:

Dokumentation. Abschnitt Statische Variablen.

"...Statische Variablen existieren ab dem Zeitpunkt der Programmausführung und werden einmalig initialisiert bevor die spezialisierte Funktion OnInit() aufgerufen wird..."

Überprüfung des Codes des Expert Advisors:

"Platzierung" des EA auf dem Chart:

Ohne den EA aus dem Chart zu entfernen, ändern wir die Chartperiode:

Soll das so funktionieren?

Ja, es sollte funktionieren.

Das Programm (sein Code) wurde bereits einmal geladen und führt nur eine heiße Neuinitialisierung durch (Deinit/Init ohne Entladen von Code). In diesem Fall muss der Entwickler selbst für eine ordnungsgemäße Initialisierung der Umgebung sorgen.

 
Renat:

Ja, so sollte es funktionieren.

Das Programm (sein Code) ist bereits einmal geladen und führt nur eine heiße Neuinitialisierung durch (Deinit/Init ohne Entladen von Code). In diesem Fall muss der Entwickler für eine ordnungsgemäße Initialisierung der Umgebung sorgen.

Erstens widerspricht Ihr Kommentar eindeutig der Definition in der Dokumentation: einmal initialisieren, bevor OnInit() aufgerufen wird. Dann sollten Sie die Definition in der Dokumentation klar angeben: "...initialize once before calling OnInit(). erste OnInit() aufrufen".
Zweitens widerspricht Ihr Kommentar eindeutig dem Fall eines Kontowechsels, bei dem MT den Expert Advisor natürlich zwangsweise beendet und wiederherstellt.

Kann die grundsätzliche Frage, ob statische Variablen bei jedem (nicht nur beim ersten) Aufruf von OnInit() zwangsweise reinitialisiert werden sollten, zur Diskussion/Abstimmung gestellt werden?

 

Im Allgemeinen ist es komisch, wie die Dinge funktionieren.
Auf den ersten Blick dachte ich, dass die Funktion OnDenit eine Art Destruktor ist und OnInit der Konstruktor des Expert Advisors.
Tatsächlich stellt sich heraus, dass OnInit ein mehrfaches Ereignis ist (innerhalb der Lebensdauer von expert). Dann ist nicht klar, warum wir das OnDenit-Ereignis explizit generieren müssen, wenn wir wissen, dass der EA seinen Betrieb nicht beendet (z.B. im Falle eines Wechsels der Chart-Periode)?

Und noch eine Frage.
Der Grund für die Deinitialisierung von REASON_CHARTCHANGE ist, dass das Symbol oder die Periode eines Diagramms geändert wurde.
Bitte erklären Sie, wie ein Diagrammsymbol geändert werden kann, ohne den EA darauf zu löschen?

 
voix_kas:

Und noch eine Frage.
Grund für die Deinitialisierung REASON_CHARTCHANGE - Das Diagrammsymbol oder die Periode wurde geändert.
Bitte erklären Sie, wie ein Diagrammsymbol geändert werden kann, ohne den EA darauf zu löschen?

ChartSetSymbolPeriod()
 
voix_kas:

Eigentlich ist es lustig.
Nach meiner Intuition dachte ich, dass die OnDenit-Funktion eine Art Destruktor und die OnInit-Funktion der Konstruktor des Expert Advisors sei.
In der Tat scheint es, dass OnInit ein mehrfaches Ereignis ist (innerhalb der Lebensdauer eines Expert Advisors). Dann ist nicht klar, warum wir das OnDenit-Ereignis explizit generieren müssen, wenn wir wissen, dass der EA seinen Betrieb nicht beendet (z. B. im Falle eines Wechsels der Chart-Periode)?

Und noch eine Frage.
Der Grund für die Deinitialisierung von REASON_CHARTCHANGE - Das Symbol oder die Periode eines Diagramms wurde geändert.
Bitte erklären Sie, wie ein Diagrammsymbol geändert werden kann, ohne den EA darauf zu löschen?

Auf die gleiche Weise wurde alles in MT4 aufgerufen. Und es ist nicht bekannt, ob der Experte seine Arbeit beendet hat oder nicht (zu diesem Zweck sind in OnDeinit Parameter gefallen, obwohl der Grund der möglichen OnInit-Auslösung auch leicht zu erkennen ist).

2. Es ist sehr einfach, in den Terminaleinstellungen dem Expert Advisor zu erlauben, zu handeln, wenn sich das Symbol und der Zeitraum ändern.

Wählen Sie dann in der Marktübersicht ein anderes Symbol aus und lassen Sie es mit der Maus auf dem Chart "fallen".

Der EA wird in jedem Fall bei normaler Initialisierung nach dem Wechsel des Symbols/der Periode "nicht gelöscht" (er wird "Hot Restart", wie Renat unten sagte). Wenn wir es auf einer einfachen Ebene betrachten, wird der Expert Advisor unter bestimmten Terminaleinstellungen zum Handel zugelassen.

Yedelkin:
ChartSetSymbolPeriod()
Eine weitere Option, aber programmatisch. :)
 
voix_kas:

Erstens widerspricht Ihr Kommentar eindeutig der Definition in der Dokumentation: Sie werden einmal initialisiert, bevor OnInit() aufgerufen wird. Dann sollten Sie die Definition in der Dokumentation klar angeben: "...initialize once before calling OnInit(). erste OnInit()-Aufruf".

Ja, dies sollte in der Dokumentation genauer definiert werden.


Zweitens widerspricht Ihr Kommentar eindeutig dem Fall des Kontowechsels, bei dem MT den EA offensichtlich zwangsweise beendet und wiederherstellt.

Ja, wenn das Konto geändert wird, entlädt sich der Expert Advisor natürlich aus dem Speicher und führt einen Neustart durch. Wir haben es absichtlich getan.


Können wir eine grundsätzliche Frage über die Notwendigkeit der erzwungenen Reinitialisierung statischer Variablen bei jedem (nicht nur beim ersten) Aufruf von OnInit() einführen/abstimmen?

Leider nein. Dies kann nur durch einen Kaltstart des Expert Advisors behoben werden.