Entwicklung eines selbstanpassenden Algorithmus (Teil II): Effizienzverbesserungen

22 Februar 2021, 10:51
Maxim Romanov
0
251

Einführung

Bevor Sie diesen Artikel lesen, empfehle ich Ihnen, den ersten Artikel "Entwicklung eines selbstanpassenden Algorithmus (Teil I): Finden eines Grundmusters" zu lesen. Dies ist nicht notwendig, da der Hauptpunkt immer noch klar sein wird, aber das Lesen wird interessanter sein.

Im vorherigen Artikel habe ich ein einfaches Muster entdeckt und einen sehr einfachen Algorithmus entwickelt, der dieses Muster ausnutzt. Aber der Algorithmus hat keine flexible Struktur, und es macht keinen Sinn, von ihm herausragende Ergebnisse zu erwarten.

Wir müssen ihn stark verbessern, damit er flexibler wird und seine Betriebsparameter in Abhängigkeit von der Marktsituation anpasst, so dass es möglich ist, bessere Ergebnisse und Stabilität zu erzielen.

Analyse von Nachteilen

Beginnen wir die Entwicklung des neuen Algorithmus mit der Analyse der Nachteile der vorherigen Version. Ich habe die folgenden Nachteile hervorgehoben:

  • Signale zur Eröffnung einer Serie sind zu selten. Die Verbesserung der Signalqualität reduziert die Anzahl der Einstiegssignale und den Gesamtgewinn erheblich.
  • Es wird ein festes Abtastfenster für die Analyse genommen. Während die Samples durch einen Bereich festgelegt sind, ist die Analyse eines Samples mit einer festen Größe keine sehr effiziente Lösung. Der Markt ist keine Sinuskurve und "Tails" beeinflussen die aktuelle Signalqualität. Stichprobengrenzen sollten unscharf sein und die endgültige Entscheidung beeinflussen. Grob gesagt, nahm die vorherige Version 100 Kerzen und analysierte das Übergewicht an Auf- und Abwärtskerzen. Wenn das Übergewicht die Schwelle überschritt, wurde ein Einstiegssignal generiert. Die Stichprobe sollte dynamisch und nicht fix sein. Es ist notwendig, sowohl die Situation innerhalb des Analysefensters als auch darüber hinaus im Auge zu behalten.
  • Das Problem eines festen Analysefensters ist nicht bei allen bekannten Methoden gegeben.
  • Der Schwellenwert-Prozentsatz hat für jede Stichprobe einen festen Wert, unabhängig von der Anzahl der Kerzen in der Stichprobe. Diese Lösung ist ineffektiv, weil die Wahrscheinlichkeit einer 75%igen Überschreitung in einer Stichprobe von 30 Kerzen und in einer Stichprobe von 200 Kerzen bei weitem nicht gleich ist. Sie sinkt nicht-linear mit einer Erhöhung der Anzahl der Kerzen in der Stichprobe.
  • Das Öffnen von Positionen bei jeder Kerze ist zu kostspielig und führt zu erhöhten Drawdowns. Es werden oft zu viele Positionen geöffnet, was es notwendig macht, die Anzahl der offenen Positionen in der Serie zu reduzieren. Dies verbessert die Effizienz der Kapitalnutzung.
  • Das Schließen von Positionen mit einem festen Gewinn pro Lot reduziert die Stabilität oder Rentabilität. Wir müssen einen Kompromiss zwischen Stabilität und Profitabilität in einem sich ständig ändernden Markt finden. Ohne Anpassung des Parameters wird der Roboter bald einen Verlust erleiden, weil er den optimalen Schließungspunkt für eine Positionsserie verpasst.
  • Eine starke Begrenzung der Anzahl von Instrumenten für den gleichzeitigen Handel reduziert die Gesamtrentabilität des Systems. Serieneröffnungssignale auf verschiedenen Instrumenten korrelieren leicht miteinander. Daher kann der Erhalt eines Verlustes auf einem Instrument mit dem Erhalt eines Verlustes auf einem anderen Instrument korrelieren. Es ist notwendig, Maßnahmen zu entwickeln, um die Korrelation der Signale zu reduzieren, so dass die Anzahl der gleichzeitig gehandelten Instrumente deutlich erhöht werden kann, ohne dass sich der Drawdown-Wert signifikant erhöht.

Vereinfachter Arbeitsalgorithmus

Lassen Sie mich daran erinnern, wie die erste Version des Algorithmus gearbeitet hat. In der neuen Version bleibt die Arbeit die gleiche, aber jeder Schritt soll überarbeitet und verbessert werden.

  • Scannen eines Fenster mit N Kerzen; 
  • Prüfen, welche Kerzen vorherrschend sind — auf- oder abwärts;
  • Wenn die Prävalenz den Schwellenwert überschreitet, wird das Signal zum Starten einer Reihe von Positionen aktiviert;
  • Abwärtskerzen sind vorherrschend = Kaufsignal, Aufwärtskerzen sind vorherrschend = Verkauf;
  • Berechnen der Losgröße;
  • Eröffnen einer neuen Position bei jeder folgenden, bis die Serienschlussbedingung ausgelöst wird; 
  • Ausgelöste Serienschlussbedingung;
  • Schließen aller Positionen;
  • Suche nach einem neuen Signal.

Modernisierung

Der Roboter wurde im Jahr 2016 für MetaTrader 4 entwickelt. Sein Code ist unten angehängt.

Während der Entwicklung werde ich alle identifizierten Nachteile beseitigen, daher werde ich die gesamte Entwicklung in separate Aufgaben unterteilen.

  1. Dynamischer Schwellenwert Serienstartprozentsatz

Der Algorithmus der ersten Version wurde stabiler mit der Erhöhung der Anzahl der Kerzen im Analysefenster oder mit der Erhöhung des Schwellenprozentsatzes des Überschusses der Auf- oder Abwärtskerzen. Ich musste einen Kompromiss eingehen und eine größere Stichprobengröße für die Analyse oder einen größeren Prozentsatz des vorherrschenden Kerzenübergewichts einstellen. Die Tests haben gezeigt, dass der optimale Überschussprozentsatz auf fast jede Kerzenanzahl eingestellt werden kann, aber er sollte für jede größere Kerzenanzahl abnehmen.

