Fehler, Irrtümer, Fragen - Seite 435

 
voix_kas:

Im Allgemeinen ist es lustig, wie es sich entwickelt.
Aufgrund einer Vermutung dachte ich, dass die OnDenit-Funktion eine Art Destruktor und die OnInit-Funktion ein Konstruktor eines EAs ist.

Tatsächlich stellt sich heraus, dass OnInit ein mehrfaches Ereignis ist (innerhalb der Lebensdauer von Expert Advisor). Es ist also 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)?

Wenn sich die Symbole ändern, wird der Expert Advisor im Interesse eines schnellen Starts und der Speicherung der Informationsbasis seines vorherigen Lebens heiß geladen.

Ein Beispiel: Der Expert Advisor befindet sich auf dem Chart, er hat seine Statistiken und seine Logik angesammelt, und dann wird der Zeitrahmen geändert und er muss bei einem Neustart von Null an arbeiten.

Und es gibt noch eine weitere Frage.
Der Grund für die Deinitialisierung von REASON_CHARTCHANGE - ein Symbol oder eine Chartperiode wurde geändert.
Bitte erklären Sie, wie ein Diagrammsymbol geändert werden kann, ohne einen EA darauf zu löschen?

Im Modus "Heißer Neustart".
 

Yedelkin, Interessant, Renat
Vielen Dank für die Klarstellung.

Ich halte es auch für sinnvoll, eine explizite Liste von "heißen" und "kalten" Neustarts in die Dokumentation aufzunehmen.

Wenn es keine Neuinitialisierung bei jedem OnInit gibt, müssen wir für den Multicast-EA eine Krücke verwenden, nämlich ein globales Flag. :(
Ich werde den Code ein wenig später veröffentlichen.

 
Interesting:

Der Expert Advisor wird auf jeden Fall nicht während der normalen Initialisierung gelöscht, sondern es wird ihm nur erlaubt, unter bestimmten Terminaleinstellungen zu handeln (dafür muss der Expert Advisor aber verstehen, dass das Symbol geändert wurde...).

Übrigens, das erinnert mich daran. Ich wollte die Entwickler schon lange nach diesen Einstellungen fragen.

Renat, bitte machen Sie zwei verschiedene Checkboxen, um den Handel zu deaktivieren, wenn Sie den Zeitrahmen und das Symbol ändern. Das sind zwei grundlegend verschiedene Änderungen.

Ich möchte nicht, dass meine EAs beim Wechsel des Zeitrahmens den Handel unterbrechen - das ist absolut unnötig - sie verarbeiten ohnehin jeden Tick und es gibt keine Probleme damit.

Die Änderung des Symbols ist jedoch von grundlegender Bedeutung. Ich möchte diese Sperre aufheben... aber jetzt sind diese beiden Anpassungen aus irgendeinem Grund synchronisiert und gemeinsam geregelt.

Ich löse dieses Problem programmatisch (indem ich das ursprüngliche Symbol in einer statischen Variablen speichere und die Änderungen in der Inite kontrolliere). Es wäre jedoch besser, wenn dies auf der Terminalebene blockiert werden könnte.

Noch besser wäre die Möglichkeit, den Zeitrahmen oder das Symbol zu wechseln, während ein Expert Advisor läuft. Warum sollte man den Handel aufgrund von Dummheit und Vergesslichkeit einstellen?

D.h. es wäre viel besser, den Wechsel des Zeitrahmens und/oder des Symbols (separat!) zu blockieren, wenn in den Einstellungen festgelegt ist, dass dies verboten ist, wenn der Expert Advisor in einem Chart vorhanden ist.

// Mit einer entsprechenden Meldung beim Versuch, dies zu tun.

Eigentlich kann man das auch programmatisch lösen (indem man das Symbol oder den Zeitrahmen zwangsweise wieder einsetzt), aber ich denke, Sie selbst sind an wirklich benutzerfreundlichen Einstellungen auf Terminalebene interessiert.

 

MetaDriver:

Renat, bitte machen Sie zwei verschiedene Checkboxen, um den Handel bei Zeitrahmenwechsel und Symbolwechsel zu blockieren. Dies sind zwei grundlegend verschiedene Änderungen.

Ich möchte nicht, dass meine EAs den Handel stoppen, wenn sie den Zeitrahmen wechseln - das ist absolut unnötig - sie verarbeiten sowieso jeden Tick und es gibt keine Probleme damit.


Ich unterstütze die Idee, man sollte zwei Häkchen und eine Trennung in den Deinitialisierungsgrund-Codes machen (so wäre es bequemer).

Aber die Möglichkeit zu blockieren, den Zeitrahmen zu ändern, ich weiß nicht wie (über das Symbol), ist zu viel für mich.

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

Da fällt mir ein. Ich wollte die Entwickler schon seit langem nach diesen Einstellungen fragen.

Renat, bitte machen Sie zwei verschiedene Kontrollkästchen, um den Handel bei Änderung des Zeitrahmens und bei Änderung des Symbols zu blockieren. Dies sind zwei grundlegend verschiedene Änderungen.

Ja, es scheint, dass die Bedingung, das Symbol und den Zeitrahmen zu ändern, umsonst kombiniert wurden.

Ich bin auch dafür, sie in zwei Bedingungen aufzuteilen. Das Ticket ist bereits im Service Desk hinterlegt.

 

Ich füge den Code für die Definition der Arbeitswerkzeuge für das Multi-Tool bei. Kritik ist willkommen. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Bei jedem Tick versucht ein Expert Advisor, eine Liste der funktionierenden Instrumente zu erhalten.
Die Aktualisierung der Liste der Arbeitsinstrumente erfolgt unter zwei Bedingungen: 1) OnInit wird ausgelöst, 2) nach der Zeit, die im Eingabeparameter des EA eingestellt wurde.
Wie wir sehen, wird eine Krücke in Form einer globalen Variablen(bool Initialize) verwendet, um die nächste Initialisierung zu erkennen. Wenn es eine Initialisierung der Statik gäbe, wäre sie nicht erforderlich.

