English Русский 中文 Español 日本語 Português
preview
Kategorientheorie in MQL5 (Teil 18): Natürliches Quadrat (Naturality Square)

Kategorientheorie in MQL5 (Teil 18): Natürliches Quadrat (Naturality Square)

MetaTrader 5Tester | 9 Oktober 2023, 14:47
255 0
Stephen Njuki
Stephen Njuki

Einführung

Die Bedeutung der Kategorientheorie in MQL5 für Händler ist zwangsläufig subjektiv, und bisher haben wir in dieser Serie ihren systemweiten Ansatz verwendet, indem wir Morphismen über Objekte betonten, um Prognosen und Klassifizierungen von Finanzdaten zu erstellen.

Die natürlichen Transformationen, ein zentraler Begriff in der Kategorientheorie, werden oft einfach als eine Abbildung zwischen Funktoren (Mathematik) verstanden. Diese umständliche Sichtweise ist zwar nicht falsch, kann aber zu einiger Verwirrung führen, wenn man davon ausgeht, dass ein Funktor zwei Objekte miteinander verbindet, denn dann stellt sich die Frage, welche Objekte eine natürliche Transformation verbindet. Die kurze Antwort lautet, dass es sich um die beiden Codomain-Objekte der Funktoren handelt, und in diesem Artikel werden wir versuchen, einen Aufbau zu zeigen, der zu dieser Definition führt, und auch eine Instanz der Expert-Trailing-Klasse einbeziehen, die diesen Morphismus zur Vorhersage von Volatilitätsänderungen verwendet.

Die Kategorien, die als Beispiele zur Veranschaulichung der natürlichen Transformationen verwendet werden, sind zwei, was die Mindestanzahl für ein Paar von Funktoren ist, die zur Definition einer natürlichen Transformation verwendet werden. Das erste besteht aus zwei Objekten, die aus normalisierten Indikatorwerten bestehen. Die Indikatoren, die wir in Betracht ziehen, sind die Werte von ATR und der Bollinger Bands. Die zweite Kategorie, die als Codomain-Kategorie dient, da die beiden Funktoren zu ihr führen, wird vier Objekte enthalten, die die Preisspannen der Werte erfassen, die wir vorhersagen wollen.


Kategorien verstehen

Die Kategorie der Indikatorwerte wird in unserem Artikel nur erwähnt, um das Verständnis der hier dargelegten Konzepte zu erleichtern. Letztendlich spielt sie bei der Vorhersage der Volatilität, die wir erleben, eine minimale bis gar keine Rolle.

Anmerkungen zu den Anhängen

Kopieren Sie die Dateien „SignalCT_16_.mqh“ in den Ordner „MQL5\include\Expert\Signal\“ und die Datei „ct_16.mqh“ in den Ordner „MQL5\include\“.

Außerdem sollten Sie diese Anleitung zur Zusammenstellung eines Expert Advisors mit Hilfe des Assistenten befolgen, da Sie sie als Teil eines Expert Advisors zusammenstellen müssen. Wie im Artikel erwähnt, habe ich keinen Trailing Stop und eine feste Marge für das Money Management verwendet, die beide Teil der MQL5-Bibliothek sind. Wie immer ist das Ziel dieses Artikels nicht, Ihnen einen Gral zu präsentieren, sondern vielmehr eine Idee, die Sie an Ihre eigene Strategie anpassen können.

Wir werden uns dabei in erster Linie auf das natürliche Quadrat (naturality square) verlassen. Nichtsdestotrotz ist es von grundlegender Bedeutung. Es gibt nicht viele endgültige Informationen über das natürliche Quadrat (naturality square), die online verfügbar sind, aber dieses Post könnte eine interessante Lektüre für diejenigen sein, die auf der Suche nach weiteren Ressourcen zu diesem Thema sind, die über das hinausgehen, was hier mitgeteilt wird.

Zurück zu unserer Domänenkategorie, die wie erwähnt zwei Objekte enthält, eines mit ATR-Werten und das andere mit Bollinger-Band-Werten. Diese Werte sind so normiert, dass die Objekte eine feste Kardinalität (Größe) haben. Die in den einzelnen Objekten dargestellten Werte sind die jeweiligen Änderungen der Indikatorwerte. Diese Änderungen werden in 10%-Schritten von minus 100% bis plus 100% protokolliert, was bedeutet, dass die Kardinalität jedes Objekts 21 beträgt. Sie umfassen daher die folgenden Werte:

