Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 204

 
Andrey Khatimlianskii:

Niemand hat garantiert, dass andere Ereignisbehandler unterbrochen (oder nicht ausgeführt) werden.

Nach dem Alarm erfolgen sowohl deinit als auch init, richtig?

Ja, es ist ein kompletter Neustart im Gange. Es ist nur der Timer (sogar ein zweiter), auf den man sich stürzt - ein Merkmal, kein Fehler.

 
fxsaber:

Dieser Berater warnt beim Wechsel zwischen Konten. Es scheint, dass sie dies nicht tun sollte, gemäß der Regel

Dies geschieht jedoch aufgrund des Timers.

Diese Besonderheit kann genutzt werden, um ein in der Formulierung einfaches, aber in der Umsetzung komplexes Problem zu lösen.

// Если произошла смена счета, советник выгружается.

const bool Init = EventSetMillisecondTimer(1);

void OnTimer()
{
  static const long Account = AccountInfoInteger(ACCOUNT_LOGIN);
  
  if (Account != AccountInfoInteger(ACCOUNT_LOGIN))
    ExpertRemove();
}
 
fxsaber:

Diese Funktion kann zur Lösung einer in der Formulierung einfachen, aber in der Umsetzung komplexen Aufgabe verwendet werden.

Warum können wir nicht einfach den Kontowechsel bei der Eingabe jeder On-Funktion überprüfen?

Warum ein Millisekunden-Timer? Die Programmausführung wird nicht unterbrochen, wenn während der Laufzeit eine erneute Anmeldung erfolgt.

 
Andrey Khatimlianskii:

Warum können Sie nicht einfach den Kontowechsel bei der Eingabe jeder Ein-Funktion überprüfen?

Warum ein Millisekunden-Timer? Es unterbricht die Programmausführung nicht, wenn eine erneute Anmeldung erfolgt, während das Programm läuft.

Versuchen Sie es. Unter dem obigen Link finden Sie eine lange Diskussion zu diesem Thema.

 
fxsaber:

Ja, es ist ein kompletter Neustart im Gange. Es ist nur der Timer (sogar ein zweiter Timer), der hochgezählt wird - eine Funktion, kein Fehler.

Nach dem ExpertRemove()-Befehl wird das Stop-Flag einfach angehoben und der EA arbeitet bis zum nächsten Tick weiter. Bei einem neuen Tick wird der EA entladen, wenn die Stop-Flagge angehoben wird. Das bedeutet, dass bis zum Eintreffen eines neuen Ticks alle Ein-Funktionen im normalen Modus weiterarbeiten.

Wenn wir also den Status dieser Flagge nicht programmatisch abrufen können (ich habe nicht speziell nach dieser Funktion gesucht), dann müssen wir eine global benutzerdefinierte Flagge haben. Wir setzen unser eigenes Flag vor dem Befehl ExpertRemove() und überprüfen es in jeder On-Funktion. Wenn die Flagge gesetzt ist, werden wir gehen. Dann wird der Zeitgeber den darin enthaltenen Code nicht ausführen.

Oder habe ich mich vielleicht geirrt und die Frage ist eine andere?

 
Artyom Trishkin:

Nach dem ExpertRemove()-Befehl wird das Stop-Flag einfach gesetzt und der EA arbeitet bis zum nächsten Tick weiter. Wenn die Stop-Flagge bei einem neuen Tick angehoben wird, wird der EA entladen. Das bedeutet, dass bis zum Eintreffen eines neuen Ticks alle Ein-Funktionen im normalen Modus weiterarbeiten.

Wenn wir also den Status dieser Flagge nicht programmatisch abrufen können (ich habe nicht speziell nach dieser Funktion gesucht), dann müssen wir eine global benutzerdefinierte Flagge haben. Wir setzen unser eigenes Flag vor dem Befehl ExpertRemove() und überprüfen es in jeder On-Funktion. Wenn die Flagge gesetzt ist, werden wir gehen. Dann wird der Timer den darin geschriebenen Code nicht ausführen.

Oder habe ich vielleicht alles falsch verstanden und die Frage lautet anders?

Ich weiß nicht, welches Problem Sie beschreiben.

 
Artyom Trishkin:

Nach dem ExpertRemove()-Befehl wird das Stop-Flag einfach gesetzt und der EA arbeitet bis zum nächsten Tick weiter. Wenn die Stop-Flagge bei einem neuen Tick angehoben wird, wird der EA entladen. Das bedeutet, dass bis zum Eintreffen eines neuen Ticks alle Ein-Funktionen im normalen Modus weiterarbeiten.

Wenn wir also den Status dieser Flagge nicht programmatisch abrufen können (ich habe nicht speziell nach dieser Funktion gesucht), dann müssen wir eine global benutzerdefinierte Flagge haben. Wir setzen unser eigenes Flag vor dem Befehl ExpertRemove() und überprüfen es in jeder On-Funktion. Wenn die Flagge gesetzt ist, gehen wir. Dann wird der Timer den darin geschriebenen Code nicht ausführen.

Oder habe ich vielleicht alles falsch verstanden und die Frage lautet anders?

Nicht bei einem neuen Häkchen, sondern bei der nächsten Rückkehr;

Fügen Sie ExpertRemove() in OnInit() ein und überprüfen Sie es im Debug Schritt für Schritt.

 
Alexey Viktorov:

Nicht bei einem neuen Häkchen, sondern bei der nächsten Rückkehr;

Fügen Sie ExpertRemove() in OnInit() ein und überprüfen Sie es Schritt für Schritt im Debug-Modus.

Ja, mein Fehler. Das nächste Ereignis wird nicht ausgeführt. Es ist lange her, dass ich in der Hilfe nach Funktionen gesucht habe, die ich nicht brauche :)

 
fxsaber:

Ich weiß nicht, welches Problem Sie beschreiben.

Die Bedeutung der Antwort ist nicht klar. Das spielt keine Rolle.

 
Artyom Trishkin:

Die Bedeutung der Antwort ist nicht klar.

ExpertRemove ist nicht aufgerufen worden.