Im Falle eines festen Schwellenprozentsatzes verringert eine Erhöhung der Anzahl der Kerzen im Analysefenster die Wahrscheinlichkeit einer solchen Kombination. Daher können wir eine beliebige maximale Anzahl von Kerzen im Analysefenster einstellen, da dies fast keine Auswirkung auf das Ergebnis hat, weil die Wahrscheinlichkeit, auf eine solche Kombination zu stoßen, schnell sinkt. Um die Anzahl der Serienstartsignale zu erhöhen, müssen wir den Prozentsatz für die Schwellenwertüberschreitung reduzieren, so dass die Wahrscheinlichkeit der Kombination bei einer Erhöhung der Anzahl der Kerzen in der Stichprobe ungefähr gleich bleibt.

Ich gehe davon aus, dass die Wahrscheinlichkeit eines bestimmten Überschussprozentsatzes bei einer bestimmten Anzahl von Kerzen mit Hilfe der Kombinatorik berechnet werden kann.

CP,

mit

  • С - Anzahl der Kombinationen
  • n - Anzahl der Kerzen in der Stichprobe
  • k - Anzahl der bullischen Kerzen
  • P - Ereigniswahrscheinlichkeit
  • P2 - doppelte Ereigniswahrscheinlichkeit

Die Ereigniswahrscheinlichkeit P sollte mit 2 multipliziert werden, weil P für den Fall berechnet wird, wenn es mehr Kerzen der gleichen Richtung — auf- oder abwärts — gibt. Wir sind an der Gesamtwahrscheinlichkeit interessiert, unabhängig von der Richtung. Es besteht keine Notwendigkeit, die Wahrscheinlichkeit nur dann mit 2 zu multiplizieren, wenn die Anzahl der Abwärtskerzen Kerzen gleich der Anzahl der Aufwärtskerzen ist.

Als Beispiel, lassen Sie uns die Wahrscheinlichkeit eines Ereignisses berechnen, wenn von 30 Kerzen 24 Kerzen in einer Richtung und 6 in einer anderen sind. Zu diesem Zweck habe ich die Tabelle vorbereitet, die in Abbildung 1 unten dargestellt ist.

Wahrscheinlichkeitstabelle

Abb. 1 Wahrscheinlichkeitstabelle

24 Kerzen einer Richtung aus 30 entsprechen einer Überschreitung von 80%. Die Wahrscheinlichkeit einer solchen Kombination ist 0,11%. Schauen wir uns nun die Tabelle an, um den notwendigen Überschreitungsprozentsatz für 100 Kerzen in der Stichprobe zu sehen, damit die Wahrscheinlichkeit ihres Auftretens 0,11% beträgt. Wir können sehen, dass eine solche Kombinationswahrscheinlichkeit für 100 Kerzen nicht gefunden werden kann. Es gibt Wahrscheinlichkeiten von 0,172% und 0,091%. Ich werde eine seltenere Möglichkeit wählen. Sie entspricht dem Verhältnis von einem Kerzentyp zu einem anderen von 66/34, oder 66% der Kerzen in einer Richtung.

Es ist klar, dass die Kombinationen für 30 Kerzen mit dem Überschuss der Auf-/Abwärtskerzen von 80% genauso oft vorkommen, wie die Kombinationen von 100 Kerzen mit dem Überschuss von 66%. Die Abhängigkeit des prozentualen Exzesses von der Anzahl der Kerzen ist nicht-linear. Daher sollte eine nicht-lineare Funktion angewendet werden, um den Prozentsatz mit einer Erhöhung der Kerzenanzahl anzupassen. Ich habe eine solche Funktion entwickelt:

Nichtlineare Funktion

wobei:

  • Nb — Anzahl der Kerzen in der Stichprobe.
  • Koef_NonLiner_proc — Verhältnis der Einstellungen für die Anpassung des Schwellenprozentsatzes.

Das Diagramm in Abbildung 2 zeigt, wie der Überschreitungsprozentsatz (bei einer statischen Wahrscheinlichkeit des Auftretens einer Kombination) mit der Erhöhung der Kerzenanzahl bei der kombinatorischen Methode abnimmt. Sie erlaubt auch die Bewertung der Eignung der entwickelten Funktion.

Diagrammfunktion

Abbildung 2

Die violette Kurve zeigt eine Abnahme des prozentualen Überschusses bei Erhöhung der Anzahl der Kerzen in der Stichprobe mit einer festen Wahrscheinlichkeit für das Auftreten der Kombination. Die rote Linie gehört zu der Funktion der Abnahme des Überschussprozentsatzes in Abhängigkeit von der Anzahl der Kerzen in der Stichprobe. Beide Funktionen sind nicht-linear, aber die entwickelte Funktion zerfällt langsamer. Dies muss so sein, denn je mehr Kerzen in der Stichprobe sind, desto mehr Positionen in der Serie können bei der Rückkehr auf 50% geöffnet werden. Mehr Positionen bedeuten eine größere Belastung des Depots und mehr Drawdown. 

Es wurde so eingerichtet, dass das Signal bei einer größeren Anzahl von Kerzen seltener erscheint. Außerdem passiert es nur, wenn der Überschussprozentsatz für eine gegebene Anzahl von Kerzen wirklich hoch ist.

2. Verbesserung der Signalqualität

Um die Signalqualität zu verbessern, sollte die Stichprobe nicht aus einer starr festgelegten Anzahl von Kerzen bestehen. Wir können sehen, dass der Überschuss der Aufwärtskerzen 65% aller 30 Kerzen beträgt, aber wie können wir definieren, ob das viel oder wenig ist? Wenn es auch eine Art von Überschuss an Aufwärtskerzen bei 100 Kerzen gibt, dann sollte diese Tatsache das Signal stärker machen, aber wenn es keinen Überschuss gibt oder umgekehrt, gibt es einen Überschuss an Abwärtskerzen, dann sollte das Signal geschwächt werden. Ich habe zwei Mechanismen zur Verstärkung oder Abschwächung eines Signals entwickelt.

