Entwicklung eines selbstanpassenden Algorithmus (Teil III): Verzicht auf Optimierung

Maxim Romanov | 16 März, 2021

Einführung

Bevor Sie diesen Artikel lesen, empfehle ich Ihnen, den zweiten Artikel der Serie "Entwicklung eines selbstanpassenden Algorithmus (Teil II): Effizienzverbesserungen". Die im aktuellen Artikel angewandte Methodik unterscheidet sich erheblich von allem, was zuvor besprochen wurde, aber es wird nützlich sein, die vorherigen Artikel zu lesen, um das Thema zu verstehen.

Analyse der Nachteile

Wie im vorherigen Artikel beginne ich mit der Analyse der Nachteile der vorherigen erfolgreichen Version. Die folgenden Schwächen wurden bei der Analyse festgestellt:

Ich halte alle oben genannten Nachteile für erheblich. Wir können die Modifikation des Algorithmus fortsetzen, indem wir die Eigenschaften nach und nach verbessern, aber es ist besser, das Beste daraus zu nehmen und die Entwicklung fast von Grund auf neu zu beginnen. Ich werde mit der Überarbeitung der theoretischen Basis beginnen.

Der Algorithmus sollte komplett selbstanpassend sein, deshalb wird er für die Währungs- und Devisenmärkte entwickelt werden. Er sollte mit jedem Instrument funktionieren. Das ist wichtig, denn es sollte ein klares Verständnis dafür geben, wie sich ein Markt von einem anderen unterscheidet. Wenn es ein solches Verständnis gibt, dann macht es Sinn, es in einen Algorithmus umzusetzen. Diesmal bin ich auf die Plattform MetaTrader 5 umgestiegen, weil sie einen besseren Strategietester hat und man nicht nur mit FOREX-Instrumenten, sondern auch mit Börseninstrumenten arbeiten kann.

Während der Entwicklung muss man ständig die Frage beantworten, warum ein bestimmter Parameter einen bestimmten Wert hat. Im Idealfall sollte der Grund für die Einstellung eines beliebigen Wertes in den Parametern begründet werden.

Umwandlung eines Kerzencharts in einen Blockchart

In der neuen Version habe ich mich entschieden, Kerzen wegen ihrer instabilen Parameter nicht zu verwenden. Genauer gesagt, sollen nur M1-Kerzen verwendet werden, weil der Übergang zur Behandlung von Ticks zu einem erheblichen Anstieg des Ressourcenverbrauchs führt. Idealerweise ist es besser, mit Ticks zu arbeiten.

Ich werde Blöcke von N Punkten analysieren. Die Blöcke sind ähnlich wie Renko, aber sie basieren auf einem etwas anderen Algorithmus. Ich habe Blockcharts und ihre Vorteile in der Analyse bereits im Artikel "Was ist ein Trend und basiert die Marktstruktur auf einem Trend oder einer Seitwärtsbewegung?" erläutert.

Block

Abb. 1 Blockchart

Abb. 1 zeigt ein Blockchart Die allgemeine Darstellung eines Blockdiagramms wird im unteren Teil der Abbildung gezeigt, während das obere Bild demonstriert, wie Blöcke auf dem Preisdiagramm aussehen. Blöcke werden ausgehend von einer festen Zeit in die Vergangenheit und Zukunft eingebaut. In der Abbildung ist die feste Zeit als gelbe vertikale Linie dargestellt. Dies ist ein Nullpunkt, von dem aus Blöcke in die Vergangenheit und Zukunft gebaut werden. Der Konstruktionsalgorithmus ist gespiegelt. Die Tatsache, dass die Blöcke in die Vergangenheit und die Zukunft gebaut werden, wird für die weitere Entwicklung wichtig sein.

Blöcke werden benötigt, weil ihre Hauptparameter stabil und kontrollierbar sind und, was am wichtigsten ist, der Gewinn/Verlust hauptsächlich von der Preisbewegung in Punkten abhängt.

Marktmodell

Das Grundmuster soll ähnlich dem sein, das ich in den vorherigen Algorithmen verwendet habe: die lokale Abweichung der Anzahl der Abwärtsblöcke von der Anzahl der Aufwärtsblöcke und die anschließende Rückkehr zu einem gewissen Gleichgewicht. Das Muster ist statistisch, also müssen wir damit beginnen, die statistischen Eigenschaften von Block-Charts zu analysieren. Dazu habe ich einen speziellen Indikator Max_distribution entwickelt, der im Artikel "Was ist ein Trend und basiert die Marktstruktur auf einem Trend oder einer Seitwärtsbewegung?".

Der Indikator misst statistische Parameter der in Blöcke unterteilten Preisreihen. Er ist in der Lage, Daten für mehrere Blockgrößen gleichzeitig anzuzeigen. Wir wollen zum Beispiel wissen, welche statistischen Eigenschaften die Charts mit einer Blockgröße von 10 bis 1000 Punkten haben. Wir stellen die minimale Blockgröße in den Einstellungen des Indikators ein und erhalten Blöcke aller anderen Größen über den Multiplikationsfaktor.

Die Hauptbetriebsart des Indikators ist die Messung der Anzahl der Blöcke, um die sich der Kurs in N Schritten vertikal bewegt.

Blöcke, vertikal

Bild 2. Ändern der Anzahl der Blöcke vertikal in 24 Schritten

Abb. 2 zeigt ein Beispiel. Die Anzahl der Blöcke, die der Preis in N Schritten durchläuft, wird gemessen. Die erforderliche Anzahl von Stichproben (z. B. 100) wird gesammelt und der Durchschnittswert wird bestimmt. Eine solche Analyse wird für Blöcke mit unterschiedlicher Größe durchgeführt.

Verteilung

Abb. 3. Durchschnittliche Amplitude für verschiedene Blockgrößen

