Diskussion zum Artikel "Entwicklung eines Expertenberaters für mehrere Währungen (Teil 2): Übergang zu virtuellen Positionen von Handelsstrategien"

 

Neuer Artikel Entwicklung eines Expertenberaters für mehrere Währungen (Teil 2): Übergang zu virtuellen Positionen von Handelsstrategien :

Lassen Sie uns mit der Entwicklung eines Multiwährungs-EAs mit mehreren parallel arbeitenden Strategien fortfahren. Versuchen wir, die gesamte mit der Eröffnung von Marktpositionen verbundene Arbeit von der Strategieebene auf die Ebene des EA zu verlagern, der die Strategien verwaltet. Die Strategien selbst werden nur virtuell gehandelt, ohne Marktpositionen zu eröffnen.

Im letzten Artikel haben wir mit der Entwicklung eines Multiwährungs-EAs begonnen, der gleichzeitig mit verschiedenen Handelsstrategien arbeitet. In der ersten Phase gab es nur zwei verschiedene Strategien. Sie stellten die Umsetzung derselben Handelsidee dar und arbeiteten mit demselben Handelsinstrument (Symbol) und Chart-Zeitrahmen (Periode). Sie unterschieden sich nur in den numerischen Werten der Parameter voneinander.

Außerdem haben wir die optimale Größe der offenen Positionen auf der Grundlage des gewünschten maximalen Drawdown-Niveaus (10 % der Einlage) bestimmt. Wir haben dies für jede Strategie separat getan. Als wir die beiden Strategien miteinander kombinierten, mussten wir die Größe der eröffneten Positionen reduzieren, um das vorgegebene Drawdown-Niveau zu halten. Bei zwei Strategien war der Rückgang gering. Was aber, wenn wir Dutzende oder Hunderte von Strategieinstanzen kombinieren wollen? Es kann durchaus vorkommen, dass wir bei einigen Strategien die Positionsgröße auf einen Wert reduzieren müssen, der unter der vom Broker erlaubten Mindestgröße für offene Positionen liegt. In diesem Fall sind diese Strategien einfach nicht in der Lage, am Handel teilzunehmen. Wie können wir sie zum Funktionieren bringen?

Zu diesem Zweck nehmen wir den Strategien das Recht, selbstständig Positionen zu eröffnen und schwebende Aufträge zu erteilen. Die Strategien müssen nur noch virtuell handeln, d. h. sich merken, auf welchen Niveaus Positionen einer bestimmten Größe eröffnet werden sollten, und auf Anfrage melden, welches Volumen jetzt eröffnet werden sollte. Wir eröffnen echte Marktpositionen erst, nachdem wir alle Strategien geprüft und das erforderliche Gesamtvolumen berechnet haben, wobei wir die Skalierung berücksichtigen, um einen bestimmten Drawdown aufrechtzuerhalten.

Uns geht es jetzt nur darum, die Eignung dieses Ansatzes zu prüfen, nicht aber die Effizienz seiner Umsetzung. Daher werden wir im Rahmen dieses Artikels versuchen, zumindest eine funktionierende Implementierung dieses Ansatzes zu entwickeln, die uns später dabei helfen wird, einen aus architektonischer Sicht schöneren Ansatz zu entwickeln, da wir bereits wissen, wie wir Fehler vermeiden können.

Autor: Yuriy Bykov

 

Ich habe ihn noch nicht zu Ende gelesen. Die Eingaben sind ein gutes Beispiel.

1.

input string      symbol_              = "EURGBP";    // Handelsinstrument (Symbol)
input ENUM_TIMEFRAMES  timeframe_       = PERIOD_H1;   // Zeitplan Zeitraum

input group "=== Parameter des Eröffnungssignals"
input int         signalPeriod_        = 13;    // Anzahl der Kerzen für die Volumenmittelung
input double      signalDeviation_     = 0.3;   // Relative Abweichung vom Durchschnitt bei der Eröffnung des ersten Auftrags
input double      signaAddlDeviation_  = 1.0;   // Relative Abweichung vom Durchschnitt für die Eröffnung des zweiten und der folgenden Aufträge