a) Anwendung eines gewichteten durchschnittlichen Prozentsatzes. Finde den gewichteten Durchschnittsprozentsatz für alle Stichproben aus dem Bereich, der in den Parametern Min_diap_bar und Max_diap_bar eingestellt ist. Die Stichproben sollten mit einem gewissen Schritt genommen werden. Ich bevorzuge einen geraden Schritt von 2. Der gewichtete Durchschnittsprozentsatz wird für den Kerzentyp ermittelt, der im ersten Sample größer ist. Wenn die erste Stichprobe mehr aufwärts gerichtete Kerzen hat, sollten wir den Prozentsatz der aufwärts gerichteten Kerzen in allen anderen Stichproben berechnen. Die größte oder die kleinste Stichprobe kann zur ersten Stichprobe gemacht werden. Um dies zu tun, wurde der Schalter Bigin_pereb_bar zu den Einstellungen hinzugefügt. Die Gewichtungen können mit einer beliebigen Funktion gemacht werden, aber ich habe sie proportional zur Anzahl der Kerzen im Sample gemacht. 

Wenn die erste Stichprobe die kleinste Anzahl von Kerzen hat, dann ist ihr Gewichtung W1, für die zweite Stichprobe ist die Gewichtung W2, und so weiter bis zu Wn.

Gewichteter Durchschnitt

  • W1 - Gewichtung der ersten Stichprobe;
  • W2 - Gewichtung der zweiten Stichprobe;
  • Wn - Gewichtung der n-ten Stichprobe;
  • Nb1 - Anzahl der Kerzen der ersten Stichprobe;
  • Nbn - Anzahl der Kerzen der n-ten Stichprobe;
  • Pw - gewichteter durchschnittlicher Prozentsatz des Kerzenüberschusses;
  • P1 - Prozentsatz der Auf-/Abwärtskerzen der ersten Stichprobe;
  • Pn - Prozentsatz der Auf-/Abwärtskerzen der n-ten Stichprobe;
  • Nbm - Anzahl der Kerzen in der größten Stichprobe.

Wenn die erste Stichprobe die größte Anzahl von Kerzen hat, sollten die Gewichtungsverhältnisse umgekehrt werden

 Invertierte Gewichte
Um das Startsignal der Serie zu erhalten, sollte der gewichtete Durchschnittsprozentsatz mit einem separaten Wert verglichen werden, der in der Einstellung Porog_Weighted_proc angegeben ist.

b) Verwendung von Mehrfachstichproben. Es sollten mehrere Stichproben mit einer Überschreitung eines Kerzentyps über den Schwellenwert hinaus aus dem Bereich ausgewählt werden. Dabei wird davon ausgegangen, dass die Signalqualität umso höher ist, je größer die Anzahl der Samples ist, bei denen der prozentuale Überschuss größer als der Schwellenwert ist. Als Schwellwertprozentsatz soll hier ein nichtlinearer Prozentsatz verwendet werden. Mit anderen Worten, für jedes Sample mit einer eigenen Anzahl von Kerzen soll ein eigener Überschreitungsprozentsatz als Schwellenwert verwendet werden.
Der Parameter Kol_vibor legt die minimale Anzahl von Abtastungen fest, bei denen der Überschuss den Schwellenwert überschreiten soll. Der Kerzentyp, für den der Überschreitungsprozentsatz definiert werden soll, hängt davon ab, welcher Kerzentyp in der ersten Stichprobe vorherrscht. Eine Stichprobe, bei der ein Überschuss größer als der Schwellenwert festgestellt wird, wird als erste Stichprobe betrachtet. Ich habe es möglich gemacht, über den Bereich vom kleinsten zum größten und umgekehrt zu iterieren, um die Arbeit zu vergleichen.
Dies ermöglicht die Betrachtung des Signals in einem breiteren Fenster, ohne an ein festes Analysefenster gebunden zu sein. Zum Beispiel ist der Bereich des Analysefensters von 30 bis 300 Kerzen mit dem Schritt von 2 eingestellt. Um das Signal zu bilden, müssen wir mindestens 5 Stichproben aus dem Bereich mit einem Überschuss, der größer als der Schwellenwert ist, sammeln. Der Überschuss kann auf 30, 52, 100, 101 und 200 Kerzen gebildet werden. Jede Stichprobe wird mit dem Schwellenprozentsatz durch die Verwendung eines nicht-linearen Prozentsatzes verglichen. Dies erlaubt uns, die Entwicklungen im breiten Kerzenbereich effizienter zu bewerten, ohne an einen festen Wert gebunden zu sein.

Preis-Chart

Abbildung 3

Ein Beispiel ist in Abbildung 3 dargestellt. Wir können den Bereich sehen, in dem Aufwärtskerzen vorherrschen und es ein Signal gibt, Verkaufspositionen zu eröffnen. Dies ist keine eindeutige Anzahl von Kerzen, sondern ein Bereich.  

Im ersten Artikel habe ich geschrieben, dass die Anzahl der Kerzen (und dementsprechend die Anzahl der Positionen in der Serie), auf denen der resultierende Überschuss theoretisch kompensiert wird, auf der Grundlage der Anzahl der Kerzen, auf denen er erschienen ist, berechnet wird. Dank dieses Ansatzes werden die ersten Schritte zur Selbstanpassung gemacht. Der Algorithmus ist noch weit von der Selbstanpassung entfernt, aber die Nutzung der aktuellen Marktparameter für eine kleine Anpassung der Betriebsparameter bringt ihn schon näher an das Ziel.
Ein perfekter Algorithmus sollte keine konfigurierbaren Parameter enthalten. Jeder Parameter sollte genau auf Basis der aktuellen Marktparameter berechnet werden. Wir müssen genau wissen, welche Parameter zu jedem Zeitpunkt eingestellt werden sollten, damit der Algorithmus profitabel bleibt.
3. Verringerung der Anzahl der geöffneten Positionen in der Serie

Die erste Version des Algorithmus hatte ein Problem: Wenn die Serie startete, öffnete der EA bei jeder Kerze Positionen. Dieser Ansatz ist nicht sehr effizient, da er zu großen Drawdowns führt und die Anforderungen an das Depot erhöht. Es gab oft Situationen, in denen Positionen eröffnet wurden, aber der Überschussprozentsatz in der Stichprobe wuchs weiter oder fiel nicht schnell genug. Dieser nicht beachtete Faktor führte zu einem Verlust an Stabilität. Wir müssen diesen Faktor berücksichtigen und die Stabilität des Algorithmus verbessern.

Ich habe zwei Maßnahmen entwickelt, die die Anzahl der Positionen in der Serie verringern.