Abb. 3 zeigt ein Beispiel für die vertikale durchschnittliche Amplitudenverteilung in Blöcken in 24 Schritten. Jede Histogrammspalte ist der durchschnittliche Amplitudenwert für seine Blockgröße. Die Anzahl der Abtastungen beträgt 1000. Die Messwerte für die kleinsten Blöcke befinden sich auf der linken Seite, während die für die größten Blöcke auf der rechten Seite dargestellt sind. Bei einer Blockgröße von 0,00015 bewegt sich der Kurs in 24 Schritten und 1000 Abtastungen 5,9 Blöcke vertikal. Bei einer Blockgröße von 0,00967 bewegt sich der Preis in 24 Schritten und 1000 Samples um 4,2 Blöcke vertikal.

Die rote Linie zeigt den Referenzwert, der auftreten würde, wenn die Preisreihe ein Random Walk wäre. Für 24 Schritte ist dies der Wert von 3,868 Blöcken vertikal. Der Referenzwert wird durch die kombinatorische Methode berechnet und kann durch die Tabelle in Abb. 4 übersichtlich dargestellt werden.

Wahrscheinlichkeitstabelle

Abb. 4. Berechnen des Referenzwertes für 24 Schritte

Abb. 4 zeigt die Berechnung des vertikalen Referenzwerts der Blöcke, um die sich der Preis im Durchschnitt in 24 Schritten im Falle des Random Walk bewegt. In der letzten Spalte wird dieser Wert in eine Potenz umgerechnet. Die durchschnittliche Amplitude des Random Walk tendiert zu 24^0,4526. Der Referenzwert kann für jede Schrittzahl neu berechnet werden. Die Tabelle ist dem Artikel im Format .xlsx angehängt.

Ich habe verschiedene Handelsinstrumente untersucht: etwa 35 Währungspaare, über 100 Aktien, 10 Kryptowährungen und etwa 10 Rohstoffe. Es gibt keine gravierenden Abweichungen. Im Allgemeinen ist das Bild für alle Instrumente ungefähr ähnlich. Die durchschnittliche Amplitude reicht von 7 bei schnell wachsenden Kryptowährungen bis zu 3,8 bei Währungspaaren. Einige niedrig liquide Aktien können sogar unter 3,8 fallen.

Die durchschnittliche Amplitude wurde in 24 Schritten oder für eine andere Anzahl von Schritten ermittelt, aber was bedeutet das? Stellen wir den Chart in Form einer Sinuswelle dar, die in eine Blockform umgewandelt wurde, wie in Abb. 5.

Sinusfunktion

Bild 5. Eine Sinuswelle in Blockform

Die Blockgröße sollte so gewählt werden, dass in der halben Periode der Sinuskurve 24 Schritte enthalten sind. Dann beträgt die Periode 48 Schritte. Wenn wir die durchschnittliche Amplitude in 25 Abtastungen von 24 Schritten messen, erhalten wir die durchschnittliche Amplitude von 10,33 Blöcken in 24 Schritten. Mit einer Erhöhung der Anzahl der Samples tendiert die durchschnittliche Amplitude zu 12 oder zur Anzahl der Schritte geteilt durch 2. Die Preisreihe ist keine Sinuskurve, aber die Sinuskurve ist praktisch für den Handel. Wenn wir nun bei der Messung der durchschnittlichen Amplitude einen Wert über 12 erhalten, ist die Blockgröße nicht groß genug, und 24 Blöcke passen nicht in die Hälfte der Periode. Aber ein Wert kleiner als 12 deutet auf zwei Gründe hin: die Blöcke sind zu groß oder die Trendbewegung der Preisreihe ist nicht so linear wie bei der Sinuswelle. Die Trendsteigung berücksichtige ich derzeit nicht. Dies werde ich später nachholen.

Anhand der Messwerte des entwickelten Indikators Max_distribution können wir grob abschätzen, wie ähnlich die Preisreihe einer Sinuskurve ist. Dazu sehen wir uns an, wie das Histogramm des Indikators für eine Sinuswelle aussieht.

Verteilung2

Abb. 6. Abhängigkeit der durchschnittlichen Amplitude von der Blockgröße bei einer Sinuswelle

In Abb. 6 ist zu sehen, dass sich der Preis bei kleinen Blöcken in 24 Schritten 24 Blöcke vertikal bewegt. Mit zunehmender Blockgröße bewegt sich der Preis jedoch um eine kleinere Anzahl von Blöcken in 24 Schritten. Wenn die Blockgröße mit der Amplitude der Schwankungen vergleichbar wird, fällt die Anzahl der Blöcke vertikal auf Null. In Abb. 3 betrug der Maximalwert 5,9 und tendierte zu einem Referenzwert, 3,868. Somit kann die Preisreihe als eine "verrauschte" Sinuswelle dargestellt werden, die auf einigen Skalen immer eine gewisse Trendkomponente hat. Mit anderen Worten, der Markt sollte immer eine Skala haben, die aktuell eine Seitwärtsbewegung zeigt (die Umkehrwahrscheinlichkeit ist höher als die Trendfortsetzungswahrscheinlichkeit) und eine Skala, die aktuell einen Trend zeigt (die Fortsetzungswahrscheinlichkeit ist höher als die Umkehrwahrscheinlichkeit).

Die Gründe für die Annahme dieser Definition von Trend und Seitwärts sind in einem meiner früheren Artikel "Was ist ein Trend und basiert die Marktstruktur auf einem Trend oder einer Seitwärtsbewegung?" erläutert.

Mit dem Indikator Max_distribution habe ich die durchschnittliche vertikale Anzahl der Blöcke für verschiedene Handelsinstrumente nicht nur für 24, sondern auch für andere Schrittzahlen gemessen. Das Beispiel ist in Abb. 7 dargestellt.

multisample

Abbild 7. Abhängigkeit der durchschnittlichen Amplitude von der Anzahl der Schritte in der Probe

Die weißen Säulen in Abb. 7 zeigen die gemessene Bewegungsamplitude für die Anzahl der Schritte von 10 bis 120 mit dem Schritt von 2 und 1000 Proben für jede Messung. Rote Linien zeigen den Referenzwert für die gegebene Schrittzahl. Wie zu erkennen ist, werden bei einer Erhöhung der Schrittzahl keine signifikanten Abweichungen vom Haupttrend beobachtet. Die Gesamtform der Messwertkurve ist ähnlich wie die der Referenzkurve. Die Messungen wurden für GBPUSD durchgeführt, aber ich habe auch für andere Instrumente recherchiert. Es gibt viele Handelsinstrumente, deren Histogrammwerte den Referenzwert überschreiten, aber der allgemeine Trend bleibt bestehen und kann durch eine nicht-lineare Gleichung beschrieben werden.