input group "=== Ausstehende Auftragsparameter."
input int         openDistance_        = 0;     // Abstand vom Preis zum schwebenden Auftrag
input double      stopLevel_           = 10500; // Stop Loss (in Punkten)
input double      takeLevel_           = 465;   // Gewinnmitnahme (in Pips)
input int         ordersExpiration_    = 1000;  // Verfallszeit der schwebenden Aufträge (in Minuten)

input group "=== Kapitalverwaltungsoptionen"
input int         maxCountOfOrders_    = 3;     // Max. Anzahl der gleichzeitig geöffneten Aufträge
2.
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));
   expert.Add(new CSimpleVolumesStrategy(
                         symbol_, timeframe_,
                         fixedLot_,
                         signalPeriod_, signalDeviation_, signaAddlDeviation_,
                         openDistance_, stopLevel_, takeLevel_, ordersExpiration_,
                         maxCountOfOrders_)
                     );       // Hinzufügen einer Instanz der Strategie

   return(INIT_SUCCEEDED);
}
3.
class CSimpleVolumesStrategy : public CStrategy {
private:
   //--- Parameter des Öffnungssignals
   int               m_signalPeriod;       // Anzahl der Kerzen für die Volumenmittelung
   double            m_signalDeviation;    // Relative Abweichung vom Durchschnitt bei der Eröffnung des ersten Auftrags
   double            m_signaAddlDeviation; // Relative Abweichung vom Durchschnitt für die Eröffnung des zweiten und der folgenden Aufträge

   //--- Parameter der schwebenden Aufträge
   int               m_openDistance;       // Abstand vom Preis zum schwebenden Auftrag
   double            m_stopLevel;          // Stop Loss (in Punkten)
   double            m_takeLevel;          // Gewinnmitnahme (in Pips)
   int               m_ordersExpiration;   // Verfallszeit der schwebenden Aufträge (in Minuten)

   //--- Parameter für die Kapitalverwaltung
   int               m_maxCountOfOrders;   // Max. Anzahl der gleichzeitig geöffneten Aufträge

4.

public:
   //--- Öffentliche Methoden
   CSimpleVolumesStrategy(
      string           p_symbol,
      ENUM_TIMEFRAMES  p_timeframe,
      double           p_fixedLot,
      int              p_signalPeriod,
      double           p_signalDeviation,
      double           p_signaAddlDeviation,
      int              p_openDistance,
      double           p_stopLevel,
      double           p_takeLevel,
      int              p_ordersExpiration,
      int              p_maxCountOfOrders
   ); 

5-6.

//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy(
   string           p_symbol,
   ENUM_TIMEFRAMES  p_timeframe,
   double           p_fixedLot,
   int              p_signalPeriod,
   double           p_signalDeviation,
   double           p_signaAddlDeviation,
   int              p_openDistance,
   double           p_stopLevel,
   double           p_takeLevel,
   int              p_ordersExpiration,
   int              p_maxCountOfOrders) :
   // Initialisierungsliste
   CStrategy(p_symbol, p_timeframe, p_fixedLot), // Aufruf des Konstruktors der Basisklasse
   m_signalPeriod(p_signalPeriod),
   m_signalDeviation(p_signalDeviation),
   m_signaAddlDeviation(p_signaAddlDeviation),
   m_openDistance(p_openDistance),
   m_stopLevel(p_stopLevel),
   m_takeLevel(p_takeLevel),
   m_ordersExpiration(p_ordersExpiration),
   m_maxCountOfOrders(p_maxCountOfOrders) {
   ArrayResize(m_orders, m_maxCountOfOrders);

   // Laden Sie den Indikator, um Tick-Volumen zu erhalten
   iVolumesHandle = iVolumes(m_symbol, m_timeframe, VOLUME_TICK);

// Einstellen der Größe des Array-Empfängers von Tick-Volumes und der erforderlichen Adressierung
   ArrayResize(volumes, m_signalPeriod);
   ArraySetAsSeries(volumes, true);
}

