Organisation des Auftragszyklus

 
Kommentare, die sich nicht auf "mql4 language features, intricacies and tricks" beziehen, wurden in dieses Thema verschoben.
 

Fortsetzung des Themas der Einführung von MQL5-Bibliotheken unter MT4

#property strict

// https://www.mql5.com/ru/docs/standardlibrary/graphics/cgraphic
#include <Graphics\Graphic.mqh> // MQL5\Include\Graphics\Graphic.mqh

void OnStart()
{
  double Y[] = {1, 2};
  
  GraphPlot(Y);
}
 

Wenn der Geschwindigkeitsregler im Tester auf 31 eingestellt ist, ist der Test oft langsam, wenn er auf 32 eingestellt ist, eilt er mit Supergeschwindigkeit zu seinem Ende.

Ich kann das Problem umgehen, indem ich eine Verzögerung durch den Zähler in den Code einfüge:

input int gDelay = 10000;        // Счетчик для задержки, off=0

void OnTick()
{
  int delayCount = 0;
  while(delayCount < gDelay) ++delayCount;
}

Die Verzögerung über den Eingang kann in Abhängigkeit von der Geschwindigkeit des EA und der Prozessorleistung eingestellt werden.

Mit Tempo 32 kann ich mich nun in einer Geschwindigkeit, die mir passt, zu den interessanten Punkten bewegen.

 

Im Folgenden werden wir ein Thema ansprechen, das nicht nur MT4, sondern auch MT5 mit anderen Plattformen betrifft. Aber die Logik wird in MQL4 geschrieben, um die Wahrnehmung zu erleichtern, also in diesem Zweig.


Meistens läuft das Rückgrat (das Fleisch eines Auftrags) der Auftragsänderung/-löschung auf die folgende Logik hinaus

// Самый распространенный костяк логики модификации ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    OrderModify(OrderTicket(), Price, SL, TP, OrderExpiration());


Jetzt ist der Ansatz selten, aber viel richtiger