Es ist bekannt, dass es keine stabilen einfachen Gesetzmäßigkeiten auf dem Markt geben kann. Das bedeutet, dass sich die aktuellen Trendskalen ständig ändern. Gleichzeitig werden auch die flachen Skalen zum Trend.

Ich werde die durchschnittliche Amplitude für 24 Schritte aus Abb. 7 verwenden. Sie beträgt 3,86. Ich nehme an, dass die Bewegung aus einem Trend und flachen Teilen ähnlich der Sinuswelle bestehen soll. In diesem Fall ist es möglich, den Trendanteil für die mittlere Amplitude zu berechnen. Dazu sind 3,86*2=7,72 vertikale Blöcke für 24 Schritte auf 8 aufzurunden, da die Blöcke nur ganzzahlige Werte haben können. Wenn wir in den Trendbereich kommen, dann bewegt sich der Kurs in 24 Schritten 8 Blöcke vertikal. Natürlich kann sich der Kurs auch 24 Blöcke vertikal in 24 Schritten bewegen, aber das ist nicht von Bedeutung. Ich werde den Grund später erklären.

Es stellt sich heraus, dass sich der Preis innerhalb von 24 Schritten 8 Blöcke vertikal im Trendbereich bewegt. Das bedeutet, dass es eine Bewegung mit 16 Blöcken in die eine und 8 Blöcken in die andere Richtung gibt. Es ist auch bekannt, dass auf den Trendteil ein flacher Teil folgen sollte, damit die durchschnittliche Amplitude stabil bleibt (sie ist bei einer großen Anzahl von Samples recht stabil). Aber der Markt ist keine Sinuskurve. Wie wir auf Abb. 7 sehen können, wird die Anzahl der vertikalen Blöcke mit einer Erhöhung der Anzahl der Schritte erhöht. Daher nehme ich an, dass die Abweichung vom Durchschnitt, die bei weniger Schritten auftritt, bei mehr Schritten zum Durchschnitt zurückkehrt.

Mit dem Chart in Abb. 7 können wir festlegen, um wie viel der Preis im Durchschnitt bei 26, 28, 30, 32 und 34 Schritten abweichen sollte:

26 Schritte = 3.98; 28 Schritte = 4.11; 30 Schritte = 4.2; 32 Schritte = 4.36.

In 24 Schritten bewegt sich der Kurs bereits 8 Blöcke vertikal, in 28 Schritten sollte er aber im Durchschnitt 4,1 Blöcke vertikal durchlaufen, oder 4 Blöcke, wenn auf den ganzzahligen Wert abgerundet wird. Das heißt, ein Rollback von der vorherigen Bewegung von 4 Blöcken ist in den nächsten 4 Schritten möglich. Der Markt ist nicht so vorhersehbar und es ist unwahrscheinlich, dass sich die Ereignisse nach diesem Szenario entwickeln. Das gleiche Chart auf Abb. 7 erlaubt uns zu definieren, dass der Preis in 116 Schritten im Durchschnitt 8 Blöcke vertikal durchläuft.

Rollback 1

Rollback 2

Abb. 8. Mögliche Szenarien

Abb. 8 zeigt zwei mögliche Szenarien. Dies sind zwei extreme Optionen. Sie sind unwahrscheinlich und dienen der Veranschaulichung. Höchstwahrscheinlich sollten die Ereignisse einem der mittleren Szenarien folgen. Das Wichtigste ist nun, dass wir wissen, wie viel der Preis innerhalb jeder Anzahl von Schritten im Durchschnitt passieren sollte. Wie wir sehen können, je schärfer der Rollback ist, desto tiefer ist er und umgekehrt.

Auf lange Sicht tendiert die Amplitude zu ihrem Durchschnittswert. Für 24 Schritte sind dies 3,8 vertikale Blöcke, für 116 Schritte sind es 8 vertikale Blöcke.

Dies ist die Struktur des Modells, die es erlaubt, die Rollback-Charakteristik spezifisch für jedes Handelsinstrument auf Basis der Trendbewegungsparameter und des weiteren Kursverhaltens zu berechnen. Je schärfer die Trendbewegung und je schneller der Rollback, desto tiefer wird er. Je flacher der Trend und je größer der Rollback, desto flacher die Tiefe. All dies kann nun in Zahlen ausgedrückt werden, wobei die statistischen Parameter des Instruments als Grundlage dienen.

Rollback

Abb. 9. Die Trendbewegung und die Rollback-Tiefe

Abb. 9 zeigt, wie dies in einem realen Chart aussieht. Wir können von links die scharfe Bewegung und den scharfen Rollback sehen. Die Rollbacktiefe beträgt mehr als 60 %. Auf der rechten Seite gibt es eine sanftere Bewegung und einen längeren Rollback, der zu einem Rollback von 30% führt. Dies geschieht, weil der Preis in der Abbildung rechts eine größere Anzahl von Schritten durchläuft und seine Amplitude während der Bildung der Bewegung zunimmt.

Die Gründe für dieses Verhalten lassen sich nicht nur dadurch erklären, dass die Preisreihe eine durchschnittliche Amplitude hat, an die sie sich hält, sondern auch dadurch, dass scharfe Bewegungen durch einen scharfen Zu-/Abfluss des Kapitals in einen Vermögenswert um Beträge verursacht werden, die die aktuelle Liquidität deutlich übersteigen. Nachdem eine Position für einen großen Betrag geöffnet wurde, sollte sie geschlossen werden. Es spielt keine Rolle, wem der Betrag gehört — einem Teilnehmer oder mehreren. Wenn wir die Position für den gesamten Betrag sofort schließen, kehrt der Preis auf das ursprüngliche Niveau zurück, d.h. der Rollback beträgt 100%. Wird die Position jedoch schrittweise mit Rücksicht auf die eingehende Liquidität geschlossen, dann verursacht ein größerer Betrag eine kleinere Bewegung. Je schneller ein Händler die Position schließt, desto stärker ist der Rollback von der Bewegung, die durch sein Kapital entstanden ist.

