MT5 und Geschwindigkeit in Aktion

 

Der MT5 ist eine wendige Plattform. Es gibt jedoch Engpässe, die alle Bemühungen um einen schnellen Handel zunichte machen.

Ich möchte die Probleme hier sammeln, diskutieren und lösen, irgendwo mit meinen eigenen Bemühungen, irgendwo mit der Hilfe der Entwickler.

 

GeschichteAuswählen.


Dies ist eine wahnsinnig teure Funktion. Und leider kann keine noch so gute Zwischenspeicherung die Geschwindigkeit akzeptabel machen.


Bei EAs für Schlachtfelder ist es zum Beispiel wichtig, mit aktuellen Daten zu arbeiten. Insbesondere, dass die Ticks von Market Watch und CopyTicks möglichst nicht veraltet sind.

Dazu gibt es zwar nicht sehr gute, aber erzwungene Mechanismen zur Überprüfung der Relevanz aktueller Preisdaten. Ein Teil dieses Mechanismus besteht darin, Situationen zu erkennen, in denen ein Handel mit einem Symbol später als der letzte Tick stattgefunden hat. Das passiert nicht selten, deshalb ist es wichtig zu wissen, ob der aktuelle Tick noch aktuell ist oder nicht.


Für diese Erkennung müssen Sie auf die Historie der letzten Geschäfte zugreifen können. Dies geschieht mit Hilfe von HistorySelect auf die folgende schematische Weise.

void OnTick()
{
  MqlTick Tick;

  if (SymbolInfo(_Symbol, Tick) && HistorySelect(Tick.time, INT_MAX)) // Взяли история торгов со времени текущего тика.
    // Проверяем актуальность тика через сравнение Tick.time_msc и DEAL_TIME_MSC.
}


Leider dauert ein solcher Aufruf von HistorySelect 5-30 Millisekunden (ich habe es selbst in Release-EX5 gemessen). Wenn der Expert Advisor mehrere solcher Aktualisierungen in OnTick durchführt (auf eine gute Art und Weise, es sollte nach jeder Pause gemacht werden. Zum Beispiel nach jedem OrderSend.), dann wird alles wahnsinnig teuer/lang. HistorySelect kann insgesamt mehrere Sekunden in einem einzigen OnTick verbrauchen.


Liebe Entwickler, warum ist es so teuer? Diese Funktion kann bei richtiger Implementierung sofort ausgeführt werden.


Bitte denken Sie über die Einführung solcher Funktionen für die Arbeit mit der Geschichte nach.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

Sie würden die HistorySelect-Bremsen vollständig schließen. Denn es würde das Problem lösen, die neuesten Angebote sehr billig zu bekommen. Im Moment ist es eine einzige Quälerei bei der Kampfausführung.


Da es nicht immer möglich ist, die letzten Geschäfte über OnTradeTransaction zu kontrollieren, ist eine schnelle Arbeit mit der Historie dringend erforderlich.

 

Zugriff auf ChartEvent- und TradeTransaction-Ereignisse.


Es wurde eine Idee und eine der möglichen Umsetzungen vorgeschlagen. Deshalb kopiere ich sie hier einfach.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Irrtümer, Fragen

Sergey Dzyublik, 2020.05.20 00:47

Anregung an die Entwickler.
Bitte erwägen Sie, in MQL eine Funktion hinzuzufügen, die es den Benutzern ermöglicht, die Verarbeitung der angesammelten "Nachrichten" in OnChartEvent unabhängig vom eigenen Code aufzurufen.
1) Dies würde es ermöglichen, OnChartEvent zwischen den Iterationen einer zeitaufwändigen Berechnung aufzurufen, wodurch die Benutzer-GUI zumindest einigermaßen reaktionsschnell wäre, ohne einen Gemüsegarten aus Task-Pool, Datentransfer, Zustandssynchronisation, Kontextspeicherung und -wiederherstellung zu errichten...
2) Dies würde die Verwendung von OnChartEvent in Skripten ermöglichen.

Danke.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Ilyas, 2020.05.20 09:09

Schlagen Sie vor, die Funktion GetNextEvent hinzuzufügen?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Sergey Dzyublik, 2020.05.20 13:39

Nicht ganz, ich würde diese Funktion eher als HandleNextEvent bezeichnen, eine mögliche Signatur:

bool HandleNextEvent (ENUM_EVENT_TYPE);


Beim Aufruf wird, ähnlich wie bei GetNextEvent, geprüft, ob der angegebene ENUM_EVENT_TYPE in der Warteschlange vorhanden ist,
, und wenn dieses Ereignis vorhanden ist, wird die Kontrolle automatisch an den Benutzercode des entsprechenden Handlers (OnChartEvent, OnTrade, OnTradeTransaction, ...) übergeben. (Dankan fxsaber für die Ergänzung)).
Gibt true zurück, wenn sich ein Ereignis in der Warteschlange befand, andernfalls false.


Möglicher Anwendungsfall:

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Irrtümer, Fragen

Sergey Dzyublik, 2020.05.20 14:38

2) Das ist richtig. Wenn ich an der Verarbeitung eines bestimmten Ereignisses interessiert bin und nicht an allen Ereignissen im System, wäre es schön, wenn ich nur diese Art von Ereignissen verarbeiten könnte und die Verarbeitung der anderen Ereignisse im üblichen Modus belassen könnte.
3) Wenn HandleNextEvent während der Verarbeitung erneut aufgerufen wird - aufrufen und verarbeiten. Das einzige, was passieren kann, ist ein Stapelüberlauf, aber das ist das Problem des Benutzers und des Codes, nicht das des Entwicklers.
4) Ereignisse, die nicht unter den Filter fallen, bleiben in der gleichen Reihenfolge und werden aufgerufen, wenn der Benutzer die Kontrolle an das System zurückgibt, wie üblich.