a) Im Falle von Verkaufspositionen werden neue Positionen nur bei aufwärts gerichteten Kerzen eröffnet. Im Falle von Kaufpositionen werden Positionen nur bei abwärts gerichteten Kerzen eröffnet. Solch ein Mechanismus erlaubt uns, effektiver Gewinne aus der Tatsache zu erzielen, dass ein Kerzentyp gegenüber einem anderen überwiegt.

Die Eröffnung von Verkaufsposition bei abwärts gerichteten Kerzen führt zu einer Verringerung des durchschnittlichen Preises für die Positionseröffnung und zu einer zusätzlichen Belastung des Kontos, wenn der Preis steigt. Gleichzeitig bringen "Extra-Positionen" fast keinen Gewinn und beschleunigen nicht das Schließen der Serie mit einem Gewinn. Die Logik ist ähnlich für Kaufpositionen.

b) Eröffnen durch die Kontrolle des Überschussprozentsatzes. Dies ist ein zusätzlicher Filter für die Eröffnung von Positionen in einer Serie. Es ist notwendig, den Überschussprozentsatz auf der gesamten Stichprobe mit dem Erscheinen jeder neuen Kerze zu überprüfen. Die Stichprobengröße wird um eins erhöht, wenn eine neue Kerze erscheint. Eine Position kann nur eröffnet werden, wenn sich der Überschussprozentsatz beim Erscheinen einer neuen Kerze erhöht.

Dies funktioniert fast wie (a), aber auf eine etwas andere Weise. Die Idee ist ähnlich wie in (а): eine Verringerung des durchschnittlichen Eröffnungspreises einer Serie für Verkaufspositionen und eine Erhöhung des durchschnittlichen offenen Preises einer Serie für Kaufpositionen zu verhindern.

Wenn ein gewichteter Durchschnitt als Schwellenprozentsatz verwendet wird, kann die Methode das Öffnen zusätzlicher Positionen anpassen, indem der aktuelle gewichtete Prozentwert mit dem Wert der vorherigen Kerze verglichen wird.

Diese beiden Elemente können sowohl zusammen als auch separat verwendet werden. Sie reduzieren die Rentabilität, erhöhen aber deutlich die Stabilität, was für mich wichtiger ist. So wurde ein nicht berücksichtigter Faktor eliminiert, was die Stabilität erhöht.

Positionseröffnung vorher

Positionseröffnung nachher

Abbildung 4. Verringern der Anzahl von Positionen in der Serie

In Abbildung 4 werden die Positionen ohne Einschränkungen geöffnet, während sie in der folgenden Abbildung mit dem Algorithmus aus (b) geöffnet werden. Wie wir sehen können, wurden weniger Positionen geöffnet. Die Vergleichsergebnisse für dieses Geschäft sind in der Tabelle unten aufgeführt.


Gewinn Maximaler Verlust Anzahl der Positionen Profit Faktor
Eröffnungen bei jeder Kerze (oberes Bild) +$71.99 -$463.96 92 1.56
Eröffnungen mit Kontrolle durch den Überschussprozentsatz (unteres Bild) +$42.26 -$263.86 48 1.68

Laut der Tabelle hat sich der maximale Drawdown verringert und damit auch die Rentabilität. Am wichtigsten ist, dass die Anzahl der Positionen um das 1,91-fache gesunken ist, was sich letztendlich positiv auf die Stabilität des Algorithmus in den Momenten auswirkt, wenn die Marktparameter von ihren typischen Werten abweichen.

Es wurden auch andere Methoden zur Verringerung der Anzahl von Positionen in einer Serie entwickelt. Sie sind in der Anforderungsspezifikation beschrieben. Ich habe die gezeigt, die mir am effizientesten erscheinen. 

4. Verbesserung der Schlusspositionen im Gewinn

In der ersten Version des Algorithmus wurde das Konzept des Gewinns pro Lot eingeführt. Dieser Wert wurde in der Depotwährung für die Losgröße gleich eins gesetzt. Danach wurde die Anzahl der Lots durch offene Positionen der Serie berechnet, und der Wert aus den Einstellungen wurde mit dem aktuellen Gesamtlot durch offene Positionen der Serie multipliziert. Nehmen wir an, dass die Einstellungen das Schließen einer Positionsserie anweisen, wenn der Gewinn $15 pro Lot überschreitet. Momentan haben wir 11 Positionen von 0,01 Lot, was bedeutet, dass die Gesamtposition 0,01*11=0,11 ist. Weiterhin wird der Gewinn pro Lot mit der erhaltenen Anzahl der Lots multipliziert $15*0.11=$1.65. Wenn der Gesamtgewinn auf den offenen Positionen $1,65 erreicht, soll die Serie der Positionen beendet werden.

Das Festlegen eines festen Gewinnbetrags pro Lot in der Depositenwährung ist nicht die effektivste Lösung. Wenn die Volatilität eines Instruments sinkt, steigt das Risiko, den richtigen Schlusspunkt zu verpassen. Umgekehrt, wenn die Volatilität steigt, verliert der Roboter Gewinn. Infolgedessen ergibt die Optimierung einen durchschnittlichen Gewinn pro Lot, der nicht effizient genug ist. 

Die einfachste Lösung ist, den Parameter "Gewinn pro Lot" auf Basis der aktuellen Volatilität anzupassen. Je höher die Volatilität, desto mehr Gewinn pro Lot und umgekehrt. Die Anwendung der durchschnittlichen Volatilität ist auch keine perfekte Lösung, aber besser als ein fester Wert.

Dies ist eine weitere kleine Selbstanpassungsfunktion, der Parameter ist nicht starr konfiguriert, sondern es wird die Abhängigkeit vom aktuellen Marktzustand eingestellt. Es ist bekannt, dass der Gewinn in einer Serie direkt von der Kerzengröße abhängt, und diese Abhängigkeit sollte zur Erhöhung der Stabilität genutzt werden.

Ich habe mich entschieden, den Gewinn nicht in der Depositionswährung zu verwalten, weil der Punktpreis bei Währungspaaren wie USD/XXX nicht konstant ist und sich vom aktuellen Kurswert ändert. Der Gewinn soll in Punkten verwaltet werden. Dazu nehmen Sie den aktuellen Wert des ATR-Indikators (in Punkten) und multiplizieren ihn mit dem Koef_multi_ATR-Wert. Das Ergebnis ist die Anzahl der Punkte, die mit Gewinn geschlossen werden sollen. Als Nächstes wird die Anzahl der Punkte, die vom offenen Preis bis zum aktuellen Wert vergangen sind, berechnet und der Durchschnittswert für alle Positionen gefunden. Der erhaltene Durchschnittswert wird mit der Anzahl der Punkte für das Schließen mit Gewinn verglichen. Wenn die durchschnittliche Anzahl der Punkte größer oder gleich der Anzahl der Punkte für das Schließen ist, ist die Serie vollständig. Wenn nicht, wird der Vorgang bei der nächsten Kerze wiederholt. 