Es ist wichtig, dass das Muster durch die fundamentalen Eigenschaften der Preisbildung bestätigt wird. 

Die gesamte Theorie wird in diesem Abschnitt nicht beschrieben, aber es reicht, um mit der Entwicklung des Algorithmus zu beginnen. Der Rest wird im weiteren Verlauf beschrieben.

Verfolgen des Trends

Wie in den vorhergehenden Algorithmen soll der Roboter eine Gegen-Trend-Bewegung handeln und eine Position wird aus einer Serie von Aufträgen gebildet. Der Algorithmus soll das Eröffnungssignal der Serie generieren und seine Aufgabe ist es, den Einstiegspunkt so genau wie möglich zu bestimmen. Im Idealfall kann pro Zeiteinheit umso mehr Gewinn erzielt werden, je häufiger das Signal zu Beginn der Serie generiert wird. Das bedeutet, dass das Signal häufig und von hoher Qualität sein sollte.

Der Roboter wird die Anzahl der Auf- und Abwärtsblöcke analysieren. Wenn er eine signifikante Abweichung in der Anzahl der Aufwärtsblöcke vom Normalwert findet, dann generiert er ein Signal für eine Serie von Verkaufspositionen. Das Gleiche gilt für die Abwärtblöcke. Ihre Abweichung führt zur Generierung des Signals für die Kauf-Serie.

Jetzt werde ich den Grundalgorithmus entwickeln, der später modifiziert werden soll, deshalb sollen seine Module flexibel sein. Das Serienstartsignal soll auf das Überschreiten des Schwellenwerts des Prozentwertes der Auf-/Abwärtsböcke basieren. Die Anzahl der Blöcke für die Analyse soll im Bereich vom Minimalwert bis zum Maximalwert eingestellt werden, wie bei den bisherigen Algorithmen. Allerdings wird dies hier für andere Zwecke getan.

Der Schwellenprozentsatz für den Start und das Ende der Serie

Da der Blockbereich für die Analyse verwendet wird (z.B. 24-34), wäre es falsch, einen festen Schwellenprozentsatz für jede Anzahl von Blöcken zu verwenden. Die Wahrscheinlichkeit der Kombination aus 24 Blöcken mit dem 75%igen Überschuss der vorherrschenden Blöcke ist nicht gleich der Wahrscheinlichkeit des Auftretens einer solchen Kombination für 34 Blöcke. Die Wahrscheinlichkeit der Kombinationen ist gleich, was bedeutet, dass der angewandte Schwellenprozentsatz dynamisch sein sollte und von der Wahrscheinlichkeit einer solchen Kombination abhängt.

In den Einstellungen soll der Schwellenwert-Prozentsatz durch die Wahrscheinlichkeit, in den Bereich zu fallen, festgelegt werden. Dann soll er für die notwendige Anzahl von Blöcken neu berechnet werden. Die Wahrscheinlichkeit, in den Bereich zu fallen, wird nach den Regeln der Kombinatorik berechnet. Ich habe eine Tabelle erstellt, die es erlaubt, die Wahrscheinlichkeit in einen Schwellenprozentsatz für jede Anzahl von Blöcken umzuwandeln. 

Wahrscheinlichkeitstabelle

Abb. 10. Wahrscheinlichkeitstabelle

Abb. 10 zeigt die Tabelle zur Neuberechnung der Wahrscheinlichkeit, in den Öffnungsprozentbereich zu fallen. Die Tabelle geht davon aus, dass 100 % der Bewegungen in den Bereich von 0-16 vertikalen Blöcken von 16 Schritte fallen. Die Wahrscheinlichkeit, in den Bereich von 2,1 % zu fallen (für die Tabelle in Abb. 10), bedeutet, dass nur 2,1 % aller Bewegungen in 16 Schritten 10-16 Blöcke vertikal passieren. Stellen Sie in den Einstellungen die Wahrscheinlichkeit ein, in den Bereich zu fallen, z. B. 2,2. Der Algorithmus sucht anhand der Tabelle den nächstgelegenen Wert kleiner oder gleich 2,2 und nimmt den diesem Wert entsprechenden Prozentsatz. Momentan sind es 81,25 %. Somit hat jede Anzahl von Blöcken ihren eigenen Schwellenprozentsatz. Die Tabelle ist dem Artikel im Format .xlsx angehängt.

In den vorherigen Versionen wurden die Positionen geschlossen, wenn der Gesamtgewinn der offenen Positionen kleiner als der Schwellenwert wurde. Dies ist nicht die beste Lösung, da sie mehrere Probleme verursacht. Da ich in dieser Version mit Blöcken einer festen Größe arbeite, können Positionen geschlossen werden, wenn der Überschussprozentsatz auf den erforderlichen Wert sinkt. Wenn Positionen mit einer festen Anzahl von Blöcken geöffnet werden, wird die Anzahl der Blöcke in der Probe während des Betriebs erhöht. 

Der Schwellenprozentsatz für das Schließen wird ebenfalls über die Wahrscheinlichkeit, in den Bereich zu fallen, berechnet. Aber die Wahrscheinlichkeit, in den Bereich zu fallen, hat eine inverse Skala. Dies hat jedoch wenig Bedeutung. In der Tabelle gibt es eine eigene Spalte für die Berechnung des Schließungsprozentsatzes. Angenommen, ich möchte Positionen schließen, wenn der Wert größer oder gleich 75 wird. Dann wird der nächstgelegene Wert, der größer als 75 ist, gefunden. Für 16 Blöcke ist dies 78,9, was dem Schwellenwert Schließungsprozentsatz = 62,5 % entspricht. 

Während des Vorgangs erhöht sich die Anzahl der Blöcke in der Probe, da neue Blöcke geschlossen werden. Daher wird, solange Positionen offen sind, der Schließungsprozentsatz für eine größere Anzahl von Blöcken bei jedem neuen Block neu berechnet.