{

-100, -90, -80, -70, -60, -50, -40, -30, -20, -10,

 0,

 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

}

Der Morphismus, der diese elementidentischen Objekte miteinander verbindet, koppelt die Werte auf der Grundlage, ob sie zur gleichen Zeit registriert wurden, und liefert so ein aktuelles Protokoll der Änderungen der beiden Indikatorwerte.

Diese Indikator-Änderungswerte hätten auch von jedem anderen volatilitätsbezogenen Indikator stammen können. Die Grundsätze bleiben dieselben. Die Änderung des Indikatorwerts wird durch die Summe der absoluten Werte des vorherigen und des aktuellen Indikatorwerts geteilt, um einen Dezimalbruch zu erhalten. Dieser Bruch wird dann mit 10 multipliziert und auf keine Nachkommastelle gerundet. Er wird dann wieder mit 10 multipliziert und in unseren oben beschriebenen Objekten je nach dem Wert, dem er entspricht, mit einem Index versehen.

Die Kategorie der Preisspannen wird vier Objekte umfassen, die den Hauptteil des natürlicher Quadrats bilden, das wir bei der Erstellung von Projektionen verwenden werden. Da unsere Domänenkategorie (mit Indikatoränderungen) aus zwei Objekten besteht und wir zwei Funktoren haben, die von ihr zu dieser Codomäne führen, folgt daraus, dass jeder dieser Funktoren auf ein Objekt abbildet. Die Objekte, auf die abgebildet wird, müssen nicht immer eindeutig sein, aber in unserem Fall lassen wir zur Verdeutlichung unserer Konzepte zu, dass jedes Objekt, auf das in der Domänenkategorie abgebildet wird, sein eigenes Codomänenobjekt in der Kategorie Preisspannen hat. 2 Objekte mal 2 Funktoren ergeben also 4 Endpunktobjekte, die Mitglieder unserer Kodomänenkategorie.

Da wir vier Objekte haben und eine Duplizität vermeiden wollen, wird jedes Objekt einen anderen Satz von Preisbalkenbereichsänderungen protokollieren. Zu diesem Zweck werden die beiden Funktoren unterschiedliche Vorhersagedeltas darstellen. Ein Funktor bildet die Preisspanne nach einem Balken ab, während der andere Funktor die Änderungen der Preisspanne nach zwei Balken abbildet. Darüber hinaus beziehen sich die Zuordnungen des ATR-Objekts auf die Preisspannen eines einzelnen Balkens, während die Zuordnungen des Bollinger-Band-Objekts die Preisspannen von zwei Balken betreffen. Dies lässt sich in der folgenden Auflistung zusammenfassen:

      CElement<string> _e;
      for(int i=0;i<m_extra_training+1;i++)
      {
         double _a=((m_high.GetData(i+_x)-m_low.GetData(i+_x))-(m_high.GetData(i+_x+1)-m_low.GetData(i+_x+1)))/((m_high.GetData(i+_x)-m_low.GetData(i+_x))+(m_high.GetData(i+_x+1)-m_low.GetData(i+_x+1)));
         double _c=((m_high.GetData(i+_x)-m_low.GetData(i+_x))-(m_high.GetData(i+_x+2)-m_low.GetData(i+_x+2)))/((m_high.GetData(i+_x)-m_low.GetData(i+_x))+(m_high.GetData(i+_x+2)-m_low.GetData(i+_x+2)));
         double _b=((fmax(m_high.GetData(i+_x),m_high.GetData(i+_x+1))-fmin(m_low.GetData(i+_x),m_low.GetData(i+_x+1)))
                     -(fmax(m_high.GetData(i+_x+2),m_high.GetData(i+_x+3))-fmin(m_low.GetData(i+_x+2),m_low.GetData(i+_x+3))))
                     /((fmax(m_high.GetData(i+_x),m_high.GetData(i+_x+1))-fmin(m_low.GetData(i+_x),m_low.GetData(i+_x+1)))
                     +(fmax(m_high.GetData(i+_x+2),m_high.GetData(i+_x+3))-fmin(m_low.GetData(i+_x+2),m_low.GetData(i+_x+3))));
         double _d=((fmax(m_high.GetData(i+_x),m_high.GetData(i+_x+1))-fmin(m_low.GetData(i+_x),m_low.GetData(i+_x+1)))
                     -(fmax(m_high.GetData(i+_x+3),m_high.GetData(i+_x+4))-fmin(m_low.GetData(i+_x+3),m_low.GetData(i+_x+4))))
                     /((fmax(m_high.GetData(i+_x),m_high.GetData(i+_x+1))-fmin(m_low.GetData(i+_x),m_low.GetData(i+_x+1)))
                     +(fmax(m_high.GetData(i+_x+3),m_high.GetData(i+_x+4))-fmin(m_low.GetData(i+_x+3),m_low.GetData(i+_x+4))));
         
         ...
      }