// Редкий, но правильный костяк модификации ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    if (OrderModify(OrderTicket(), Price, SL, TP, OrderExpiration()))     
    {
      i = OrdersTotal(); // Хотя бы так
      
      // А лучше так
//      OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }


Nach dem Senden eines Handelsauftrags ändert sich die Handelsumgebung, so dass es ratsam ist, die gesamte Handelslogik des TS unmittelbar nach der Antwort des Handelsservers von Grund auf neu auszuführen.

 
fxsaber:

Jetzt ist der Ansatz selten, aber viel korrekter

Bei dieser Variante wird der letzte Auftrag in der Liste bei jedem Fehler geändert, und der Expert Advisor, der mehr als einen Auftrag hat, "verliert" alle anderen aus den Augen.

Mein Rezept: Schleife durch alle seine Aufträge, Verarbeitung jeder von ihnen (Aktualisierung der Marktinformationen vor der Verarbeitung, falls erforderlich), und auf dem nächsten Tick, der nächste Ansatz. In einigen Fällen kann der nächste Ansatz (OnTick-Aufruf) unmittelbar nach Beendigung der aktuellen Schleife erfolgen, wenn darin Fehler aufgetreten sind.

 
Andrey Khatimlianskii:

Bei dieser Option wird im Falle eines Fehlers der letzte Auftrag in der Liste in einer Schleife geändert, und ein EA mit mehr als einem Auftrag "verliert" alle anderen aus den Augen.

Aufgrund dieser Bedingung wird es keine Schleifen geben

if (OrderModify(OrderTicket(), Price, SL, TP, OrderExpiration()))

Mein Rezept: Gehen Sie alle Ihre Aufträge in einer Schleife durch, bearbeiten Sie jeden einzelnen (aktualisieren Sie gegebenenfalls die Marktinformationen, bevor Sie sie bearbeiten) und gehen Sie beim nächsten Tick den nächsten Weg. In einigen Fällen kann der nächste Ansatz (OnTick-Aufruf) direkt nach dem Ende der aktuellen Schleife erfolgen, wenn in dieser Fehler aufgetreten sind.

Im Terminalprotokoll sind dann weitere Fehler bei Handelsanfragen zu sehen.

 
fxsaber:

Aufgrund dieser Bedingung wird es keine Schleifen geben

Ja, falsch, lesen Sie es als !OrderModify.

Wenn die Änderung erfolgreich ist, kann die Bearbeitung auch nicht vom Anfang der Liste aus wiederholt werden, da in diesem Fall ein Auftrag ebenfalls geändert wird (z. B. hinter dem Preis nach oben gezogen) und die anderen möglicherweise lange Zeit unbeaufsichtigt bleiben.

Mein Rezept ist immer noch gültig.


fxsaber:

Dann werden im Terminalprotokoll weitere Fehler bei Handelsanfragen angezeigt.

Das habe ich nicht verstanden.

 
Andrey Khatimlianskii:

Wenn die Änderung erfolgreich ist, kann die Bearbeitung auch nicht vom Anfang der Liste aus wiederholt werden, da in diesem Fall ein Auftrag ebenfalls geändert wird (z. B. nach oben hinter den Preis ziehen) und die anderen möglicherweise lange Zeit unbeaufsichtigt bleiben.

In dieser Logik ist von Anfang an etwas falsch. Wir müssen eine bewusste Entscheidung treffen: Es ist besser, einen tatsächlichen Auftrag zu haben oder viele irrelevante.

Mein Rezept ist noch gültig.

Ich habe das nicht verstanden.

Lassen Sie die OrderModify 5 Sekunden lang laufen. Ein Teil-Limit-Auftrag wird während seiner Ausführungszeit mehrmals auf dem Handelsserver ausgeführt, wodurch ein Dutzend Abschlüsse entstehen.

 
fxsaber:

Irgendetwas an dieser Logik ist von Anfang an falsch. Sie müssen eine bewusste Entscheidung treffen: Lieber einen tatsächlichen Auftrag oder viele irrelevante Aufträge.

Ein Auftrag kann sich nicht gleichzeitig auf verschiedenen Ebenen befinden. Oder sollten wir für jede Stufe einen anderen EA haben? Dies ist eine fragwürdige Lösung für die große Mehrheit der Strategien.

Als Sonderfall mehrere Positionen (gewonnen durch Trend mit mehreren Einstiegen) und ein Trailing-Stop für diese. Ziehen Sie den SL von nur einem Handel ab oder ändern Sie alle? Bei einer starken Bewegung mit einem ebenso starken anschließenden Rollback verliert die Option, nur einen Auftrag zu ändern, sehr viel (und wir kommen nicht zum Rest, weil jeder neue Aufruf von OnTick den allerersten Auftrag in der Liste ändert).


fxsaber:

Lassen Sie OrderModify 5 Sekunden lang laufen. Nehmen wir an, dass ein Teil-Limit-Auftrag während seiner Ausführung mehrere Male auf dem Handelsserver ausgeführt wurde und dabei ein Dutzend Geschäfte generiert hat.

Nehmen wir an, dass. Wir verarbeiten alle Aufträge, die ausgeführt wurden (und ausgeführt werden sollten), und gehen beim nächsten Tick oder direkt nach dem ersten Zyklus zu den neuen über.

Andernfalls riskieren wir immer, mit einem - dem letzten - ausgeführten Teil eines letzten Auftrags zu arbeiten. Vielleicht der kleinste Teil. Einen großen Auftrag unbeaufsichtigt zu lassen.

 
Andrey Khatimlianskii:

Ein Auftrag kann sich nicht gleichzeitig auf verschiedenen Ebenen befinden. Oder sollten wir für jede Stufe einen anderen EA haben? Dies ist eine fragwürdige Lösung für die große Mehrheit der Strategien.

Als Sonderfall mehrere Positionen (gewonnen durch Trend mit mehreren Einstiegen) und ein Trailing-Stop für diese. Ziehen Sie den SL von nur einem Handel ab oder ändern Sie alle? Wenn wir eine starke Bewegung mit einem ebenso starken anschließenden Pullback haben, würde die Option, nur eine Order zu ändern, viel verlieren (und wir werden den Rest nicht erreichen, weil jeder neue Aufruf von OnTick die allererste Order in der Liste ändert).

Ich verstehe nicht, warum OnTick nur einen Auftrag ändern würde? Sie werden alle geändert.

Sagen wir. Wir bearbeiten alle Aufträge, die bearbeitet wurden (und bearbeitet werden sollten), und gehen beim nächsten Tick oder unmittelbar nach dem ersten Zyklus zu den neuen Aufträgen über.

Andernfalls laufen wir immer Gefahr, mit einem - dem letzten - ausgeführten Teil eines letzten Auftrags zu arbeiten. Vielleicht der kleinste Teil. Einen großen Auftrag unbeaufsichtigt zu lassen.

Ich weise auf das Wort "Rückgrat" hin. Das Fleisch in Form einer Losprioritätenauswahl oder etwas anderem kann immer aufgebaut werden. Die Kernlogik hingegen bleibt dieselbe: Nach einem erfolgreichen Handelsauftrag wird die gesamte Handelslogik von Grund auf neu ausgeführt.

 
fxsaber:

Ich verstehe nicht, warum OnTick nur einen Auftrag ändert? Alle werden geändert.

Denn der Preis wird sich bewegen, und bei jedem neuen Aufruf von OnTick wird die Bedingung für eine neue Änderung der gleichen, in der Liste an erster Stelle stehenden, Reihenfolge erfüllt sein. Vor allem, wenn die Änderung nur 5 Sekunden dauert ;)


fxsaber:

Beachten Sie das Wort "Rückgrat". Das Fleisch in Form von Losprioritäten oder etwas anderem kann immer hinzugefügt werden. Die Kernlogik hingegen bleibt dieselbe: Nach einem erfolgreichen Handelsauftrag wird die gesamte Handelslogik von Grund auf neu ausgeführt.

Ein solches "Backbone" würde die Logik eines EA, der mit mehr als einem Auftrag arbeitet, durchbrechen.
Was nützt es, wenn es den Systemen mit einer Ordnung keinen Vorteil bringt und die anderen stört?

Die Sortierung nach Volumen und/oder Entfernung vom Preis vor der Bearbeitung von Aufträgen ist eine gute Lösung. Wir sollten aber nicht davon ausgehen, dass jeder, der den Code aus dem Forum kopiert, ihn auch umsetzt.
In diesem Sinne ist mein Code sicherer.