Der Take-Profit für alle Positionen in der Serie wird auf den erwarteten Schließungspunkt gesetzt. Auf diese Weise wird der Algorithmus der Steuerung des Rollbacks in Abhängigkeit vom aktuellen Marktzustand implementiert. Je mehr Blöcke in der Stichprobe nach dem Start der Serie gebildet wurden (Trendbewegung), desto geringer ist der resultierende Rollback.

Die aktuelle Implementierung der Schwellenprozente ist nicht perfekt. Sie wurde ganz am Anfang der Entwicklung des Algorithmus entwickelt. Später werde ich die Methode überarbeiten. Alle Prozentsätze des Öffnens/Schließens sollten basierend auf der Messung der durchschnittlichen Amplitude für die aktuelle Anzahl von Blöcken angepasst werden. In der aktuellen Version habe ich nicht berücksichtigt, dass die Parameter der Preisreihen für einen steigenden und fallenden Markt asymmetrisch sind. Das mag im FOREX keine Rolle spielen, aber für den Aktienmarkt ist es wichtig. Ich werde dies in den zukünftigen Versionen des Algorithmus berücksichtigen.

Die Methodik des Schwellenprozentsatzes ist entwickelt worden, so dass wir jetzt in der Lage sind, die Frage nach dem notwendigen Schwellenprozentsatz ohne Optimierung zu beantworten. Dazu wurde die folgende Gleichung entwickelt:

%open

Wir können das Verfahren nur für eine einzige Anzahl von Blöcken durchführen, während der Rest mit Hilfe der Wahrscheinlichkeitstabelle neu berechnet wird.

Der Schließungsprozentsatz kann auch im Voraus auf der Grundlage der Indikatorwerte berechnet werden.

%close;

Die Gleichung zur Berechnung des Verschlussgrades sieht gleich aus. Es wird nur ein anderer Multiplikationsfaktor Kc verwendet. Er sollte gleich 1 gemacht werden, wobei die Möglichkeit besteht, ihn anzupassen.

Basierend auf der Analyse der durchschnittlichen Amplitude gleich 3,8, können Sie den Schwellenprozentsatz der Öffnung für 24 Blöcke gleich 66,67 % einstellen. Andere Werte werden anhand der Wahrscheinlichkeitstabelle neu berechnet.

Verfolgen des Trends

Wie ich bereits erwähnt habe, hat der Markt keine stabilen Muster und keine stabile Schwankungsamplitude. Das Analysieren eines Trendgrades auf einer bestimmten Anzahl von Blöcken mit einer festen Größe ist eine fragwürdige Lösung. Das Analysefenster sollte dynamisch sein und in Echtzeit angepasst werden. Die Anzahl der Blöcke sollte im Bereich von 24-28 festgelegt werden. 

Warum habe ich ein solches Analysefenster gewählt? Diese Werte sind auf der Grundlage der durchschnittlichen Amplitude = 3,8 gewählt. Sie hängen von der prozentualen Schwelle Öffnen/Schließen ab. Mit dieser Anzahl von Blöcken nach einem Signal erhalten wir 4 Gewinnblöcke am Anfang der Serie. Je mehr Blöcke im Analysefenster sind, desto genauer ist der Algorithmus. Es gibt keinen grundsätzlichen Unterschied, wie viele Profit-Blöcke man erhält: 4 oder 10, vorausgesetzt, die Blockgröße wird proportional verändert. Da jedoch bei jedem neuen Block Positionen eröffnet werden, steigt deren Anzahl mit zunehmender Genauigkeit der Operation. Dies wird sich negativ auf die Ergebnisse auswirken. 

Als Nächstes müssen wir die minimale Blockgröße definieren, die für die Analyse sinnvoll ist. Die Blöcke werden entsprechend den gebildeten M1-Kerzen gebildet. Die minimale Diskretisierungsrate beträgt 1 Minute. Die Blöcke können nicht zu klein gemacht werden, da sie schließlich innerhalb einer Kerze gebildet werden, was eine solche Analyse sinnlos macht. Deshalb wird die minimale Blockgröße auf der Grundlage der Größe der Kerzen bestimmt. Um dies zu erreichen, können wir ATR für einen höheren Zeitrahmen, wie 1440 Minuten (Tag) oder mehr, verwenden und ihren Wert mit dem Verhältnis multiplizieren. Das Verhältnis von 2-5 sollte akzeptabel sein, obwohl es von den Eigenschaften des Handelsinstruments abhängt.

Wenn die Kerzengröße sehr ungleichmäßig ist, dann ist es besser, ein größeres Verhältnis zu verwenden. Das zweite Kriterium sind Kommissionen und Spread. Der Gewinn, den wir für 4 Blöcke erhalten, sollte deutlich höher sein als die Provisionen, die wir zahlen. Je kleiner die Blockgröße ist, desto häufiger wird es die Serien-Startsignale geben und desto mehr Gewinn können wir erzielen. Hier müssen wir ein Gleichgewicht finden. Letztendlich hängt die minimale Blockgröße von der Kerzengröße und den Provisionen ab. Es gibt klare Kriterien für die Auswahl der minimalen Blockgröße.

Die beschriebene Methode zur Auswahl der Blockgröße ist sowohl in der Theorie als auch in der Praxis gut genug. Allerdings habe ich bereits einen verbesserten Mechanismus, der auf dem verbesserten Marktmodell basiert. Die Erläuterung des neuen Mechanismus erfordert einen separaten Artikel, daher beschränke ich mich hier auf die oben beschriebene Methode.

Wenn der Roboter eine bestimmte Anzahl von Blöcken mit einer festen Größe analysiert, wird er nicht profitabel sein, weil sich die Marktparameter immer ändern, Markttrends und Rollbacks unterschiedlich groß sind, also brauchen wir einen adaptiven Mechanismus.