Diese Objekte werden nur eine Größe haben, da sie nur die aktuelle Änderung protokollieren. Die Morphismen zwischen ihnen fließen in einem Quadrat von der Umwandlung der Preisspanne von einem Balken zur Prognose der Preisspanne von zwei Balken, zwei Preisbalken voraus Mehr dazu erfahren Sie, wenn wir weiter unten natürliche Transformationen formal definieren.

Die Beziehung zwischen den Preisspannen und den bezogenen Marktdaten ist ebenfalls in unserer obigen Quelle dargestellt. Die in jedem Objekt protokollierten Änderungen werden nicht normalisiert, wie es bei den Indikatorwerten der Fall war, sondern die Änderungen im Bereich werden durch die Summe des aktuellen und des vorherigen Balkenbereichs geteilt, um einen ungerundeten Dezimalwert zu erhalten.


Die Funktoren: Verknüpfung von Indikatorwerten mit der Spannbreite der Kursbalken

Der Funktor (Mathematik) wurde bereits vor vier Artikeln in unsere Serie aufgenommen, aber hier werden sie als Paar in zwei Kategorien betrachtet. Da unsere Domänenkategorie der Indikatorwerte zwei Objekte und einen Morphismus hat, bedeutet dies, dass es in unserer Codomänenkategorie drei Ausgabepunkte gibt, zwei von einem Objekt und einen von einem Morphismus für jeden Funktor. Mit zwei Funktoren ergibt dies sechs Endpunkte in unserem Kodomain.

Die Zuordnung der normalisierten ganzzahligen Indikatorwerte zu den dezimalen Änderungen der Preisspanne, die als Brüche und nicht als Rohwerte aufgezeichnet werden, könnte mit Hilfe von mehrschichtigen Perzeptronen erfolgen, wie wir sie in den letzten beiden Artikeln untersucht haben. Es gibt noch eine ganze Reihe anderer Methoden für diese Zuordnung, die in diesen Serien noch nicht erforscht wurden, wie z. B. der Random Forest.

Diese Darstellung hier dient nur der Vollständigkeit, um genau zu zeigen, was eine natürliche Transformation ist und welche Voraussetzungen sie hat. Wenn wir als Händler mit neuen Konzepten konfrontiert werden, ist die entscheidende Frage immer, was ist die Anwendung und der Nutzen? Deshalb habe ich eingangs erklärt, dass wir uns bei unseren Prognosen auf den natürlichen Quadrat konzentrieren werden, das ausschließlich durch die vier Objekte der Codomain-Kategorie bestimmt wird. Die Erwähnung der Domänenkategorie und ihrer Objekte dient hier also lediglich der Definition natürlicher Transformationen und nicht unserer spezifischen Anwendung für diesen Artikel.


Natürliche Transformationen: Überbrücken der Lücke

Nachdem dies geklärt ist, können wir nun die Axiome der natürlichen Transformationen betrachten, um zu den Anwendungen überzugehen: Formal ist eine natürliche Transformation zwischen Funktoren

F: C --> D

und

G: C --> D

ist eine Familie von Morphismen

ηA: F(A) --> G(A)

für alle Objekte A in der Kategorie C so, dass für alle Morphismen

f: A --> B

in der Kategorie C ist das folgende Diagramm umwandelbar:


 