Der aktuelle Gewinn sollte bei jedem Tick oder durch den Timer überwacht werden. Um übermäßige Berechnungen zu vermeiden, ist es sinnvoll, den Gewinn mittels eines Timers einmal pro Sekunde oder sogar einmal pro 10 Sekunden für ein System dieser Art zu überprüfen.

  5. Arbeiten mit mehreren Handelsinstrumenten

Die vorherige EA-Version konnte 10 Instrumente gleichzeitig handeln. Dies war unzureichend, so dass mehrere EA-Instanzen auf einmal gestartet werden mussten. Die neue Version kann gleichzeitig 28 Instrumente handeln, um eine bessere Kontrolle über den Handel zu haben.

Wie ich bereits erwähnt habe, korrelieren die Serien-Startsignale auf verschiedenen Instrumenten leicht. Dies führt zu einer Synchronisierung der Drawdowns für verschiedene Instrumente, einer Erhöhung der Einzahlungsanforderungen und einer Verringerung der relativen Profitabilität. 

Im Idealfall sollte die Korrelation zwischen den Serien-Startsignalen auf verschiedenen Handelsinstrumenten negativ sein. Der große aktuelle Drawdown auf einem Instrument sollte mit kleinen profitablen Geschäften auf einem anderen Instrument zusammenfallen. Die gleichzeitige Eröffnung von Serien auf mehr als einem Instrument zu deaktivieren, ist auch nicht die beste Lösung, da es die Gesamtrentabilität verringert.

Die Korrelation der Startsignale für neue Serien entsteht dadurch, dass eine der Währungen im Verhältnis zu anderen zu fallen oder zu steigen beginnen kann. Ein Signal zum Kauf oder Verkauf einer Währung im Verhältnis zu anderen Währungen kann auf mehreren Paaren gleichzeitig erscheinen. Wir sollten uns also vor einer solchen Situation schützen.

Um die Korrelation zwischen den Serienstartsignalen auf verschiedenen Instrumenten auf ein Minimum zu reduzieren, müssen wir die Währungspaare in separate Währungen aufteilen und davon ausgehen, dass Positionen in separaten Währungen eröffnet werden. Wenn eine Verkaufsposition auf EURUSD geöffnet wird, wird sie in eine Verkaufsposition für EUR und eine Kaufposition für USD aufgeteilt. Vor dem Start jeder neuen Serie müssen wir das Vorhandensein von Positionen auf Währungen, die das Paar bilden, überprüfen. Wenn es eine Verkaufsposition auf EUR gibt, sollten wir den Start jeder Serie, in der EUR verkauft wird, deaktivieren. Wir sollten jedoch keine Signale deaktivieren, die den Kauf von EUR erfordern. 


Abbildung 5

Die Aufteilung der Währungen in Paare ist in Abbildung 5 dargestellt. Abbildung 6 unten zeigt, welche Positionen geöffnet werden können, wenn EURUSD kaufen geöffnet ist. Für andere Optionen funktioniert alles auf die gleiche Weise. 

Währungen 2

Abbildung 6

Mit diesem Ansatz ist es nicht mehr notwendig, die maximale Anzahl von Instrumenten für die gleichzeitige Eröffnung von Positionen zu begrenzen. Trotzdem habe ich die Funktion in den Einstellungen belassen.

6. Losgrößen-Korrektur basierend auf der aktuellen Volatilität

In der zweiten Version des Algorithmus habe ich auf die automatische Refinanzierung verzichtet, daher ändert sich die Losgröße nicht, wenn man die Depotgröße ändert. Ich habe diesen EA für den realen Handel entwickelt, und ich brauche diese Funktion nicht. Stattdessen habe ich eine andere Losgrößen-Korrekturfunktion entwickelt. Gewinn und Verlust eines solchen Algorithmus hängen von der Kerzengröße oder der Volatilität ab. Es wäre logisch, das Profitabilitätsgraphen so flach wie möglich zu machen, ohne Dips und Spikes. 

Um den Profitabilitätsgraphen zu stabilisieren, müssen wir die Losgröße basierend auf der aktuellen Volatilität ändern. Je stärker sie ist, desto weniger müssen wir die Losgröße verwenden, je niedriger die Volatilität ist, desto größer darf die Losgröße sein. Das Lot ändert sich im Verhältnis zur aktuellen Volatilität. Um dies zu erreichen, werden das normale Lot und die Volatilität in den Einstellungen definiert.

Um die aktuelle Losgröße zu berechnen, nehmen wir den aktuellen ATR-Wert und dividieren ihn durch Norm_ATR aus den Einstellungen. Danach dividieren wir die Losgröße aus den Einstellungen durch das resultierende Verhältnis und runden den erhaltenen Wert auf den korrekten Wert ab. Auf diese Weise nimmt die Losgröße mit dem Wachstum der Kerzen ab, während die Profitabilitätskurve so stabil wie möglich bleibt.

Nach dem Start der Serie kann sich die Volatilität ändern, deshalb habe ich zwei Optionen eingeführt. In der ersten wird die Losgröße vor dem Start der Serie definiert und bleibt stabil, bis die Serie zu Ende ist.

In der zweiten Option ändert sich die Losgröße nach dem Start der Serie aus der aktuellen Volatilität. In diesem Fall wirken sich die Positionen bei der Berechnung des aktuellen Gewinns auf den Gesamtgewinn in der Einzahlungswährung aus, entweder verbessern oder verschlechtern sich die Ergebnisse. Die Funktion ist experimentell. Wenn Ihnen die Funktion gefällt, kann ich sie in der nächsten Version modifizieren.

Tests

Der Artikel beschreibt nur die grundlegendsten und interessantesten Modifikationen und Betriebsmodi. In Wirklichkeit ist viel mehr implementiert, und alle Modi können miteinander kombiniert werden. Das Pflichtenheft für den Algorithmus mit allen Details ist unten angehängt. 