Der Roboter analysiert Blöcke mit der Mindestgröße. Wenn er einen kleinen Trendbereich findet, bei dem der Überschussprozentsatz den Schwellenwert überschreitet, sollte er die maximale Größe für das Vorhandensein eines Trends definieren. Dazu sollte ein größerer Bereich gescannt werden. Da die Anzahl der Blöcke für die Analyse festgelegt ist, müssen wir die Blockgröße erhöhen und sehen, was bei der größeren Blockgröße passiert. Ich habe die minimale Blockgröße TF1 genannt, ähnlich wie den Zeitrahmen. Dies ist ein synthetischer Block-Zeitrahmen. Größere Blöcke werden mit dem Multiplikationsverhältnis, KTF, ermittelt. Zum Beispiel mit 1,1.

1. Startsignal der Serie

Es ist notwendig, das Konzept eines Basiszeitrahmens einzuführen (hier und im Folgenden sind Blockzeitrahmen gemeint, wenn von Zeitrahmen die Rede ist). Der Basis-Zeitrahmen ist derjenige, auf dem das Serien-Startsignal erkannt wurde.

Der Algorithmus sollte mehrere zusätzliche Block-Zeitrahmen erstellen und auf höheren Zeitrahmen nach einem Serien-Startsignal suchen. 

Im Falle von KTF=1,1 reicht es aus, die nächsten 5 Zeitrahmen zu betrachten. Der größte Zeitrahmen-Block wird also 1,6-mal größer sein als der kleinste Zeitrahmen-Block. Wenn einer der höheren Zeitrahmen eine Signalstartreihe aufweist, wechselt der Algorithmus zu diesem Zeitrahmen und macht ihn zum Basis-Zeitrahmen. Nachdem wir den Basis-Zeitrahmen gefunden haben, müssen wir wieder 5 größere Zeitrahmen erstellen und das Scannen wiederholen. Auf diese Weise können wir den maximalen Zeitrahmen finden, bei dem der Schwellenwert überschritten wird.


Arbeitsweise

Animation 1

In diesem Stadium besteht die Aufgabe darin, den maximale Zeitrahmen zu finden, der ein Signal für den Beginn der Serie aufweist, und es zur Grundlage zu machen. Animation 1 zeigt, wie das funktioniert. Wir können sehen, dass der Algorithmus nach kleinen Blöcke sucht. Sobald das Signal gefunden wird, vergrößert er die Blockgröße und wählt den Basiszeitrahmen mit der maximalen Blockgröße aus. Er berechnet den Rollback für das Schließen von Positionen für den größten Trend, den er ermitteln konnte.

An diesem Punkt wird es wichtig, den Blocknummernbereich anstelle eines festen Wertes zu verwenden. Im Beispiel wird das Signal für den Bereich von 24-28 Blöcken gesucht. Eine Probe mit einer großen Anzahl von Blöcken wird als Priorität betrachtet. Wenn das Signal sowohl bei 24 als auch bei 28 Blöcken erkannt wird, werden 28 Blöcke zum Basis-Sample. Ebenso verhält es sich mit weiteren Zeitrahmen: Das Signal wird im Bereich von 24-28 Blöcken gesucht. Ein Zeitrahmen mit einer großen Blockgröße wird als Priorität betrachtet. Innerhalb dieses Zeitrahmens wird der Stichprobe mit einer großen Anzahl von Blöcken der Vorrang gegeben.

Ein solcher Mechanismus ist erforderlich, weil es eine gewisse Ungenauigkeit bei der Konstruktion der Blöcke gibt. Ein Zeitrahmen mit einer großen Blockgröße deckt nicht immer einen größeren Datenbereich ab.

Größenfehler

Abb. 11. Ungenauigkeit der Blockkonstruktion

Abb. 11 zeigt, dass 10 größere Blöcke möglicherweise weniger Daten abdecken als 10 kleinere Blöcke. Der Bereich der Anzahl der analysierten Blöcke von 24-28 wird verwendet, um diesen Effekt zu minimieren. Der Roboter kann zu einem größeren Basiszeitrahmen übergehen und die Anzahl der Blöcke in der Stichprobe erhöhen. Danach wird es für ihn einfacher sein, zu einem noch größeren Zeitrahmen mit weniger Blöcken in der Stichprobe zu wechseln.

Also, warum KTF = 1,1? Je niedriger der Multiplikationsfaktor ist, desto genauer ist der Algorithmus, aber desto mehr Zeitrahmen müssen wir gleichzeitig betrachten. Um die Blockgröße um das 1,6-fache gegenüber dem Basiszeitrahmen zu erhöhen, müssen wir nur 5 Zeitrahmen betrachten. Wenn KTF = 1,05 ist, müssen wir bereits 10 Zeitrahmen betrachten, was eine zusätzliche Rechenlast darstellt. Aber je kleiner das Multiplikationsverhältnis ist, desto genauer wird es.

2. Verzögerung beim Öffnen von Positionen

Das Startsignal für die Serie wurde gefunden, aber wenn wir jetzt Positionen eröffnen, wird das Ergebnis wegen der schwachen Selbstanpassung zweifelhaft sein. Der Preis kann sich weiterhin in dieselbe Richtung bewegen und wird dies wahrscheinlich auch tun. Wir müssen sicherstellen, dass die maximale Skala gefunden wurde und der Trend vorbei ist. Um dies zu erreichen, sollte das Serienstartsignal auf dem nächsten Zeitrahmen fehlen und der Algorithmus sollte nicht in der Lage sein, den Basiszeitrahmen zu erhöhen. Das Serien-Startsignal auf dem höheren Zeitrahmen ist jetzt nicht vorhanden, aber höhere Zeitrahmenblöcke decken einen größeren Datenbereich ab und bewegen sich relativ zum Trendstart in die Vergangenheit.

Nachdem wir den Basis-Zeitrahmen definiert haben, müssen wir dem Preis Zeit geben, um ein Signal auf dem höheren Zeitrahmen zu erzeugen. Der Preis sollte sich eine ausreichende Strecke bewegen, damit wir zu einem größeren Zeitrahmen übergehen können. Wir können eine Position nur dann eröffnen, wenn genügend Zeit für die Bildung eines Signals auf dem höheren Zeitrahmen verstrichen ist, aber das Signal nicht gebildet wurde. Zuerst habe ich das Problem wie in (a) beschrieben gelöst. Dann habe ich den Mechanismus erheblich überarbeitet, und das hat die Ergebnisse stark verbessert. Ich werde es in Punkt (b) beschreiben.