Jetzt müssen wir Krücken machen, um zu den gleichen TradeTransaction-Ereignissen innerhalb des laufenden Codes zu gelangen.

Expert Advisors benötigen diese Funktion unbedingt für die Kampfanwendung.

 
fxsaber:

Da esnicht immer möglich ist, die jüngsten Transaktionen über OnTradeTransactionzu überwachen , ist eine schnelle Arbeit mit der Historie von Bedeutung.

Nennen Sie bitte ein Beispiel, wann eine Kontrolle nicht möglich ist?

 
prostotrader:

Nennen Sie mir bitte ein Beispiel, bei dem es keine Kontrolle gibt?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

fxsaber, 2020.04.23 19:51

Die Öffnungs-/Schließungspfeile, die MT5 automatisch in Echtzeit platziert, basieren auf TradeTransaction-Ereignissen.


Ich habe gerade gesehen, dass diese Ereignisse (Öffnen und Schließen von etwa einem Dutzend Positionen) wegen einer kurzzeitigen Unterbrechung der Verbindung nicht zum Terminal gelangt sind - es war so zufällig, dass ich an meinem PC saß und sie aus erster Hand gesehen habe. Folglich gibt es keine entsprechenden Pfeile.


Und, wie hier schon manchmal gesagt wurde, kann man sich bei Kampf-EAs nicht auf OnTradeTransaction verlassen. Schade, dass es keinen zuverlässigen öffentlichen Mechanismus für den Umgang mit OrderSendAsync gibt.


Und auch wenn mehrere OrderSend im Code platziert sind. Wenn ein OrderSend von dem vorherigen abhängt.

 
fxsaber:

Auch beim Platzieren mehrerer OrderSend innerhalb des Codes. Wenn ein OrderSend von dem vorherigen OrderSend abhängt.

Wenn die Kommunikation unterbrochen wird, wird auch nichts in die Historie aufgenommen!

Ich verwendeOrderSendAsync seit über 5 Jahren(damals gab es Probleme mit OrderSend) + OnTradeTransaction() nur im Kampfmodus - keine Probleme!

Wenn es eine Unterbrechung der Verbindung gibt, wird diese vom Assistenten festgestellt, der jedem Auftrag zugeordnet ist (bei FOREX ist das schwierig, weil die Symbolnamen nicht standardisiert sind).

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
prostotrader:

Wenn die Kommunikation unterbrochen wird, wird auch nichts in die Historie aufgenommen!

Ich verwendeOrderSendAsync seit über 5 Jahren(damals gab es Probleme mit OrderSend) + OnTradeTransaction() nur im Kampfmodus - keine Probleme!

Es ist nicht zu übersehen, dass Sie sich seit Jahren an Async+OnTrade die Zähne ausbeißen. Die Datenaktualisierung erfolgt über diesen Mechanismus, und alles andere ist kein Problem.

Bitte sagen Sie hier nicht "Sie können einfach nicht kochen".

 
fxsaber:

Man kann nicht umhin zu bemerken, dass Sie seit Jahren auf Async+OnTrade drängen. Sie können über diesen Mechanismus auch Daten aktualisieren und alles andere, weil es kein Problem gibt.

Bitte behaupten Sie zumindest hier nicht, dass Sie nicht kochen können.

Sie "kämpfen" um Mikrosekunden und schreiben gleichzeitig Unmengen von Code, was ebenfalls Zeit kostet,

und in 99 % der Fälle braucht man sie nicht.

 
Ich möchte Sie ermutigen, sich nur in konstruktiver Weise zu äußern.
 
fxsaber:

Zugriff auf ChartEvent- und TradeTransaction-Ereignisse.

Es wurde eine Idee und eine der möglichen Umsetzungen vorgeschlagen. Deshalb kopiere ich es einfach hierher.

Um nun Zugriff auf diese TradeTransaction-Ereignisse innerhalb des laufenden Codes zu erhalten, müssen wir auf Krücken zurück greifen.

Sie machen Krücken in eine falsche Richtung:

Lassen Sie in OnXXX-Funktionen nur das Kopieren von Ereignissen (Parametern) in der Warteschlange und den Aufruf der Hauptfunktion OnMain. Verschieben Sie den gesamten Code in die duplizierten On2XX-Funktionen. Und rufen Sie diese sich duplizierenden On2XX-Funktionen von OnMain aus in der von Ihnen benötigten Reihenfolge auf, wobei Sie ihnen wiederum die Daten aus den Warteschlangen als Parameter übergeben.

Führen Sie dann Messungen durch und zeigen Sie den Geschwindigkeitszuwachs, und dann können Sie vorschlagen, MMS mit geeigneten Funktionen zu ergänzen. Aber warum etwas hinzufügen, wenn man hier und jetzt schon alles selbst gemacht hat?

 
A100:

Lassen Sie die OnXXX-Funktionen nur Ereignisse (Parameter) in die Warteschlange kopieren und die Hauptfunktion OnMain aufrufen. Verschieben Sie den gesamten Code in doppelte On2XX-Funktionen. Und rufen Sie diese sich duplizierenden On2XX-Funktionen von OnMain aus in der von Ihnen benötigten Reihenfolge auf, wobei Sie ihnen wiederum die Daten aus der Warteschlange als Parameter übergeben.

Bitte geben Sie mir einen rudimentären Schema-Code für diese Idee. Auf den ersten Blick scheint es sich um ein völliges Missverständnis zu handeln.

Während der Ausführung der OnMain-Funktion gibt es keine Möglichkeit, den Zustand der aktuellen echten Warteschlange zu erfahren. Die einzige Abhilfe ist ein Spyware-Programm, wie im Link angegeben.