Es gibt eine ganze Reihe von Materialien über natürliche Transformationen im Internet, aber dennoch kann es hilfreich sein, sich eine anschaulichere Definition anzusehen, die zum natürlichen Quadrat führt. Nehmen wir zu diesem Zweck an, Sie haben zwei Kategorien C und D, wobei Kategorie C zwei Objekte X und Y hat, die wie folgt definiert sind

X = {5, 6, 7}

und

Y = {Q, R, S}

Nehmen wir außerdem an, dass es zwischen diesen Objekten einen Morphismus f gibt, der wie folgt definiert ist:

f: X à Y

sodass f(5) = S, f(6) = R, und f(7) = R.

In diesem Beispiel werden die beiden Funktoren F und G zwischen den Kategorien C und D zwei einfache Dinge tun. Erstellen Sie eine Liste bzw. eine Liste von Listen. Der Funktor F würde also, wenn er auf X angewendet wird, das Ergebnis liefern:

[5, 6, 5, 7, 5, 6, 7, 7]

und in ähnlicher Weise würde der Funktor G (Liste von Listen) ergeben:

[[5, 6], [5, 7, 5, 6, 7], [7]]

Wenn wir diese Funktoren in ähnlicher Weise auf das Objekt Y anwenden, erhalten wir 4 Objekte in der Codomain-Kategorie D. Diese werden wie unten dargestellt:



Beachten Sie, dass wir uns jetzt auf nur vier Objekte in der Kategorie D konzentrieren. Da wir zwei Objekte in unserer Domänenkategorie C haben, werden wir auch zwei natürliche Transformationen haben, jede in Bezug auf ein Objekt in C. Diese sind wie unten dargestellt:


Die obige Darstellung zeigt das natürliche Quadrat. Und es verändert sich, wie Sie an den Pfeilen erkennen können. Die beiden horizontalen Pfeile sind also unsere natürlichen Transformationen (NTs) in Bezug auf jedes Objekt in C, und die vertikalen Pfeile sind Funktoren, die auf den Morphismus f in der Kategorie C für die Funktoren F und G angewendet werden.

Die Bedeutung der Erhaltung von Strukturen und Beziehungen ist ein Schlüsselaspekt von NTs, der übersehen werden könnte, und obwohl er so einfach ist, ist er entscheidend. Betrachten wir dazu ein Beispiel aus dem Bereich der Gastronomie. Nehmen wir an, zwei berühmte Köche, nennen wir sie A und B, bereiten dasselbe Gericht auf einzigartige Weise aus einer Reihe von Standardzutaten zu. Wir würden die Zutaten als ein Objekt in einer breiteren Kategorie von Zutatenarten betrachten und die beiden Gerichte, die jeder Koch herstellt, würden ebenfalls zu einer anderen breiteren Kategorie von Gerichtstypen gehören. Nun würde eine natürliche Transformation zwischen den beiden Gerichten unserer Köche A und B die Zutaten und zusätzlichen Kochvorbereitungen protokollieren, die erforderlich sind, um das Gericht von Koch A in das von Koch B umzuwandeln. Mit diesem Ansatz erfassen wir mehr Informationen und können in der Tat überprüfen, ob beispielsweise das Gericht von Koch C ebenfalls eine ähnliche NT benötigt, um mit dem Gericht von Koch B übereinzustimmen, oder wenn nicht, um welchen Grad? Aber neben dem Vergleich würde die Bewerbung des NT für das Gericht von Koch B auch das Rezept, die Kochstile und die Methoden von Koch A erfordern. Das bedeutet, dass sie erhalten und respektiert werden. Diese Aufbewahrung ist wichtig für die Aufzeichnungen, kann aber auch ein Mittel sein, um neue Rezepte zu entwickeln oder bestehende Rezepte auf der Grundlage der Diätvorschriften einer Person zu überprüfen.


Anwendungen: Vorhersage der Volatilität

Damit können wir nun mögliche Anwendungen in der Prognostik betrachten. Die Vorhersage der nächsten Änderung der Preisspanne ist etwas, das wir in diesen Serien oft in Betracht gezogen haben, und daher sind vorläufige Erklärungen vielleicht nicht sonderbar. Aber um es noch einmal zusammenzufassen: Wir verwenden diese Prognose, um erstens festzustellen, ob wir den Trailing-Stop für offene Positionen anpassen müssen, und zweitens, um wie viel wir ihn anpassen müssen.

