Diskussion zum Artikel "Universal Expert Advisor: Das Event-Modell und der Trading-Strategie Prototyp (Part 2)"
Auf geht's in die Unwegsamkeiten der Automatisierung von Handelssystemen, die Qualen der Kreativität und die Nachlässigkeit der Entwickler bei der " Trading Engine"!
Vielen Dank an den Autor für den informativen Artikel, aber ich habe einige Zweifel an der Zuverlässigkeit der Software-Implementierung.
In dem von Ihnen vorgeschlagenen Code beziehen sich alle Event-Handler-Funktionen auf die gemeinsame Variable event_type oder auf die Struktur m_event in einer gemeinsamen Instanz von CStrategy.
Dies kann jedoch gefährlich sein, da Ereignisse asynchron auftreten und sich die Threads ihrer Handler zeitlich überschneiden können, wodurch gemeinsame Daten chaotisch verändert werden oder beim Zugriff auf dieselben Speicherbereiche Fehler verursacht werden.
Normalerweise wird die Synchronisation von Threads mit Hilfe von Semaphoren, Mutexen, Wait-Funktionen, kritischen Codeabschnitten usw. durchgeführt, aber MQL hat keine derartigen Mittel, so dass es offensichtlich ist, dass es in den Funktions-Handlern von asynchronen Ereignissen notwendig ist, Referenzen auf globale Instanzen von Objekten und Variablen zu minimieren und zu versuchen, lokale zu verwenden.
Auf dieser Grundlage ist der im Artikel vorgeschlagene kombinierte Ereignis-Handler und Datenblock IMHO keine gute Idee.
Vielen Dank an den Autor. Das Material des Artikels ist äußerst nützlich und auch hervorragend präsentiert. Ich wollte schon lange meine Ansätze zum fachkundigen Schreiben in Ordnung bringen, und hier hat der Autor des Artikels bereits alle Mühen der Kreativität auf sich genommen und bietet eine fertige Lösung an. Super! Ich freue mich schon auf die Fortsetzung.
Auf geht's in die Unwegsamkeiten der Automatisierung von Handelssystemen, die Qualen der Kreativität und die Nachlässigkeit der Entwickler bei der "Trading Engine"!
Ich danke Ihnen!
Vielen Dank an den Autor für den informativen Artikel, aber ich habe einige Zweifel an der Zuverlässigkeit der Software-Implementierung.
In dem von Ihnen vorgeschlagenen Code beziehen sich alle Event-Handler-Funktionen auf die gemeinsame Variable event_type oder auf die Struktur m_event in einer gemeinsamen Instanz von CStrategy.
Dies kann jedoch gefährlich sein, da Ereignisse asynchron auftreten und sich die Threads ihrer Handler zeitlich überschneiden können, wodurch gemeinsame Daten chaotisch verändert oder Fehler beim Zugriff auf dieselben Speicherbereiche verursacht werden.
...
Danke für den interessanten Hinweis. In der Tat sind die Ereignisse im MetaTrader asynchron. Die Ausführung von Benutzer-Threads ist jedoch streng sequentiell. Das bedeutet, dass andere Ereignisse erst dann verarbeitet werden, wenn der Expert Advisor die Verarbeitung des aktuellen Ereignisses abgeschlossen hat. Der folgende Code veranschaulicht diesen Punkt:
//+------------------------------------------------------------------+ //|TestAsynch.mq5 | //|Copyright 2015, Vasiliy Sokolov. | //|http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Vasiliy Sokolov." #property link "http://www.mql5.com" #property version "1.00" bool need_check = true; #define EVENT_CHECK_ASYNCH 1 //+------------------------------------------------------------------+ //| Experten-Tick-Funktion| //+------------------------------------------------------------------+ void OnTick() { //--- if(need_check) { EventChartCustom(ChartID(), EVENT_CHECK_ASYNCH, 0.0, 0.0, "Asynchronitätsprüfung"); } if(need_check) printf("Der Benutzer-Thread wird zuerst beendet."); } //+------------------------------------------------------------------+ //| ChartEvent-Funktion| //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id == CHARTEVENT_CUSTOM+EVENT_CHECK_ASYNCH && need_check) { printf("Dann wird das OnChartEvent-Ereignis aufgerufen."); need_check = false; } } //+------------------------------------------------------------------+
Seine Ausführung erzeugt Zeilen in der folgenden Reihenfolge:
2016.01.15 13:51:31.724 TestAsynch (NZDUSD,W1) Потом вызывается событие OnChartEvent 2016.01.15 13:51:31.722 TestAsynch (NZDUSD,W1) Сначала завершается пользовательский поток
Es gibt also keine Fehler, die durch die gemeinsame Änderung der gemeinsamen Variablen m_event verursacht werden, da der Code sequentiell ausgeführt wird. Ich sollte auch darauf hinweisen, dass die Struktur selbst privat ist und nur durch Verweis auf spezielle Methoden zugänglich ist. Daher spielt ihre tatsächliche Position innerhalb von CStrategy keine Rolle, die Struktur kann problemlos direkt in Ereignisbehandlungsmethoden erstellt und auch an Strategieinstanzen übergeben werden.
Ich danke Ihnen!
Danke für die interessante Beobachtung. In der Tat sind die Ereignisse im MetaTrader asynchron. Die Ausführung von Benutzer-Threads ist jedoch streng sequentiell. Das bedeutet, dass andere Ereignisse erst dann verarbeitet werden, wenn der Expert Advisor die Verarbeitung des aktuellen Ereignisses abgeschlossen hat. Der folgende Code veranschaulicht diesen Punkt:
Seine Ausführung erzeugt Zeilen in der folgenden Reihenfolge:
Es gibt also keine Fehler, die durch die gemeinsame Änderung der gemeinsamen Variablen m_event verursacht werden, da der Code sequentiell ausgeführt wird. Ich sollte auch darauf hinweisen, dass die Struktur selbst privat ist und nur durch Verweis auf spezielle Methoden zugänglich ist. Daher spielt ihre tatsächliche Position innerhalb von CStrategy keine Rolle, die Struktur kann problemlos direkt in Ereignisbehandlungsmethoden erstellt und auch an Strategieinstanzen übergeben werden.
Sie haben Recht, die streng sequentielle Ausführung von Event-Handlern kann Fehler beseitigen, aber dies ist im Wesentlichen ein Single-Thread-Modus, in dem es schwierig ist, eine hohe Leistung zu erzielen.
Gleichzeitig gibt es zeitkritische Aufgaben, die eine Parallelisierung erfordern, z. B. Berechnungen mit großen Mengen von Kurs- und historischen Daten, die mit OpenCL durchgeführt werden, oder spezifischere Aufgaben, die für mich relevant sind - das Training neuronaler Netze auf verschiedenen Symbolen und Perioden, das mit Hilfe der in meinem Artikel beschriebenen Multithreading-Engine durchgeführt wird.
https://www.mql5.com/de/articles/706
- 2013.08.29
- Ivan Negreshniy
- www.mql5.com
Sie haben Recht, eine streng sequentielle Ausführung von Event-Handlern kann Fehler beseitigen, aber dies ist im Wesentlichen ein Single-Thread-Modus, in dem es schwierig ist, eine hohe Leistung zu erzielen.
Gleichzeitig gibt es zeitkritische Aufgaben, die eine Parallelisierung erfordern, z. B. Berechnungen mit großen Mengen an Kurs- und historischen Daten, die mit OpenCL durchgeführt werden, oder spezifischere Aufgaben, die für mich relevant sind - das Training neuronaler Netze durch verschiedene Symbole und Zeiträume, das mit Hilfe der in meinem Artikel beschriebenen Multithreading-Engine durchgeführt wird.
https://www.mql5.com/de/articles/706.
Die Parallelisierung in MetaTrader erfolgt durch den Multithreading-Strategie-Tester. Wenn Sie also eine Strategie, die mit Hilfe der beschriebenen Engine geschrieben wurde, im Strategietester ausführen, wird sie automatisch multithreadingfähig. Da es keine Drittanbieter-Dlls gibt, können Sie MQL Networl Cloud in vollem Umfang nutzen. Was Sie schreiben, bezieht sich auf den MetaTrader selbst. Ja, die Engine, wie auch jeder Expert Advisor oder jedes Skript in MetaTrader, ist single-threaded, aber der Optimierer ermöglicht es Ihnen, Multithreading und Cloud Computing des dargestellten Codes durchzuführen.
Was die Leistung der Engine selbst betrifft, so ist hier alles in Ordnung. Sie können sich davon überzeugen, indem Sie ein Profiling durchführen. Die Kosten für Infrastruktur und Ereignisbereitstellung sind minimal. Die Hauptausführungszeit konzentriert sich auf die Aufrufe von Systemfunktionen und benutzerdefinierten Methoden BuyInit, SellInit, BuySupport, SellSupport. Basierend auf Profiling-Berechnungen ist die Engine in der Lage, viele Dutzend Ereignisse pro Sekunde zu verarbeiten und sie mühelos an mehrere Strategien gleichzeitig weiterzuleiten.
Was in diesem Artikel angeboten wird, ist - ich bitte um Entschuldigung - keine Schuldzuweisung. Es handelt sich um eine verifizierte und seit mehreren Jahren getestete Lösung. Alle Aufrufe und internen Verfahren sind optimal und wichtig. Die Algorithmen werden im Profiler getestet. Es gibt keine Einschränkungen bei der internen Organisation des Anwendercodes. Im Allgemeinen gibt es alles, was man braucht, um glücklich zu sein. Nehmen Sie es und benutzen Sie es.
Der Artikel ist klar formuliert und sehr nützlich, zumindest für MQL-Anfänger, die ich bin. :)
Bitte beantworten Sie die folgende Frage:
In meinen Handelsalgorithmen werden Positionen durch Marktaufträge vom Typ Kauf/Verkaufin besonderen Situationen eröffnet - wenn der Preis das entsprechende Niveau bereits überschritten hat oder vor Ende der Handelssitzung.
Im Allgemeinen werden Positionen bei Auf-/Abbruch des Niveaus (für Long) durch die Platzierung von BuyStop/SelStop-Stop-Orders geöffnet/geschlossen, die zu Beginn eines neuen Balkens neu berechnet werden.
Könnten Sie bitte vorschlagen, wie es möglich wäre, die Platzierung und Änderung von Stop-Orders in den beschriebenen Klassen einzuführen?
Vielen Dank an Vasiliy Sokolov für seine Bemühungen, guten Programmierstil im Allgemeinen und OOP im Besonderen zu fördern.
Der Artikel ist klar formuliert und sehr nützlich, zumindest für MQL-Anfänger, die ich bin. :)
Bitte beantworten Sie die folgende Frage:
In meinen Handelsalgorithmen werden Positionen durch Marktaufträge vom Typ Kauf/Verkaufin besonderen Situationen eröffnet - wenn der Preis das entsprechende Niveau bereits überschritten hat oder vor Ende der Handelssitzung.
Im Allgemeinen werden Positionen bei Auf-/Abbruch des Niveaus (für Long) durch die Platzierung von BuyStop/SelStop-Stop-Orders geöffnet/geschlossen, die zu Beginn eines neuen Balkens neu berechnet werden.
Könnten Sie mir bitte vorschlagen, wie ich die Platzierung und Änderung von Stop-Orders in den beschriebenen Klassen einführen könnte?
Ich grüße Sie. Im Moment werden Algorithmen für die Verwaltung von Pending Orders ausgearbeitet, aber es gibt noch keine konkrete Implementierung in der aktuellen Version der Engine. Das Einzige, was ich im Moment vorschlagen kann, ist, den Code für die Platzierung von Pending Orders in den BuyInit- und SellInit-Methoden unterzubringen. Es ist auch notwendig, die Pending Orders dort aufzuzählen und all jene Aktionen, die normalerweise in regulären Expert Advisors durchgeführt werden müssen.
Für die Zukunft ist geplant, der Engine Methoden zur Verarbeitung von Pending Orders hinzuzufügen und diese entsprechend zu beschreiben. Sie werden ähnlich wie die Methoden zur Positionsverwaltung funktionieren.
Grüße. Im Moment werden Algorithmen für die Verwaltung von Pending Orders ausgearbeitet, aber es gibt keine konkrete Implementierung in der aktuellen Version der Engine. Das Einzige, was ich im Moment vorschlagen kann, ist, den Code für die Platzierung von Pending Orders in BuyInit- und SellInit-Methoden zu platzieren. Es ist auch notwendig, die ausstehenden Aufträge dort aufzuzählen und all die Aktionen, die normalerweise in regulären Expert Advisors durchgeführt werden müssen.
Für die Zukunft ist geplant, der Engine Methoden zur Verarbeitung von Pending Orders hinzuzufügen und diese entsprechend zu beschreiben. Sie werden ähnlich wie die Methoden des Positionsmanagements funktionieren.
danke
*****
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Universal Expert Advisor: Das Event-Modell und der Trading-Strategie Prototyp (Part 2) :
Autor: Vasiliy Sokolov