Ich betrachte globale Variablen als böse, ebenso wie den unbedingten goto-Operator zu seiner Zeit.

 
voix_kas:

In Ermangelung einer Neuinitialisierung bei jedem OnInit muss bei Multilateralen eine "Krücke" in Form eines globalen Flags verwendet werden. :(

Es ist besser, den Code von Anfang an sorgfältig zu schreiben, ohne Krücken in Form von statischen Zwischenvariablen zu hinterlassen.

Verstecken Sie solche Daten innerhalb einer Klasse. Wenn die Klasse tot ist, ist auch die Umwelt tot.

Und auf globaler Ebene sollte ein Minimum an statischen Variablen belassen werden.

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

Ich füge den Code für die Definition der Arbeitswerkzeuge für das Multi-Tool bei. Kritik ist willkommen. :)

Ein Tipp: Setzen Sie das Symbol auf die globale Ebene und setzen Sie es bei OnInit auf Null. Wenn das Array leer ist, ist es an der Zeit, es zu initialisieren.

Und keine zusätzlichen Flaggen.

 
Renat:

Ein Tipp: Bringen Sie Symbol auf die globale Ebene und setzen Sie es in OnInit auf Null. Wenn das Array leer ist, ist es an der Zeit, es zu initialisieren.

Und keine zusätzlichen Flaggen.

Ich schätze, ich bin paranoid. Ich mag keine öffentlichen (globalen) Variablen. Ich halte es für ein Muveton.
Ist es möglich, einen Weg innerhalb von OnTick zu definieren, um OnInit auszulösen?
Kann ich zum Beispiel eine statische Variable innerhalb von OnTick deklarieren, die die Anzahl der Initialisierungen des EA speichert (wenn es eine solche oder ähnliche Eigenschaft in MQL5 gibt)?

 
voix_kas:

Globale Variablen sind böse, ebenso wie früher der unbedingte goto-Operator.

Ich muss paranoid sein. Ich mag keine öffentlichen (globalen) Variablen. Ich finde es ein Muveton.

1. Warum? Es ist notwendig, schädliche Symptome zu beseitigen, und zwar entschieden.

2. Benennen Sie Variablen, Arrays und andere Dinge nicht mit demselben Namen oder denselben Schlüsselwörtern der Sprache (das Array "Symbol" ist jedoch sehr auffällig, man kann nicht erkennen, ob es ein Array oder etwas anderes in Ihrem Code ist).

Renat:

Die Lösung besteht darin, solche Daten innerhalb der Klasse zu verstecken. Wenn die Klasse stirbt, stirbt auch die Umwelt.

Und auf globaler Ebene sollten Sie ein Minimum an statischen Variablen belassen.

Ein guter Vorschlag. Es ist an der Zeit, zu OOP zu wechseln... :)