Jeder Eingabeparameter muss fünf- oder sechsmal vorgeschrieben werden.

 
Сравнивая эти результаты с результатами аналогичного советника, но не использующего виртуальные позиции, можно отметить улучшение некоторых показателей: немного увеличилась прибыль и уменьшилась просадка, подрос коэффициент Шарпа и профит-фактор.
Grob gesagt, von Hedging zu Netting gewechselt und die entsprechende Statistik erhalten. "Verbesserungen". Zum Beispiel Verringerung des Volumens, für das Swaps berechnet wurden.
 

Lesen Sie den Artikel. Dank an den Autor, gute Sondierung, in welche Richtungen wir uns bewegen können.


Нас сейчас будет интересовать только проверка пригодности такого подхода, а не эффективность его реализации. Поэтому в рамках этой статьи мы постараемся написать хотя бы какую-то рабочую реализацию этого подхода, которая в дальнейшем поможет нам построить более красивую с архитектурной точки зрения. Поможет не в том смысле, что мы будем улучшать уже имеющуюся, а в том, что мы сможем понять, что вот так делать не надо, а можно сделать по-другому, и это будет лучше.

Eine aussagekräftige Beobachtung, nach der es keinen Sinn hat, Kritik zu üben, sondern direkt zum konstruktiven Teil übergehen sollte - zum Vorschlagen.


In dem Artikel wird das Konzept des virtuellen Handels erörtert, gefolgt von einer einseitigen Synchronisierung des virtuellen Handels mit dem realen Handel. Als Beispiel für den Tester ist er gut geeignet. Aber nur als Beispiel.

In der Praxis wird ein solches TS-Portfolio aus EX5 erstellt (kostenlos für den Tester) - laufen lassen, tst-Dateien der einzelnen Läufe erhalten, daraus einen gemeinsamen Einzellauf mit beliebigen MM-Regeln erstellen.


Für Tester brauchen Sie Geschwindigkeit. Versuchen Sie abzuschätzen, wie sehr sich die Geschwindigkeit der Optimierung für die Variante mit und ohne Virtualisierung verändert.


Das Konzept selbst ist gut für den realen Handel. Aber für den Synchronisierer müssen Sie die Geschichte des virtuellen Handels aufbewahren. Da gibt es eine Menge Dinge. Eine ernste Sache, um es milde auszudrücken.


Architektonisch wäre die Virtualisierung vom TS losgelöst. Ich habe nur die aktuelle Quelle der Virtualisierung 350 Kb. Und es wird wachsen.


Gehen Sie vorsichtig an die Wahl der Handels-API für den virtuellen Handel heran. Wählen Sie aus den verfügbaren. Es ist logisch, der API den Vorzug zu geben, auf der es so einfach wie möglich ist, den TS zu programmieren. Ich verstehe nicht wirklich die gängige Praxis aller Handelsplattformen, ihr eigenes Fahrrad zu erfinden - die Trading-API. Es mit OOP-Elementen "out of the box" auszustatten, usw. In diesem Sinne ist MQ einen guten Weg gegangen - alle APIs ohne OOP.

 

Bevor ich solche Artikel lese, schaue ich mir immer die Testergebnisse an. Zumindest im Testgerät. Als ich 19% Gewinn für 5 Jahre sah, fühlte ich mich leicht und glücklich! Das ist viel mehr als der Autor von 75 Artikeln über neuronale Netze! ))

Aber jetzt ist es klar, wie man garantiert Geld auf dem Forex zu machen. Ich pflegte zu denken, nur zu lehren, Trottel auf Elliot Wellen, aber es stellt sich heraus, es ist immer noch ein großer Weg )).

 
fxsaber #:

Lesen Sie den Artikel. Vielen Dank an den Autor, guter Einblick in die Richtungen zu gehen.