Die Implementierung des natürlichen Quadrats als Schlüsselwerkzeug wird mit Hilfe von mehrschichtigen Perzeptronen (MLPs) erfolgen, wie es in unseren letzten beiden Artikeln der Fall war, mit dem Unterschied, dass diese MLPs um ein kommutatives Diagramm herum aufgebaut sind. Auf diese Weise können wir unsere Prognosen überprüfen, da zwei beliebige Beine eine Projektion ergeben können. Die vier Ecken des Quadrats spiegeln die unterschiedlichen Prognosen über die zukünftige Entwicklung der Preisspanne wider. Je mehr wir uns in Richtung der Ecke D bewegen, desto mehr schauen wir in die Zukunft, wobei die Ecke A die Veränderung der Spanne nur für den nächsten Takt projiziert. Das heißt, wenn wir in der Lage sind, MLPs zu trainieren, die alle vier Ecken miteinander verbinden und die Bereichsänderung für den letzten Kursbalken verwenden, können wir Projektionen erstellen, die viel weiter in die Zukunft reichen als nur ein einzelner Balken.

Die Schritte, die bei der Anwendung unserer NTs zur Erstellung einer Vorhersage erforderlich sind, werden in der nachstehenden Auflistung hervorgehoben:

//+------------------------------------------------------------------+
//| NATURAL TRANSFORMATION CLASS                                     |
//+------------------------------------------------------------------+
class CTransformation
   {
      protected:
      
      public:
      
      CDomain<string>               domain;  //codomain object of first functor
      CDomain<string>               codomain;//codomain object of second functor
      
      uint                          hidden_size;
      CMultilayerPerceptron         transformer;
      CMLPBase                      init;
      
      void                          Transform(CDomain<string> &D,CDomain<string> &C)
                                    {
                                       domain=D;
                                       codomain=C;
                                       
                                       int _inputs=D.Cardinality(),_outputs=C.Cardinality();
                                       
                                       if(_inputs>0 && _outputs>0)
                                       {
                                          init.MLPCreate1(_inputs,hidden_size+fmax(_inputs,_outputs),_outputs,transformer);
                                       }
                                    }
      
      //
      void                          Let()
                                    {
                                       this.codomain.Let();
                                       this.domain.Let();
                                    };
      
                                    CTransformation(void){ hidden_size=1; };
                                    ~CTransformation(void){};
   };

Zunächst einmal haben wir unsere NT-Klasse oben aufgeführt. Und wie von der beiläufigen Definition würde man erwarten, dass es Instanz der beiden Funktoren, die es verknüpft, aber das, obwohl anwendbar, war nicht prägnant genug. Der Schlüssel zu den NTs sind die beiden Bereiche, die durch die Funktoren abgebildet werden, und diese werden hervorgehoben.

//+------------------------------------------------------------------+
//| NATURALITY CLASS                                                 |
//+------------------------------------------------------------------+
class CNaturalitySquare
   {
      protected:
      
      public:
      
      CDomain<string>               A,B,C,D;
      
      CTransformation               AB;
      
      uint                          hidden_size_bd;
      CMultilayerPerceptron         BD;
      
      uint                          hidden_size_ac;
      CMultilayerPerceptron         AC;
      
      CTransformation               CD;
      
      CMLPBase                      init;
      
      
                                    CNaturalitySquare(void){};
                                    ~CNaturalitySquare(void){};
   };

Das natürliche Quadrat, dessen Diagramm oben abgebildet ist, würde auch seine Klasse wie abgebildet mit Instanzen der Klasse NT darstellen lassen. Seine vier Ecken, ausgedrückt durch A, B, C und D, sind Objekte, die von der Domänenklasse erfasst werden, und nur zwei seiner Morphismen wären direkte MLPs, während die anderen beiden als NTs erkannt werden.


Praktische Umsetzung in MQL5

Die praktische Umsetzung in MQL5 ist angesichts der Verwendung von MLPs mit Herausforderungen verbunden, die vor allem darin bestehen, wie wir das Gelernte trainieren und speichern (Netzgewichte). Im Gegensatz zu den letzten beiden Artikeln werden bei diesem Artikel die Gewichte aus dem Training nicht gespeichert, d. h. bei jedem neuen Balken wird eine neue Instanz jedes der vier MLPs erzeugt und trainiert. Dies wird mit der Aktualisierungsfunktion wie unten gezeigt umgesetzt:

//+------------------------------------------------------------------+
//| Refresh function for naturality square.                          |
//+------------------------------------------------------------------+
double CTrailingCT::Refresh()
   {
      double _refresh=0.0;
      
      m_high.Refresh(-1);
      m_low.Refresh(-1);
      
      int _x=StartIndex();
      
      // atr domains capture 1 bar ranges       
      // bands' domains capture 2 bar ranges    
      // 1 functors capture ranges after 1 bar  
      // 2 functors capture ranges after 2 bars 
      
      int _info_ab=0,_info_bd=0,_info_ac=0,_info_cd=0;
      CMLPReport _report_ab,_report_bd,_report_ac,_report_cd;
      CMatrixDouble _xy_ab;_xy_ab.Resize(m_extra_training+1,1+1);
      CMatrixDouble _xy_bd;_xy_bd.Resize(m_extra_training+1,1+1);
      CMatrixDouble _xy_ac;_xy_ac.Resize(m_extra_training+1,1+1);
      CMatrixDouble _xy_cd;_xy_cd.Resize(m_extra_training+1,1+1);
      
      CElement<string> _e;
      for(int i=0;i<m_extra_training+1;i++)
      {
         ...
         
         if(i<m_extra_training+1)
         {
            _xy_ab[i].Set(0,_a);//in
            _xy_ab[i].Set(1,_b);//out
            
            _xy_bd[i].Set(0,_b);//in
            _xy_bd[i].Set(1,_d);//out
            
            _xy_ac[i].Set(0,_a);//in
            _xy_ac[i].Set(1,_c);//out
            
            _xy_cd[i].Set(0,_c);//in
            _xy_cd[i].Set(1,_d);//out
         }
      }
      
      m_train.MLPTrainLM(m_naturality_square.AB.transformer,_xy_ab,m_extra_training+1,m_decay,m_restarts,_info_ab,_report_ab);
     
      ...

      //
      if(_info_ab>0 && _info_bd>0 && _info_ac>0 && _info_cd>0)
      {
         ...
      }
      
      return(_refresh);
   }

Die obige Aktualisierungsfunktion trainiert MLPs, die mit zufälligen Gewichten initialisiert wurden, nur auf den letzten Kursbalken. Für andere Handelssysteme oder Implementierungen des gemeinsam genutzten Codes ist dies sicherlich unzureichend, jedoch kann ein Eingabeparameter „m_extra_training“, dessen Standardwert von Null für unsere Testzwecke beibehalten wird, nach oben angepasst werden, um umfassendere Tests vor der Erstellung von Prognosen zu ermöglichen.

Die Verwendung des Parameters für zusätzliches Training führt zwangsläufig zu einer Leistungsüberlastung des Experten und ist der Grund, warum das Lesen und Schreiben von Gewichten aus dem Training in diesem Artikel ganz vermieden wurde.


Vorteile und Beschränkungen

Wenn wir Tests für EURUSD auf dem täglichen Zeitrahmen vom 2022.08.01 bis 2023.08.01 durchführen, ergibt einer unserer besten Durchläufe den folgenden Bericht:

r_1


l_1

Wenn wir die Tests mit denselben Einstellungen für einen nicht optimierten Zeitraum durchführen, in unserem Fall für den Zeitraum von einem Jahr vor unserem Testbereich, erhalten wir negative Ergebnisse, die nicht die gute Leistung widerspiegeln, die wir im obigen Bericht erhalten haben. Wie man sieht, wurden alle Gewinne durch Stop-Loss erzielt.

Im Vergleich zu den Ansätzen, die wir früher in der Serie zur Projektion der Volatilität verwendet haben, ist dieser Ansatz sicherlich ressourcenintensiv und erfordert eindeutig Änderungen in der Art und Weise, wie unsere vier Objekte im natürlichen Quadrat definiert sind, um Forward Walks über nicht optimierte Zeiträume zu ermöglichen.


Schlussfolgerung