a) Verzögerung entlang des Trendabschnitts

In der Regel gehen die Blöcke mit höherem Zeitrahmen tiefer in die Geschichte als die Blöcke mit einfachem Zeitrahmen. Das heißt, wir sollten warten, bis 24-28 Blöcke des höheren Zeitrahmens in den gleichen historischen Bereich passen wie 24-28 Blöcke des Basiszeitrahmens. Die Prüfung sollte bei jeder Kerze durchgeführt werden.

Verzögerung a

Abb. 12. Verzögerung beim Öffnen von Positionen, um in einen höheren Zeitbereich zu wechseln

Abb. 12 zeigt, dass wir 2 Minuten warten mussten, damit die größeren Blöcke in den von den kleineren Blöcken belegten Zeitbereich passen. Wenn das Startsignal der Serie während einer Verzögerung auf einem der höheren Zeitrahmen (wir sehen mehrere davon) erkannt wird, wird der Basiszeitrahmen erhöht und die Verzögerung wird wiederholt. Wenn der Algorithmus nach der Verzögerung nicht in der Lage ist, zum höheren Zeitrahmen überzugehen, wurde die maximale Trendskala gefunden und es ist Zeit, eine Position zu eröffnen.

Die Methode funktioniert, aber sie ist bei weitem nicht perfekt. Sie wurde in der frühen Version des Algorithmus implementiert, dessen Tests ich zeigen werde. Deshalb habe ich ihre Arbeit beschrieben. Der verbesserte Verzögerungsalgorithmus, der in (b) beschrieben wird, wurde während der Modifikation entwickelt.

b) Verzögerung basierend auf den statistischen Parametern des Geräts

Die Zielsetzung der Methode ist ähnlich der in (a) verfolgten. Die Blöcke mit höherem Zeitrahmen sollten denselben Trendabschnitt abdecken wie die Blöcke mit dem Basiszeitrahmen.

In dieser Methode werde ich statistische Parameter des Handelsinstruments verwenden, um den Zeitpunkt der Beendigung der Verzögerung zu definieren. Während der Verzögerung ist es für den Algorithmus wichtig zu definieren, dass der Trend vorbei ist, oder zu einem höheren Zeitrahmen überzugehen, oder eine Position zu eröffnen. Daher ist es am besten, die Blöcke des höheren Zeitrahmens zu verwenden, um die Verzögerungszeit zu berechnen. Da die wichtigsten statistischen Eigenschaften eines Handelsinstruments bereits im Prozentsatz des %open-Schwellenwerts berücksichtigt wurden, werde ich diesen verwenden, um die Verzögerungsdauer zu definieren.

Definieren Sie zunächst die Anzahl der Blöcke, die der Preis beim Empfang des Serien-Startsignals (Vb) vertikal durchläuft. Dann verwenden Sie die Blockgröße des Basis- und die des nächsten Zeitrahmens, um die Anzahl der Blöcke des höheren Zeitrahmens zu definieren, die vertikal passieren sollten, um alle Vb-Blöcke des höheren Zeitrahmens zu bilden (Nd). Danach müssen wir, da wir wissen, dass sich der Preis normalerweise nicht streng vertikal bewegt und die Art der Bewegung kennen, die Anzahl der Verzögerungsblöcke des höheren Zeitrahmens (Nbd) berechnen.

Formel der Verzögerung;

Beispiel: Es sei mbn=24; %open=75; BSB=0,00064; Bsd= 0,0007. Dann ist Vb=18. Das bedeutet, dass 18 von 24 Blöcken die gleiche Richtung haben sollten. Berechnen wir die Anzahl der Punkte, die sich der Preis innerhalb von 18 Blöcken auf dem Basiszeitrahmen bewegt. 18*BSB = 0,01152. Berechnen wir, um wie viel Punkte sich der Preis innerhalb von 18 Blöcken des höheren Zeitrahmens bewegt. 18*Bsd = 0,0126. Bestimmen wir, wie viele Punkte fehlen, um alle Blöcke des höheren Zeitrahmens zu bilden. 0.0126-0.01152=0.00108. Teilen wir den erhaltenen Wert durch die Größe des höheren Zeitrahmenblocks. Nd=0.00108/0.0007=1.54. Es stellt sich heraus, dass 1,54 Blöcke fehlen, um zum höheren Zeitrahmen überzugehen.

Der erhaltene Wert ist gültig, wenn sich der Preis streng vertikal bewegt, was nicht der Fall ist. Von 24 Blöcken liegen nur 18 in einer Richtung und 6 in einer anderen. Deshalb sollte man 1,5 Blöcke in die richtige Anzahl der Blöcke für das Handelsinstrument umrechnen. Auf diese Weise erhalten wir Nbd = 3. In Wirklichkeit müssen wir also angesichts der Charakteristik der Trendbewegung dieses Handelsinstruments auf die Bildung von drei Blöcken mit höherem Zeitrahmen warten.

Allerdings ist es nicht die effizienteste Lösung, einfach auf die notwendige Anzahl von Verzögerungsblöcken (3 Blöcke im Beispiel) zu warten. Es ist sinnvoll, nur dann zu warten, wenn sich der Preis in die Richtung des erkannten Trends bewegt und der Übergang zu einem höheren Zeitrahmen möglich ist. Wir müssen die minimale Anzahl von Nd-Blöcken mit der Bsd-Blockgröße multiplizieren und die notwendige Anzahl von Punkten aus dem Basiszeitrahmen-Blockschlusskurs in Richtung des Trends heraussuchen. Dies soll der Referenzpunkt sein, den der Preis erreichen sollte, um den Übergang zum höheren Zeitrahmen zu ermöglichen. Nun müssen wir nach dem Schließen jedes neuen Blocks des höheren Zeitrahmens prüfen, ob die verbleibenden Blöcke ausreichen, damit der Preis den Referenzpunkt erreicht. 