Vielen Dank für Ihr Interesse und Ihre konstruktiven Kommentare. Ich versuche, sie zu berücksichtigen und sie so weit wie möglich zu nutzen. Ich werde später ausführlicher antworten, im Moment habe ich keine Zeit.

 
Alexey Volchanskiy Testergebnisse an. Zumindest im Testgerät. Als ich 19% Gewinn für 5 Jahre sah, fühlte ich mich leicht und glücklich! Das ist viel mehr als der Autor von 75 Artikeln über neuronale Netze! ))

Aber jetzt ist es klar, wie man garantiert Geld auf dem Forex verdienen kann. Ich pflegte zu denken, nur zu lehren, Trottel auf Elliot Wellen, aber es stellt sich heraus, es ist immer noch ein großer Weg )).

Ich kann nicht widerstehen, hier zu bemerken, dass 19% der Gewinne für fünf Jahre auf den Test wurden durch eine konstante Menge in den Bedingungen der Drawdown weniger als $ 1000, das heißt 1% gemacht. Wenn Sie sich auf einen maximalen Drawdown von sogar 10 % konzentrieren und ein variables Los verwenden, sehen die Ergebnisse noch interessanter aus.

 
//+------------------------------------------------------------------+
//|SimpleVolumesExpertSingle.mq5 |
//|Urheberrecht 2024, Yuriy Bykov |
//| https://www.mql5.com/de/users/antekov |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Yuriy Bykov"
#property link      "https://www.mql5.com/de/articles/14107"
#property description "Die Expert Advisor Pending Order in dem Moment, in dem das Tick-Volumen der Kerze das durchschnittliche Volumen übersteigt".
#property description "in Richtung der aktuellen Kerze".
#property description "Wenn die Aufträge noch nicht zu Positionen geworden sind, werden sie bei Ablauf gelöscht.
#property description "Offene Positionen werden nur bei SL oder TP geschlossen."

#include "Advisor.mqh"
#include "SimpleVolumesStartegy.mqh"

Ein Tippfehler.

 
fxsaber #:

Ein Tippfehler.

Ja, ich habe ihn an mehreren Stellen korrigiert, aber er ist immer noch irgendwo da.

 
fxsaber #:

In der Praxis wird ein solches Portfolio von TS aus EX5 erstellt (kostenlos vom Markt für den Tester) - laufen lassen, tst-Dateien von einzelnen Pässen erhalten, aus ihnen einen gemeinsamen einzelnen Lauf mit beliebigen MM-Regeln machen.

Ich habe diese Option noch nicht in Betracht gezogen, ich werde im Hinterkopf behalten, dass es auch möglich ist. Wenn es mir jedoch gelingt, einen guten Satz vorgefertigter Expert Advisors auf dem Markt zu finden, wie kann ich sie dann zusammen verwenden? Lasse ich einfach den gesamten Satz mit den ausgewählten MM-Parametern laufen?

 
fxsaber #:

Für den Tester brauchen Sie Geschwindigkeit. Versuchen Sie abzuschätzen, wie stark sich die Geschwindigkeit der Optimierung bei der Variante mit und ohne Virtualisierung ändert.

Ich werde es versuchen, aber es scheint, dass der Gewinn spürbar wird, wenn die Anzahl der gleichzeitig laufenden Strategien Dutzende oder Hunderte von Instanzen beträgt.

Ich habe mir vorgenommen, die Verwendung Ihrer virtuellen Bibliothek zur Beschleunigung von Tests genauer zu beschreiben, bin aber noch nicht dazu gekommen. Der Hauptgrund dafür ist, dass ich an die MT5-Handelsfunktionen gewöhnt bin. Als ich meine Expert Advisors von MT4 auf MT5 umstellen musste, gab es viele Unannehmlichkeiten, und ich habe erst später von Virtual erfahren.

Jetzt überlege ich, eine Child-Klasse von CReceiver zu erstellen, die die Virtual-Umgebung nutzt.