Gemeinsam lernen und schreiben in MQL5 - Seite 17

 
Yedelkin:

Frage zur Funktion Sleep(). Verstehe ich das richtig, dass die Verwendung dieser Funktion in einem Expert Advisor die Ausführung nur dieses EA anhält und die CPU-Ressourcen (Kernel) an die nächsten Aufgaben in der Liste der Aufgaben dieses Kernels überträgt? Mit anderen Worten, ist es richtig, dass die Funktion Sleep() nicht den Thread selbst verlangsamt, in dem der Expert Advisor verarbeitet wird, sondern als Umschalter zwischen dem aktuellen Expert Advisor und anderen Programmen funktioniert, die von einem bestimmten Kernel abgeholt werden?

Wenn ich Sleep(0) einstelle, schaltet er um, und wenn ich Sleep(milliseconds) einstelle, wird der EA für eine bestimmte Anzahl von Millisekunden angehalten.

Gleichzeitig ist, soweit ich weiß, jeder Expert Advisor ein separater Thread und jeder dieser Threads beansprucht Prozessorzeit (die Überprüfung des Thread-Status wird laut Hilfe alle 100 Millisekunden durchgeführt).

Wenn also ein Thread, aus welchem Grund auch immer, inaktiv ist, wird die CPU-Zeit an einen anderen Thread weitergegeben und der Status des Threads, der "beschlossen hat zu schlafen", wird nach 100 Millisekunden überprüft.

PS

Die Aufteilung der Kerne auf die einzelnen Threads bleibt den Entwicklern überlassen.

 
Yedelkin:

Frage zur Funktion Sleep(). Verstehe ich das richtig, dass die Verwendung dieser Funktion in einem Expert Advisor nur die Ausführung dieses EA anhält und die CPU-Ressourcen (Kernel) an die nächsten Aufgaben in der Liste der Aufgaben dieses Kernels überträgt? Mit anderen Worten, ist es richtig, dass die Funktion Sleep() nicht den Thread selbst verlangsamt, in dem der Expert Advisor verarbeitet wird, sondern als Schalter zwischen dem aktuellen Expert Advisor und anderen Programmen fungiert, die von einem bestimmten Kernel abgeholt werden?

Jeder Experte wird in seinem eigenen Thread ausgeführt. Sleep() verlangsamt diesen Thread. Es gibt keine Bindung an Kerne (Affinitätsmaske).
 
Yedelkin:

Frage zur MqlTradeResult-Struktur. Ich habe darin kein Zeitfeld gefunden - die Zeit der erfolgreichen Überprüfung der Basisanforderung (oder etwas Ähnliches). Erinnert sich jemand daran, ob es eine Frage über die Einführung eines zusätzlichen Zeitfeldes in die MqlTradeResult-Struktur gab? Wird benötigt, um einen schwebenden Auftrag herauszuziehen, wenn er plötzlich in die Historie eingeht.

Der Antrag ist nicht eindeutig. Wenn der Auftrag geöffnet wurde, wird die Öffnungszeit gespeichert. Warum brauchen Sie die Antwortzeit des Servers?
 
sergeev:
Der Antrag ist nicht eindeutig. Wenn der Auftrag geöffnet wurde, wird die Öffnungszeit gespeichert. Warum brauchen Sie die Antwortzeit des Servers?

Das Schicksal der Bestellung wird über das Ticket verfolgt, richtig? Die Rückgabe des Tickets durch die Funktion OrderSend() ist jedoch keine Garantie für die erfolgreiche Ausführung des Handelsvorgangs. Nach der Logik des Programms reicht es aus, zu prüfen, ob mein Ticket unter den historischen Bestellungen auftaucht und welche Geschäfte nach seiner Aufgabe getätigt wurden. Zu diesem Zweck möchte ich die Mindestmenge an Historie in den Historien-Cache hochladen - d.h. ab dem Zeitpunkt der Antwort des Servers auf die erste Anfrage und nicht mehr. Wir müssen nicht mit den Eigenschaften eines offenen Auftrags arbeiten - das wäre überflüssiger Code. Es kann sein, dass die Bestellung gar nicht geöffnet wird. Daher wird die Antwortzeit des Servers benötigt, um die optimale Größe (Menge) eines neuen Verlaufs unter Verwendung der Funktion HistorySelect() herunterzuladen. Ist es also klar, dass man einen Auftrag aus der Geschichte herausnimmt?

Soweit ich weiß, wurde die Frage der Einführung eines zusätzlichen Zeitfeldes in die MqlTradeResult-Struktur noch nicht gestellt.

 

Unter Sleep() habe ich verstanden, dass die Thread-Verzögerung des Expert Advisors keinen Einfluss auf die Ausführung anderer Programme hat. Danke.

 

Noch eine Frage zu Sleep(). Der Kommentar besagt: "Sie können die Funktion Sleep() nicht von benutzerdefinierten Indikatoren aus aufrufen, dadie Indikatoren im Schnittstellen-Thread ausgeführt werden und dieser dadurch nicht verlangsamt werden sollte". Ich habe das Forum gelesen, verstehe aber immer noch Folgendes nicht: Die Formulierung "Sie können es nicht aus Indikatoren aufrufen" - ist das ein vorgegebenes Verbot oder eine Empfehlung an den Programmierer?

 
Yedelkin:

Das Schicksal der Bestellung wird über das Ticket verfolgt, richtig? Die Rückgabe des OrderSend() -Tickets ist jedoch keine Garantie für die erfolgreiche Ausführung des Geschäfts.

ahem.... Sie sollten in einem Lehrbuch nachlesen, wie man eine Bestellung aufgibt.
 
Yedelkin:

Noch eine Frage zu Sleep(). Der Kommentar besagt: "Sie können die Funktion Sleep() nicht von benutzerdefinierten Indikatoren aus aufrufen, dadie Indikatoren im Schnittstellen-Thread ausgeführt werden und dieser dadurch nicht verlangsamt werden sollte". Ich habe das Forum gelesen, verstehe aber immer noch Folgendes nicht: Die Formulierung "Sie können es nicht aus Indikatoren aufrufen" - ist das ein vorgegebenes Verbot oder eine Empfehlung an den Programmierer?

verbieten
 
sergeev:
xxm.... Sie sollten in einem Lehrbuch nachlesen, wie man eine Bestellung aufgibt.

Nun, Sie verstehen schon. Ich sage Ihnen ganz genau, dass Sie das überprüfen können: Die Funktion OrderSend() gibt einen booleschen Wert zurück. In diesem Fall wird, wenn die Anfrage erfolgreich geprüft wurde, das Auftragsticket in eine Variable der Struktur MqlResult geschrieben. Ich nenne es für mich "Rückkehr der Bestellscheinfunktion". Hier ist der Link zur Quelle:"Wenn Sie eine Kaufanfrage mit der Funktion OrderSend() senden, können Sie sofort das Ticket der erstellten Bestellung sehen, wenn die Anfrage erfolgreich geprüft wurde.

Für die Antwort zum Thema "Verbot" - danke, ich habe verstanden.

 
Yedelkin:

Nun, Sie verstehen schon.

Leider habe ich es immer noch nicht verstanden.

Sie benötigen aus irgendeinem Grund ein Zeitfeld in der Rückgabestruktur. Verwenden Sie die Zeit in der Reihenfolge, in der sie erscheint. Das reicht aus, um eine kleine Geschichte zu kontrollieren.