Zusammenfassend kann man sagen, dass die hier dargelegten Schlüsselkonzepte natürliche Transformationen waren. Sie sind für die Verknüpfung von Kategorien von Bedeutung, indem sie den Unterschied zwischen einem parallelen Paar von Funktoren, die die Kategorien überbrücken, erfassen. Die hier untersuchten Anwendungen dienten der Vorhersage der Volatilität unter Verwendung des natürlichen Quadrats, aber auch die Generierung von Einstiegs- und Ausstiegssignalen sowie die Positionsgrößenbestimmung sind möglich. Darüber hinaus ist es vielleicht hilfreich zu erwähnen, dass wir in diesem Artikel und in dieser Serie keine Vorwärtsläufe mit den optimierten Einstellungen durchgeführt haben. Die Chancen stehen also gut, dass sie nicht sofort funktionieren (d. h. so, wie der Code bereitgestellt wird), aber sie könnten funktionieren, sobald Änderungen vorgenommen werden, z. B. indem diese Ideen mit anderen Strategien kombiniert werden, die der Leser verwenden kann. Aus diesem Grund ist die Verwendung von MQL5-Assistenten-Klassen sehr praktisch, da sie dies nahtlos ermöglichen.


Referenzen

Wikipedia und Stack-Exchange gemäß den gemeinsamen Hyperlinks.


Anmerkungen zu den Anhängen

Kopieren Sie die Dateien „SignalCT_16_.mqh“ in den Ordner „MQL5\include\Expert\Signal\“ und die Datei „ct_16.mqh“ in den Ordner „MQL5\include\“.

Außerdem sollten Sie diese Anleitung zur Zusammenstellung eines Expert Advisors mit dem Assistenten befolgen, da Sie diese als Teil eines Expert Advisors zusammenstellen müssen. Wie im Artikel erwähnt, habe ich keinen Trailing Stop und eine feste Marge für das Money Management verwendet, die beide Teil der MQL5-Bibliothek sind. Wie immer ist das Ziel dieses Artikels nicht, Ihnen einen Gral zu präsentieren, sondern vielmehr eine Idee, die Sie an Ihre eigene Strategie anpassen können.



Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/13200

Beigefügte Dateien |
ct_18.mqh (37.71 KB)
TrailingCT_18_.mqh (17.66 KB)
Monte Carlo Permutationstests im MetaTrader 5 Monte Carlo Permutationstests im MetaTrader 5
In diesem Artikel sehen wir uns an, wie wir Permutationstests auf der Grundlage von vermischten Tick-Daten für jeden Expert Advisor durchführen können, der nur Metatrader 5 verwendet.
Kategorientheorie in MQL5 (Teil 17): Funktoren und Monoide Kategorientheorie in MQL5 (Teil 17): Funktoren und Monoide
Dieser Artikel, der letzte in unserer Reihe zum Thema Funktoren, befasst sich erneut mit Monoiden als Kategorie. Monoide, die wir in dieser Serie bereits vorgestellt haben, werden hier zusammen mit mehrschichtigen Perceptrons zur Unterstützung der Positionsbestimmung verwendet.
Tests von verschiedenen gleitenden Durchschnitten, um zu sehen, wie aufschlussreich sie sind Tests von verschiedenen gleitenden Durchschnitten, um zu sehen, wie aufschlussreich sie sind
Wir alle wissen, wie wichtig der Indikator des gleitenden Durchschnitts für viele Händler ist. Es gibt noch andere Arten von gleitenden Durchschnitten, die für den Handel nützlich sein können. Wir werden diese Arten in diesem Artikel identifizieren und einen einfachen Vergleich zwischen jeder von ihnen und dem beliebtesten einfachen gleitenden Durchschnitt anstellen, um zu sehen, welcher die besten Ergebnisse liefern kann.
Neuronale Netze leicht gemacht (Teil 38): Selbstüberwachte Erkundung bei Unstimmigkeit (Self-Supervised Exploration via Disagreement) Neuronale Netze leicht gemacht (Teil 38): Selbstüberwachte Erkundung bei Unstimmigkeit (Self-Supervised Exploration via Disagreement)
Eines der Hauptprobleme beim Verstärkungslernen ist die Erkundung der Umgebung. Zuvor haben wir bereits die Forschungsmethode auf der Grundlage der intrinsischen Neugier kennengelernt. Heute schlage ich vor, einen anderen Algorithmus zu betrachten: Erkundung bei Unstimmigkeit.