Ich werde die Tests mit denselben Währungspaaren durchführen, die ich zum Testen der ersten Version des Algorithmus verwendet habe, um die Unterschiede visuell hervorzuheben. Wie die erste Version arbeitet dieser Algorithmus mit geschlossenen Kerzen, sodass Sie ihn sicher im Modus "Kontrollpunkte" testen können. Innerhalb der Kerze kontrolliert er nur den aktuellen Gewinn und stellt sicher, dass die aktuellen Mittel nicht unter den in den Einstellungen festgelegten Schwellenwert fallen. Wie bisher werden die Tests mit einem überschätzten Spread durchgeführt. Ich werde einen Spread von 40 für GBPUSD einstellen.

Wie in der ersten Version des Algorithmus können wir mit jedem Zeitrahmen handeln und optimieren. Der minimale Zeitrahmen wird durch die Größe der Kerzen im Verhältnis zu den Spreads und Kommissionen begrenzt. Je kleiner der Zeitrahmen ist, desto höher sind die Anforderungen an die Signalqualität und die erwartete Auszahlung. Je größer der Zeitrahmen ist, desto größer wird die Größe der Kerzen und dementsprechend steigt auch die Höhe des Drawdowns. Daher wird der maximale Zeitrahmen durch die Präferenzen des Handelsstils begrenzt.

Ich habe im Jahr 2017 eine Optimierung durchgeführt, als ich den Roboter für den Handel auf realen Konten verwendet habe. Daher habe ich einfach die vorherigen Einstellungen übernommen, ohne eine neue Optimierung durchzuführen.

GBPUSD 2000, Tester-Chart

GBPUSD 2000 Tester-Bericht

Abbild 7. GBPUSD H1 2000.01.01 - 2020.12.08, konstante Losgröße

Abbildung 7 zeigt den Test von GBPUSD H1 für den Zeitraum von fast 21 Jahren seit 2000.01.01 bis zum 2020.12.08. Hier wird das mehrfache Sampling aus dem Bereich verwendet. Der Analysebereich ist 68-200 Kerzen. Es werden 15 Stichproben verwendet.

Wenn die erste Version des Algorithmus den Test erst ab 2001 bestanden hat, so besteht die zweite Version den Test leicht seit 2000. Im Vergleich zur ersten Version hat sich die Anzahl der Positionen um das 3fache erhöht, während der Gewinn um das 1,9fache gestiegen ist. Der Gewinnfaktor ist von 7,5 auf 2,74 gesunken, bleibt aber immer noch auf einem anständigen Niveau. Die Startsignale der Serie werden häufiger generiert, während die durchschnittliche Anzahl der Positionen in der Serie gesunken ist. Wahrscheinlich können wir bessere Einstellungen finden, aber ich habe die genommen, die ich für den Handel verwendet habe.

Die Funktion der Losgrößenanpassung aus dem aktuellen ATR-Wert wurde bereits entwickelt. Abbildung 8 zeigt den gleichen Test wie in Abbildung 7, aber mit einem dynamischen Lot basierend auf der Volatilität. Da die Losgröße von 0,01 für $3000 verwendet wurde, habe ich den Losgrößen-Anpassungsalgorithmus bis $30.000 erhöht, wodurch die Losgröße auf 0,1 steigt.

GBPUSD 2000-Tester-Chart, dyn. Losgröße

GBPUSD 2000-Tester-Bericht, dyn. Losgröße

Abbildung 8. GBPUSD H1 2000.01.01 - 2020.12.08, dynamische Losgröße in Abhängigkeit von ATR 

Wie wir auf der Abbildung 8 sehen können, ist die Profitabilitätskurve deutlich linearer geworden, wie es während der Entwicklung erwartet wurde. Gleichzeitig ist die Profitabilität leicht gesunken, während der maximale Drawdown etwas gestiegen ist. Der Modus hat sich als interessant herausgestellt. Er wird nützlich sein, um die maximale vorhergesagte Rentabilität mit hohen Sharpe Ratio-Werten zu erhalten.

Wir müssen prüfen, wie die Stabilität der Parameter ist, die ich in den oben genannten Tests verwendet habe. Um dies zu erreichen, werde ich den Test auf GBPUSD M15 mit den gleichen Einstellungen starten, die ich für H1 verwendet habe. Da die Ungleichmäßigkeit der Volatilität auf kleineren Zeitrahmen viel größer ist, sollte die Gewinnquote etwas reduziert werden. Da ich weiß, warum das so sein sollte, sollte dieser Parameter selbstanpassend gemacht werden. Die aktuelle EA-Version hat jedoch keine solche Funktion, also passe ich ihn manuell an. 

GBPUSD M15, Tester-Chart

GBPUSD 2009 m15 Tester-Bericht

Abbildung 9. GBPUSD m15, 2019.11.25 - 2020.11.25

Abbildung 9 zeigt den Test von GBPUSD M15 2009.01.01 - 2020.12.08 mit den H1-Einstellungen. Der Test wurde ab 2009 durchgängig durchgeführt. Das Ergebnis ist gut, wenn man bedenkt, dass die Zeitrahmeneinstellungen nicht speziell für M15 optimiert wurden. Um die optimalen Einstellungen für M15 zu finden, genügt es, den schwierigsten Abschnitt für 1,5 Jahre von 2008.01.01 bis 2009.06.01 zu optimieren. Wenn wir die Parameter für diesen Abschnitt optimieren, wird der EA den Test 21 Jahre lang ohne Probleme bestehen.

Für die erste Version habe ich die Tests für EURUSD H1 gezeigt. Lassen Sie uns die Ergebnisse vergleichen. Abbildung 10 zeigt das Ergebnis für EURUSD H1 für den Zeitraum von 2000.01.01 bis 2020.12.08.

EURUSD 2000, Tester-Chart

EURUSD 2000, Tester-Bericht

Abb. 10. EURUSD H1 2000.01.01 - 2020.12.08

Die erste Version hat den Backtest erst seit 2007 bestanden, die neue Version besteht den Test bereits seit 2000. Die Stabilität hat sich deutlich verbessert. Gleichzeitig hat sich der maximale Drawdown um das 1,2-fache verringert und der Gewinn hat sich um das 3-fache erhöht. Die Anzahl der Positionen hat sich um das 2,3-fache erhöht.

Da wir herausfinden wollen, wie viel besser die zweite Version geworden ist, sehen wir uns den Test auf GBPJPY H1 an. Die erste Version wurde ab 2009 getestet.