Zum Beispiel: Nbd = 3 Blöcke, der Trend ist abwärts. Der Referenzpunkt befindet sich 1,54 Blöcke unter dem Preis des Basiszeitrahmen-Blockschlusses. Der fallende Block des höheren Zeitrahmens wurde gebildet, gefolgt von dem wachsenden Block. Ein Verzögerungsblock bleibt übrig. Es hat keinen Sinn, weiter zu warten. Wenn ein weiterer Verzögerungsblock gebildet wird, wird er nicht in der Lage sein, den Referenzpunkt zu überschreiten. Es macht keinen Sinn, die Verzögerung fortzusetzen. Der Übergang zu einem höheren Zeitrahmen wird nicht stattfinden, wir können eine Position eröffnen. 

All dies wird in Animation 2 gezeigt.

Arbeitsweise 2

Animation 2

Ich habe eine Sinuswelle als Beispiel genommen. Die aktuelle Version ist nicht in der Lage, die statistischen Eigenschaften eines Handelsinstruments zu definieren. Also habe ich die Eröffnungs- und Schlussprozente manuell eingestellt. Diese Fähigkeit wird in den kommenden Versionen implementiert werden. Der Algorithmus soll das Handelsinstrument selbständig definieren. Er definiert die Blockgröße und den Zeitpunkt der Positionseröffnung.

Wir können sehen, dass der Test mit kleinen Blöcken beginnt. Als Nächstes erhöht der Algorithmus die Größe der Blöcke, während er den Trend verfolgt. Eine Position wird nach der Definition der maximalen Trendgröße eröffnet. Der Rollback vom Trend wird anschließend berechnet. Für eine Sinuswelle beträgt der Rollback 100 %, deshalb wird der Schlusspunkt berechnet und der Take-Profit gesetzt. Ich habe die Sinuswelle zur Visualisierung und zum einfacheren Verständnis des Arbeitsprozesses gewählt. Der Algorithmus nutzt fast die gesamte Amplitude der Sinuswelle, um einen Gewinn zu erzielen, mit Ausnahme eines kleinen Abschnitts des zweiten Blocks am Anfang eines neuen Trendabschnitts.

3. Verfolgung der Serie

Nach der Eröffnung der ersten Position in der Serie sucht der Algorithmus weiter nach der Möglichkeit, auf den höheren Zeitrahmen überzugehen, um seine Arbeit anzupassen und im Falle der Trendfortsetzung zu höheren Zeitrahmen überzugehen. Natürlich wird es Fälle geben, in denen einige Positionen auf einem niedrigeren Zeitrahmen eröffnet werden, während einige auf einem höheren eröffnet werden. Die Rollback-Größe wird immer aus dem größten Trend berechnet, den der Roboter findet.

Der resultierende Algorithmus ignoriert zwei extreme Marktbedingungen. Wenn sich der Markt in einer Flaute befindet und es keinen Trend auf irgendeiner Skala gibt (was nicht typisch für das Handelsinstrument ist), startet der Roboter die Serie nie. Aber wenn sich der Markt in einem stabilen Trend befindet, wie z.B. während starker Auf- oder Abwärtsbewegungen des Marktes, ist der Algorithmus nicht in der Lage, eine Position zu eröffnen, da er den Zeitrahmen kontinuierlich erhöht, bis der Trend vorbei ist. In diesem Fall werden die Kriterien für die Trendbeendigung im Verhältnis zum Ausmaß des Trends selbst und der Änderung der statistischen Eigenschaften des Handelsinstruments angepasst.

Schlussfolgerung

Das Hauptziel ist es, einen Algorithmus zu entwickeln, der in der Lage ist, mit allen ihm zugeführten Daten umzugehen. Wenn die Eingabedaten nicht zu seinen Robustheitskriterien passen, wird er nicht handeln. Mit anderen Worten, die Aufgabe besteht nicht darin, einen profitablen Algorithmus für einen bestimmten Markt zu entwickeln und zu versuchen, die Preisrichtung vorherzusagen. Die Aufgabe besteht vielmehr darin, den Algorithmus unter bestimmten Bedingungen und statistischen Eigenschaften der Preisreihen profitabel zu machen. Er soll nur dann handeln, wenn diese Bedingungen erfüllt sind. Wenn wir die Bedingungen kennen, bei denen der Algorithmus mit Gewinn handelt, gibt es keine Notwendigkeit zu handeln, wenn diese Bedingungen nicht erfüllt sind. Nachdem ein solcher Algorithmus erstellt wurde, sollte er mit Wissen über die Nuancen der Marktpreisbildung ausgestattet werden, um die Effizienz des Algorithmus zu verbessern.

Die beschriebenen Funktionen sind noch nicht ausreichend für einen stabilen automatischen Betrieb, aber ein grundlegendes theoretisches Modell und eine Basis für den Betrieb des Algorithmus wurden bereits entwickelt. Der Umfang der abgeschlossenen Arbeit ist beträchtlich. Es ist schwierig, alles in einen Artikel zu packen. Deshalb werde ich den Rest der Funktionen und Tests in den kommenden Artikeln beschreiben. 

Die Parameter der entwickelten Funktionen sind in die Einstellungen verschoben worden, damit sie angepasst werden können. Die Gründe für die Einstellung eines bestimmten Wertes in den Einstellungen für den Algorithmusbetrieb haben eine sehr spezifische Erklärung oder sogar Gleichungen, mit denen sie berechnet werden. Im endgültigen Algorithmus wird es viele Einstellungen geben. Sie werden benötigt, um den Algorithmus selbst zu konfigurieren, da er recht komplex sein soll und seine einzelnen Module effektiv miteinander interagieren sollen. Die Einstellungen in diesem Algorithmus sind nicht dazu gedacht, die Leistungsparameter an die Historie anzupassen. Sie sind dazu gedacht, den Betrieb und die Interaktion der Module zu optimieren.

Die Codes der Indikatoren, die Blöcke im Chart- und Indikatorfenster bilden, sind dem Artikel beigefügt. Es handelt sich um die gleichen Indikatoren, die sich in ihrer Darstellung unterscheiden. Ich habe auch die technischen Anforderungen für diese Indikatoren und die vollständigen technischen Anforderungen für die frühere Version des Algorithmus beigefügt.

Frühere Artikel zu diesem Thema

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