Diskussion zum Artikel "Techniken des MQL5-Assistenten, die Sie kennen sollten (Teil 02): Kohonen-Karten"

 

Neuer Artikel Techniken des MQL5-Assistenten, die Sie kennen sollten (Teil 02): Kohonen-Karten :

Der Händler von heute ist ein Philomath, der fast immer (entweder bewusst oder unbewusst...) nach neuen Ideen sucht, sie ausprobiert, sich entscheidet, sie zu modifizieren oder zu verwerfen; ein explorativer Prozess, der einiges an Sorgfalt kosten sollte. Dies legt eindeutig einen hohen Stellenwert auf die Zeit des Händlers und die Notwendigkeit, Fehler zu vermeiden. Diese Artikelserie wird vorschlagen, dass der MQL5-Assistent eine Hauptstütze für Händler sein sollte. Warum? Denn der Händler spart nicht nur Zeit, indem er seine neuen Ideen mit dem MQL5-Assistenten zusammenstellt, und reduziert Fehler durch doppelte Codierung erheblich. Er ist letztendlich so eingestellt, dass er seine Energie auf die wenigen kritischen Bereiche seiner Handelsphilosophie konzentriert.

Ein häufiges Missverständnis bei diesen Karten ist, dass die Funktordaten ein Bild oder zweidimensional sein sollten. Bilder wie das folgende werden oft als repräsentativ für die Kohonen-Karten angesehen.

typisches_Bild

Es ist zwar nicht falsch, aber ich möchte betonen, dass der Funktor eine einzige Dimension haben kann und vielleicht auch sollte (für Händler). Anstatt also unsere hochdimensionalen Daten auf eine 2D-Karte zu reduzieren, werden wir sie auf eine einzelne Linie abbilden. Kohonen-Karten sind per Definition dazu gedacht, die Dimensionalität zu reduzieren, daher möchte ich in diesem Artikel einen Schritt weiter gehen. Die Kohonen-Karte unterscheidet sich von normalen neuronalen Netzen sowohl durch die Anzahl der Schichten als auch durch den zugrunde liegenden Algorithmus. Es handelt sich um eine einschichtige (in der Regel lineare 2D-Gitter, wie bereits erwähnt) Menge von Neuronen anstelle mehrerer Schichten. Alle Neuronen dieser Schicht, die wir als Funktor bezeichnen, sind mit dem Feed verbunden, aber nicht mit sich selbst. Das bedeutet, dass die Neuronen nicht direkt von den Gewichten der anderen Neuronen beeinflusst werden, sondern nur in Bezug auf die Feed-Daten aktualisiert werden. Die Funktordatenschicht ist häufig eine "Landkarte", die sich bei jeder Trainingsiteration in Abhängigkeit von den eingespeisten Daten neu organisiert. So hat jedes Neuron nach dem Training eine gewichtsangepasste Dimension in der Funktorschicht, die es ermöglicht, den euklidischen Abstand zwischen zwei beliebigen Neuronen zu berechnen.

Autor: Stephen Njuki

 

Eine Frage bleibt, wie können wir verstehen, warum der IN_RADIUS-Wert genommen wird, um die Daten zu normalisieren:

double _dimension=fabs(IN_RADIUS)*((Low(StartIndex()+w+Index)-Low(StartIndex()+w+Index+1))-(High(StartIndex()+w+Index)-High(StartIndex()+w+Index+1))))/fmax(m_symbol.Punkt(),fmax(Hoch(StartIndex()+w+Index),Hoch(StartIndex()+w+Index+1))-fmin(Tief(StartIndex()+w+Index),Tief(StartIndex()+w+Index+1))));

weil der Clusterradius eine Konstante ist und einen positiven Wert hat.

Vielleicht ist dies ein Fehler und der gesamte Zähler sollte modulo genommen werden?

 

Ich habe den Expert Advisor zusammengestellt, aber zwei Parameter Stop Loss und Take Profit sind nicht die gleichen wie auf dem Screenshot im Artikel:

In diesem Artikel.

Ich habe

Das Ergebnis ist, dass kein einziger Handel...

Mache ich etwas falsch?

Und wie kann ich einen anderen Indikator anstelle von ATR verwenden, zum Beispiel MACD?

 
Oleg Pavlenko #:

Ich habe den Expert Advisor erstellt, aber die beiden Parameter Stop Loss und Take Profit sind nicht dieselben wie auf dem Screenshot im Artikel:

Als Ergebnis, nicht ein einziger Handel...

Mache ich etwas falsch?

Und wie kann ich einen anderen Indikator anstelle von ATR verwenden, zum Beispiel MACD?

Sie können es so machen:

bool CSignalMACD::InitMACD(CIndicators *indicators)
  {
//--- Objekt zur Sammlung hinzufügen
   if(!indicators.Add(GetPointer(m_MACD)))
     {
      printf(__FUNCTION__+": error adding object");
      return(false);
     }
//--- Objekt initialisieren
   if(!m_MACD.Create(m_symbol.Name(),m_period,m_period_fast,m_period_slow,m_period_signal,m_applied))
     {
      printf(__FUNCTION__+": error initializing object");
      return(false);
     }
//--- ok
   return(true);
  }

auch im geschützten Bereich:

protected:
   CiMACD            m_MACD;           // objekt-oszillator
   //--- angepasste Parameter
   int               m_period_fast;    // der Parameter "Periode des schnellen EMA" des Oszillators
   int               m_period_slow;    // der Parameter "Periode des langsamen EMA" des Oszillators
   int               m_period_signal;  // der Parameter "Mittelungszeit der Differenz" des Oszillators
   ENUM_APPLIED_PRICE m_applied;       // der Parameter "Preisreihen" des Oszillators

und im öffentlichen Bereich:

 void              PeriodFast(int value)             { m_period_fast=value;           }
 void              PeriodSlow(int value)             { m_period_slow=value;           }
 void              PeriodSignal(int value)           { m_period_signal=value;         }
 void              Applied(ENUM_APPLIED_PRICE value) { m_applied=value;  

und wieder im geschützten Bereich:

protected:
   //--- Methode zur Initialisierung des Oszillators
   bool              InitMACD(CIndicators *indicators);
   //--- Methoden zum Abrufen von Daten
   double            Main(int ind)                     { return(m_MACD.Main(ind));      }
   double            Signal(int ind)                   { return(m_MACD.Signal(ind));    }

und schließlich:

bool CSignalKM::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration)
  {
   CExpertSignal *general=(m_general!=-1) ? m_filters.At(m_general) : NULL;
//---
   if(general==NULL)
     {
      m_MACD.Refresh(-1);
      //--- wenn nicht ausdrücklich ein Basispreis angegeben wird, wird der aktuelle Marktpreis genommen
      double base_price=(m_base_price==0.0) ? m_symbol.Ask() : m_base_price;

      //--- Preisüberladung, die den Einstiegspreis auf Basis des MACD festlegt
      price      =base_price;
      double _range=m_MACD.Main(StartIndex())+((m_symbol.StopsLevel()+m_symbol.FreezeLevel())*m_symbol.Point());
      //

Aber was soll das bringen?