GBPJPY 2000 Tester-Chart

GBPJPY 2000, Tester-Bericht

Abb. 11. GBPJPY H1 2000.01.01 - 2020.12.08

Wie wir in Abbildung 11 sehen können, durchläuft der Algorithmus jetzt Backtests ab 2000. er Drawdown hat sich um das 1,8-fache verringert, während der Gewinnfaktor auf 3,3 gestiegen ist.

Ich habe 28 Währungspaare optimiert, die aus den acht Hauptwährungen USD, GBP, EUR, CHF, CAD, AUD, NZD und JPY bestehen. Einige Währungspaare zeigen das beste Ergebnis, während einige das schlechteste zeigen, aber alle sind gut optimiert und bestehen in der Regel die Tests seit 2004. Einige Währungspaare bestehen den Test seit 2007.

MetaTrader 4 ist nicht in der Lage, Tests auf mehreren Instrumenten gleichzeitig durchzuführen. Daher habe ich die Tests für jedes der 28 Symbole separat durchgeführt und eine Drittanbieter-Software verwendet, um die Berichte zu kombinieren. Da ich dies im Jahr 2017 getan habe, deckt der kombinierte Bericht den Zeitraum von 2010 bis 2017 ab.

Vollständiger Bericht

Abb. 12. Kombinierter Backtest für 28 Währungspaare von 2010 bis 2017

Abbildung 12 zeigt, dass die Profitabilitätskurve mit einer Rendite von etwa 100 % pro Jahr ziemlich flach ist. Das Ergebnis ist ziemlich beeindruckend, aber in Wirklichkeit ist die Rentabilität aufgrund der Einschränkung des gleichzeitigen Handels mit mehreren Währungspaaren niedriger. Ich habe diesen Roboter für den Handel auf realen Konten zwei Jahre lang verwendet, und die reale Rentabilität lag bei 56% pro Jahr. 

Die reale Profitabilität ist niedriger als die berechnete, weil der Test mit aufgeblähten Spreads durchgeführt wurde. Der Algorithmus arbeitet so, dass je höher der Spread, desto höher die Profitabilität. Dies lässt sich dadurch erklären, dass je höher der Spread, desto geringer die Stabilität. Außerdem ist in der Realität auch der Effekt einer Verringerung der Anzahl von Signalen aufgrund des Verbots von unidirektionalen Geschäften zu beobachten.

Bei der Positionierung habe ich die konservativsten Einstellungen verwendet. Es ist jedoch möglich, den Algorithmus viel aggressiver handeln zu lassen. 

Zusätzliche Funktionen

Ich habe die Möglichkeit hinzugefügt, Serien-Startsignale nach anderen Zeitrahmen zu sortieren. Zum Beispiel kann die Position auf H1 gehandelt werden, aber die Signale werden zusätzlich auf allen Standard-Zeitrahmen geprüft. Das Serienstartsignal wird nur gebildet, wenn die Zeitrahmen M1, M5, M15, M30, H1, H4 und D1 ebenfalls ein solches Signal haben. Das Serienbestätigungssignal mit zusätzlichen Zeitrahmen wird nach den gleichen Regeln und im gleichen Modus wie auf dem Hauptzeitrahmen erzeugt. Zusätzliche Zeitrahmen können unabhängig voneinander aktiviert oder deaktiviert werden.

Leider konnte ich den Modus nicht überprüfen, da es Probleme mit der korrekten Funktionsweise gab.

Der EA verfügt über viele zusätzliche Funktionen, die ich nicht berücksichtigt habe, weil sie nicht so interessant sind wie die Grundmechanik. Dies sind die folgenden:

  • Die Möglichkeit, Take-Profit und Stop-Loss zu setzen. Die Werte werden nach einem bestimmten Algorithmus berechnet und können reale Schlusspunkte duplizieren oder unabhängig arbeiten.
  • Hinzufügen der Funktion zur Verwaltung des aktuellen Kontostands. Wenn der Kontostand unter den eingestellten Schwellenwert fällt, schließt der EA die Positionen und stoppt den Handel
  • Es wurde die Möglichkeit hinzugefügt, die maximale Anzahl von Positionen für ein einzelnes Symbol oder alle Symbole zu begrenzen.
  • Es wurde die Möglichkeit hinzugefügt, den aktuellen Verlust für jedes Handelssymbol zu verwalten. Dies ist ein zusätzlicher virtueller Stop-Loss.
  • Es kann eine Pause zwischen zwei benachbarten Serien in der Anzahl der Kerzen eingestellt werden, so dass die Serie nicht sofort nach dem Schließen der vorherigen Serie eröffnet wird. Diese Funktion ermöglicht das Starten von Serien auf anderen Instrumenten während einer Pause.
  • Wir sind in der Lage, den minimalen ATR-Wert einzustellen, bei dem neue Serien auf einem Instrument beginnen können. Wenn die Volatilität niedrig ist, dann kann die Position nicht profitabel sein.
  • Der nicht-lineare Gewinn kann zum Schließen von Positionen verwendet werden. Je mehr Positionen in der Serie geöffnet sind, desto wünschenswerter ist es, sie so schnell wie möglich zu schließen. Daher fällt der Schwellengewinn proportional zur Quadratwurzel der Anzahl der offenen Positionen.
  • Der Bildschirm zeigt alle notwendigen Informationen für jedes gehandelte Instrument an, so dass Sie die EA-Logik verfolgen können.
  • Der Algorithmus verarbeitet PC- und Terminal-Resets, nimmt seine offenen Positionen auf und setzt den Handel entsprechend der aktuellen Situation fort, indem er dafür globale Variablen verwendet.

Der EA verfügt über 2337 Einstellungen für 28 Handelsinstrumente, so dass alle Benutzer einen Betriebsmodus finden können, der sie interessiert.

Schlussfolgerungen und weitere Entwicklung

  • Ich habe ein einfaches, aber verständliches Muster als Grundlage verwendet, um die Eigenschaften des Algorithmus während der Entwicklung deutlich zu verbessern. Dies ist möglich geworden, weil das verwendete Muster sehr klar ist und man genau studieren kann, was Gewinn und Verlust beeinflusst.
  • Der Algorithmus ist für eine Vielzahl von Instrumenten gut optimiert und ist über lange Zeiträume recht stabil.
  • Die Betriebsparameter sind flexibler geworden und können bereits in Abhängigkeit von den aktuellen Marktparametern leicht angepasst werden. Durch diese Eigenschaft konnte die Stabilität deutlich erhöht werden. Der Algorithmus kann weiter verbessert werden, um seine Betriebsqualität zu verbessern.
  • Es besteht ein erhebliches Potenzial zur Verbesserung der Algorithmusparameter. Die Logik kann sowohl für den Trend- als auch für den Gegentrend-Handel invertiert werden.
  • Jedes Instrument erfordert eine Optimierung. Dies ist ein Nachteil, der auf das Fehlen eines vollwertigen theoretischen Modells hinweist, das zeigt, welche Parameter zu einem bestimmten Zeitpunkt für ein bestimmtes Instrument erforderlich sind und warum.
  • Die Notwendigkeit der Optimierung für jedes Instrument bedeutet, dass wir die Unterschiede zwischen den Preisreihen der verschiedenen Handelsinstrumente nicht kennen. Jede Ungewissheit führt zu unberechenbaren Faktoren.
  • Wenn wir nicht wissen, wie sich die Parameter der Preisreihen eines Instruments von denen eines anderen unterscheiden, dann gibt es keine Möglichkeit, das Vorhandensein eines Musters für das aktuelle Instrument zu kontrollieren. Wir können nicht genau sagen, welche Parameter der Preisreihen die Rentabilität und Stabilität des Algorithmus beeinflussen.
  • Es ist nicht klar, warum die optimierten Einstellungen auf einem Instrument stabil und auf einem anderen instabil sind. Es ist möglich, Einstellungen zu wählen, die auf allen Handelsinstrumenten stabil sind, aber dies führt zu einem deutlichen Rückgang der Profitabilität.
  • Bei der Optimierung von Parametern auf historischen Daten können wir die nicht berücksichtigten Faktoren nicht loswerden. Es ist die Anzahl der nicht berücksichtigten Faktoren, die die Stabilität beeinflusst.
  • Um wirkliche Stabilität zu erreichen, ist es notwendig, die Theorie deutlich zu überarbeiten und die Optimierung in den nächsten Algorithmusversionen aufzugeben.
  • Jeder Parameter innerhalb der Einstellungen sollte von etwas abhängen. Es sollte nicht einen einzigen Parameter geben, der nur deshalb eingestellt wird, weil EA damit besser funktioniert. Wir brauchen eine detaillierte Erklärung, warum der Parameter jetzt verwendet wird und wann er seinen Wert ändern sollte.

Im nächsten Artikel werde ich die Entwicklung des Algorithmus fortsetzen und das theoretische Modell deutlich überarbeiten. Der neue Algorithmus soll für den MetaTrader 5 entwickelt werden, da dieser eine leistungsfähigere, flexiblere und effizientere Plattform ist.

Der EA-Code, die Anforderungsspezifikation, die Testeinstellungen, ein Beispiel der Einstellungen für 28 Währungspaare und die Excel-Tabelle zur Berechnung der Ereigniswahrscheinlichkeit sind unten angehängt.

Der Autor der Idee und des Pflichtenheftes ist Maxim Romanov. Der Code wurde von Vyacheslav Ivanov geschrieben.

Frühere Artikel zum Thema:

Entwicklung eines selbstanpassenden Algorithmus (Teil I): Finden eines Grundmusters

Übersetzt aus dem Russischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/ru/articles/8767

Beigefügte Dateien |
robot.zip (43.21 KB)
Set.zip (152.63 KB)
technical_task.zip (67.45 KB)
Brute-Force-Ansatz zur Mustersuche (Teil III): Neue Horizonte Brute-Force-Ansatz zur Mustersuche (Teil III): Neue Horizonte

Dieser Artikel bietet eine Fortsetzung des Brute-Force-Themas und führt neue Möglichkeiten der Marktanalyse in den Programmalgorithmus ein, wodurch die Geschwindigkeit der Analyse beschleunigt und die Qualität der Ergebnisse verbessert wird. Neue Ergänzungen ermöglichen die qualitativ hochwertigste Ansicht von globalen Mustern innerhalb dieses Ansatzes.

Über das Finden von zeitlicher Mustern im Devisenmarkt mit dem CatBoost-Algorithmus Über das Finden von zeitlicher Mustern im Devisenmarkt mit dem CatBoost-Algorithmus

Der Artikel befasst sich mit dem Erstellen von Machine-Learning-Modellen mit Zeitfiltern und diskutiert die Effektivität dieses Ansatzes. Der menschliche Faktor kann nun eliminiert werden, indem das Modell einfach angewiesen wird, zu einer bestimmten Stunde an einem bestimmten Wochentag zu handeln. Die Mustersuche kann durch einen separaten Algorithmus bereitgestellt werden.

Eine neue Schiene: Benutzerdefinierte Indikatoren in MQL5 Eine neue Schiene: Benutzerdefinierte Indikatoren in MQL5

Ich werde nicht alle neuen Möglichkeiten und Funktionen des neuen Terminals und der Sprache aufzählen. Sie sind zahlreich und einige der Neuheiten sind eine Diskussion in einem eigenen Beitrag wert. Auch gibt es hier keinen Code, der mit objektorientierter Programmierung geschrieben wurde. Das Thema ist zu wichtig, um es nur im Kontext zusätzlicher Vorteile für Entwickler zu erwähnen. In diesem Beitrag gehen wir auf Indikatoren, ihre Struktur, Zeichnung, Typen und Programmierdetails im Vergleich zu MQL4 ein. Ich hoffe, dass dieser Beitrag für Einsteiger und erfahrene Entwickler hilfreich sein wird. Vielleicht entdeckt auch jemand etwas Neues.

Hier sind der neue MetaTrader 5 und MQL5 Hier sind der neue MetaTrader 5 und MQL5

Dies ist nur ein kurzer Überblick über MetaTrader 5. Ich kann nicht alle neuen Funktionen des Systems in so kurzer Zeit beschreiben. Die Tests begannen am 09.09.2009. Das ist ein symbolisches Datum und ich bin sicher, dass es eine Glückszahl werden wird. Es sind ein paar Tage vergangen, seit ich die Beta-Version des MetaTrader-5-Terminals und MQL5 bekommen habe. Ich konnte noch nicht alle Funktionen ausprobieren, doch ich bin jetzt schon beeindruckt.