English Русский 中文 Español 日本語 Português
Automatisches Erstellen von Unterstützung- und Widerstandslinien

Automatisches Erstellen von Unterstützung- und Widerstandslinien

MetaTrader 5Handel | 28 Februar 2018, 08:55
2 977 0
Vladimir Mametov
Vladimir Mametov

Einführung

In diesem Artikel beschäftigen wir uns mit der Konstruktion von Unterstützungs- und Widerstandslinien. Die technische Analyse von Währungssymbolen ist ein wichtiger Bestandteil des Handels an den Finanzmärkten. Das automatische Erstellen dieser Linien wird die Arbeit der Finanzanalysten und Händlern vereinfachen und die technische Analyse beschleunigen. Außerdem kann der hier beschriebene Indikator zur Entwicklung von Expert Advisors verwendet werden.

Suche nach allen Hochs und Tiefs

Unterstützungs- und Widerstandslinien werden mit Hilfe der lokalen Hochs und Tiefs des Kurscharts gezeichnet. Zur Bestimmung dieser Extremwerte wird der bekannte Indikator ZigZag verwendet. Wir können die notwendigen Eigenschaften der Unterstützungs- und Widerstandslinien in seinen Eingabeparameter einstellen.

Der Maßstab der Linien kann mit den Parametern des ZigZags geändert werden, aber Sie können dieselben Parameter auf verschiedene Zeitrahmen anwenden. Dies ermöglicht es uns, die Extrema zu erhalten, die wir für den Aufbau von Unterstützungs- und Widerstandsniveaus benötigen.

Die folgenden Bilder zeigen, wie sich die Extremwerte durch andere Zeitrahmen verändern. Das erste Bild zeigt einen Ein-Minuten-Chart über einen Zeitraum von dreißig Minuten, das zweite Bild zeigt einen Vier-Stunden-Chart.




Die Auswahl der geeigneten Extremwerte zum Erstellen der Linien

Wir werden nur Unterstützungs-/Widerstandslinien bauen, die sich in der Nähe des aktuellen Preises befinden, was bedeutet, dass sie für uns in Bezug auf die technische Analyse aktuell relevant sind. Damit die Linien eine Steigung haben, die sich dem Preis annähert, verwenden wir die Extremwerte höher oder gleich dem vorherigen während eines Abwärtstrends (für Widerstandslinien) oder niedriger oder gleich dem vorherigen während eines Aufwärtstrends. Im ersten Bild sind dies die Punkte 1-2-3-4-5-7, im zweiten Bild die Punkte 1-2-3-6-7-8.

Nachdem wir nun unsere Auswahlkriterien für die Extremwerte definiert haben, sollten wir uns überlegen, sie im Code zu implementieren. Wir werden es hier nur teilweise zeigen, um die Hauptpunkte zu verdeutlichen.

//+------------------------------------------------------------------+
struct trade_points               // Definition der Struktur der Extrema
  {
   double            price;       // Preis
   int               pos;         // Index der Bars
   bool              hpoint;      // Falls wahr, ein Hoch
   bool              lpoint;      // Falls wahr, ein Tief
  };

Erstellen des Handles zum ZigZag-Indikator in der Funktion OnInit():

int OnInit()
  {

   ZZ_handle=iCustom(_Symbol,_Period,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep);

   return(INIT_SUCCEEDED);
  }

Dateneingabe in die Matrix der durch die Einzelabfrage aller Extrema des ZigZag:

double max=close[1];
   double min=close[1];
   int z=0;

   for(shift=0;shift<rates_total && !IsStopped();shift++)
     {
      CopyBuffer(ZZ_handle,0,shift,1,ZigzagBuffer);

      if(ZigzagBuffer[0]>0)
        {

         if(ZigzagBuffer[0]>=max && ZigzagBuffer[0]==high[shift])
           {
            ArrayResize(mass,z+1);
            max=ZigzagBuffer[0];
            mass[z].price=ZigzagBuffer[0];
            mass[z].pos=shift;
            mass[z].hpoint=true;
            mass[z].lpoint=false;
            z++;
           }

         if(ZigzagBuffer[0]<=min && ZigzagBuffer[0]==low[shift])
           {
            ArrayResize(mass,z+1);
            min=ZigzagBuffer[0];
            mass[z].price=ZigzagBuffer[0];
            mass[z].pos=shift;
            mass[z].lpoint=true;
            mass[z].hpoint=false;
            z++;
           }

        }
     }

Definition der Kriterien für die Konstruktion der Trendlinien

Nun, nachdem wir das Array mit Extrema gebildet haben, können wir die notwendigen Unterstützungs-/Widerstandslinien konstruieren. Die Definition der Hauptkriterien für die Konstruktion der Linien wird im folgenden Bild erläutert.

Beginnend mit Punkt 1 können wir die Linien über jeden der folgenden Punkte konstruieren. Aber nicht alle diese Linien können als Unterstützungs-/Widerstandslinien betrachtet werden. Außerdem können sie mit der Zeit ihre Relevanz verlieren und unbrauchbar werden. Da wir unnötige grafische Objekte in Diagrammen loswerden wollen, führen wir eine Sortierung durch, indem wir redundante Linien aussortieren.

Wir gehen davon aus, dass der Anfangspunkt der Linie A, der zweite Extremwert B und der Punkt neben dem letzten Balken C ist.

Es kann mehrere Kriterien geben, und ihre Menge ändert sich ständig in verschiedenen Situationen. Betrachten wir nur die grundlegenden. In Zukunft kann jeder nach eigenem Ermessen diesen Indikator verbessern. Nachfolgend sind die wichtigsten Kriterien aufgeführt:

  1. АB/BС Abstandsverhältnis
  2. Anzahl der Kreuzungspunkte der Preise mit dem AB-Segment
  3. Anzahl der Kreuzungspunkte der Preise mit dem BC-Segment
  4. Entfernung von С zum aktuellen Preis
  5. Minimale und maximale Leitungslänge
  6. Linienneigung
  7. Preislage oberhalb oder unterhalb der Widerstandslinie

Betrachten wir die obigen Kriterien genauer, um die Konfiguration der Eingänge besser zu verstehen.

  1. Um akzeptable Verhältnisse beizubehalten, können Sie die Fibo-Verhältnisse verwenden und das minimal zulässige Verhältnis auf 0,25 oder 0,382 einstellen. Nach diesem Kriterium sollten die Längenverhältnisse der Bedingung АB/АС>=02,25 (0,382) und BС/АС>=02,25 (0,382) entsprechen. Zur Vereinfachung kann der Wert dieses Parameters in den Einstellungen verändert werden.
  2. Alle bestehenden Linien sollten auch gründlich nach der Anzahl der Schnittpunkte sortiert werden, bei denen der Preis die AB-Linie kreuzt. Es gibt viele Möglichkeiten, wie eine solche Überprüfung durchgeführt werden kann. Wir können nur die Bars betrachten, die sich bereits geschlossen haben und diese Linie durchbrechen, oder wir können einen Ausbruch der Hoch/Tiefs in Betracht ziehen. Das zweite Kriterium für diese Überprüfung ist die Anzahl der Bars, die diesen Teil der Linie gekreuzt haben. Diese Parameter sind auch Teil der Einstellungen.
  3. Wir können die Bedeutung einer Linie anhand einer Reihe von Ausbrüchen, ihrer Art und der aktuellen Preislage relativ zum BC-Teil beurteilen. Alle oben genannten Kriterien können sowohl für die Bildung einer Linie als auch für die Bildung von Handelsstrategien bei der Entwicklung von EAs verwendet werden. Dieser Indikator soll nur die Linien anzeigen, die dieses Segment noch nicht gekreuzt haben.
  4. Der Abstand zwischen dem aktuellen Preis und der Zeile an erster Stelle kann nach der aktuellen Relevanz der Zeile gefiltert werden. Zum Beispiel können wir nur die Linien zeichnen, deren Abstand 50-100 Punkte nicht überschreitet.
  5. Die kleinste Länge der Linie wird in unserem Fall durch die Eingabeparameter des ZigZags bestimmt, aber dieser Parameter kann bei Bedarf auch überwacht werden. Der Indikator überprüft die Mindestlängen der Teile von AB und BC.
  6. Da die Unterstützungslinien bedeutender sind, weil sie zur Eröffnung von Positionen verwendet werden, konstruiert der Indikator die Linien mit einer Steigung von Null oder größer für einen Aufwärtstrend oder von Null oder kleiner für Abwärtstrends.
  7. Wir können die Linien auf zwei Arten nutzen. Die erste ist, nur noch nicht gekreuzte Linien und Handel in Richtung eines Trends zu betrachten. Die zweite nutzt nur den Ausbruch aus den Trendlinien für die Eröffnung von Positionen in die entgegengesetzte Richtung. Beide Arten von Linien sind wichtig, deshalb sollen beide im Indikator berücksichtigt werden.

Unten ist der Teil eines Codes, in die Widerstandslinien eines Abwärtstrends gebildet werden.

// Bestimmen, ob die Linien unseren Kriterien entsprechen und Ausfüllen der Matrix für einen Abwärtstrend.



   for(j=z-1; j>=0; j--)
     {
      if(mass[j].hpoint)
         for(i=j-1; i>=0; i--)
           {
            if(mass[i].hpoint)
               if(i<j)
                 {

                  a=mass[j].pos;
                  b=mass[i].pos;

                  double ratio=double((a-b)*100/a);       // Ermitteln des Verhältnisses des Teils AB zur Gesamtlänge

                  if(ratio>fibo && ratio<(100-fibo))      // Bestimmen der 1. Kriteriums des Verhältnisses von AB/BC
                     if(b>Min_dist &&(a-b)>Min_dist)      // Bestimmen des Kriteriums 5, der kleinsten Länge von AB und BC
                       {

                        ax=mass[j].price;
                        bx=mass[i].price;

                        coef=(ax-bx)/(a-b);

                        price=close[1];

                        deviation=(ax+coef*bx)-price;

                        cross_bc=0;
                        cross_ab=0;


                        if(MathAbs(deviation)<tolerance*_Point)   // Bestimmen des Kriteriums 4 (Abstand des Punktes C zum Schlusskurs der vorherigen Bar)
                          {

                           // Anzahl der Kreuzungspunkte zwischen Punkt a und Punkt b 
                           for(int n=a; n>b; n--)
                              if((close[n]-(ax+coef*(b-n)))>0)
                                 cross_ab++;
                           // Anzahl der Kreuzungspunkte zwischen Punkt b und dem Ende  
                           for(int n=b-1; n>=0; n--)
                              if(close[n]>(bx+coef*(b-n)) && close[n+1]<(bx+coef*(b-n+1)))
                                 cross_bc++;

                           if(cross_bc<=Intersection_bc && cross_bc<=Intersection_ab)// Bestimmen des Kriteriums 2 und 3
                             {
                              // Ausfüllen der Matrix in einem Abwärtstrend
                              ArrayResize(DownTrend,y+1);
                              DownTrend[y].a=a;
                              DownTrend[y].b=b;
                              DownTrend[y].ax=ax;
                              DownTrend[y].bx=bx;
                              DownTrend[y].dst=MathAbs(deviation);
                              DownTrend[y].coef=coef;

                              y++;

                             }
                          }
                       }
                 }
           }
     }

// Anzeige der absteigenden Linie mittels der erhaltenen Matrix

   for(j=0; j<ArraySize(DownTrend); j++)
     {

      a=DownTrend[j].a;
      b=DownTrend[j].b;
      ax=DownTrend[j].ax;
      bx=DownTrend[j].bx;
      coef=DownTrend[j].coef;

      if(a>0 && b>0 && MathAbs(a-b)>0)
        {
if(a>0 && b>0 && MathAbs(a-b)>0)
        {
         //--- create trend lines 
         TrendCreate(0,"DownTrend "+string(j),0,time[a],ax,time[b],bx,DColor,DStyle,DWidth,DBack,DSelection,DRayLeft,DRayRight,DHidden,DZOrder);
         ChartRedraw();
        }
     }

Beispiele der vom Indikator erstellten Linien:

Nutzung von Unterstützungs-/Widerstandslinien im Handel

Das wichtigste Handelsprinzip, das Unterstützungs-/Widerstandsniveaus anwendet, ist der Kauf in der Nähe einer Unterstützungslinie während eines Aufwärtstrends (und der Verkauf während eines Abwärtstrends) oder in einer Seitwärtsbewegung. Einige grafische Modelle (Muster) werden ebenfalls verwendet.

Diese Handelsstrategie ermöglicht es Ihnen, von der Trendbewegung zu profitieren, selbst wenn das Finanzinstrument keinen Trend zeigt oder wenn der Kurs ein Muster bildet. Ein Trend hilft bei der Bestimmung der Handelsrichtung. Zum Beispiel, wenn der aktuelle Trend abwärts geht, aber dann verflacht, dann könnte es günstig sein in der Nähe der Widerstandslinie zu verkaufen, anstatt auf der Unterstützungsebene zu kaufen. Das Vorhandensein eines Abwärtstrends bedeutet, dass Verkäufe eine bessere Erfolgschance haben als Käufe. Wenn ein Trend steigt und von einem Dreieck gefolgt wird, dann ist es besser, in der Nähe der Unterstützungslinie dieses Dreiecks zu kaufen.

Das Eröffnen von trendfolgenden Positionen in der Nähe von Unterstützungs-/Widerstandslinien kann Profit bringen, aber der Preis kreuzt diese Linie oftmals. Daher müssen wir die Bestätigung der Bedeutung dieser Linie für ein bestimmtes Finanzinstrument abwarten. Bevor Sie auf der Linie kaufen oder verkaufen, müssen Sie warten, bis der Preis sich in der Nähe konsolidiert. Alternativ können Sie auf eine Preiskorrektur dieser Linie warten und erst danach eine Position eröffnen.

Bei einem Kauf nahe der Unterstützungslinie ist es sinnvoll, auf die Konsolidierung des Preises in der Nähe zu warten und eine Kauforder erst zu erteilen, nachdem der Preis das Hoch der Konsolidierungszone durchbrochen hat. Dadurch wird sichergestellt, dass die Linie den Preis tatsächlich beeinflusst und der Preis sich in die erwartete Richtung (nach oben) von der Linie bewegt. Das ist genau das, was wir brauchen, um zu kaufen. Eine ähnliche Situation tritt auf, wenn Sie in der Nähe der Widerstandslinie verkaufen: Sie müssen auf die Konsolidierung in der Nähe der Widerstandszone warten und die Position eröffnen, wenn der Preis unter das Tief der Zone fällt.

Wenn Sie eine Position eröffnen, stellen Sie sicher, dass Sie die Bedingungen für das Schließen vorhersagen können. Wenn Sie in de Nähe einer Unterstützungslinie kaufen, ist es ratsam, die Position zu schließen, bevor der Preis eine starke Widerstandslinie erreicht. Ähnliches gilt für Verkäufe. Sie können auch Positionen auf sekundären Unterstützungs-/Widerstandsniveaus eröffnen. Wenn Sie nahe einer Unterstützungslinie kaufen, müssen Sie nahe der Widerstandslinie in einem aufsteigenden Trendkanal verkaufen. Sie können auch versuchen, einen größeren Gewinn zu erzielen, wenn Sie auf einen Ausbruch der Preise warten. Wenn Sie z.B. nahe der Unterstützungslinie eines Dreiecks kaufen (während eines allgemeinen Aufwärtstrends), können Sie die Position so lange halten, bis der Preis das Dreieck durchbricht und sich weiter nach oben bewegt. Danach können Sie die Position nahe der nächsten Widerstandslinie schließen.

Der indikatorbasierte EA

Nachfolgend der EA mit folgenden Funktionen:

  • Stop-Loss und Take-Profit
  • Maximale Anzahl von Kauf- und Verkaufsaufträgen
  • Trailing-Stop
  • Gewinnschwelle (Breakeven)
  • Schließen von Positionen, wenn das Signal des Indikators sich in die Gegenrichtung umkehrt
  • Vier HTF-Filter (MACD, RSI, WPR, MA) mit der Möglichkeit, die Filter auszuwählen.

Der EA arbeitet direkt mit den vom Indikator generierten Trendlinien. Daher muss der Indikator auf dem gleichen Chart gestartet werden, um in Echtzeit arbeiten zu können. Die Einstellung des Indikators wird im Indikator selbst vorgenommen. Das EA hat auch die Einstellungen des Indikators, die jedoch nur zu Testzwecken verwendet werden. Um den EA zu testen, wurde im Code das bei der Initialisierung des EA definierte Indikatorhandle angelegt.

Es gibt drei Betriebsarten des EAs:

  • Von der Linie (from level) — Handel in Richtung eines möglichen Preisrückgangs von einer Trendlinie. Eine Position wird eröffnet, wenn der Höchst- oder Tiefstkurs der Bar die Linie überschritten hat, während der Schlusskurs die aktuelle Trendlinie nicht durchbrach und der Preis der nächsten Bar geschlossen wurde, ohne die Linie ebenfalls zu durchbrechen. Der EA prüft, ob die Preise die Linie nach dem Berühren gekreuzt haben.
  • Einbruch (Level Breakdown) — Handel in Richtung einer Trendlinie potenzieller Durchbruch. Ein Handel wird eröffnet, wenn der Höchst- oder Tiefstkurs eine Bar die Linie überschritten hat, der Schlusskurs die aktuelle Trendlinie noch nicht durchbrach, aber die nächsten Bar die Trendlinie durchbrach.
  • Alle (all) — beide oben beschriebenen Modi werden verwendet.

Nachfolgend ist eine Funktion des Codes aufgeführt, bei der Signale für Kauf und Verkauf gebildet werden:

//+------------------------------------------------------------------+
int signal()
  {
   int res=0;

   int macd=0;
   int rsi=0;
   int wpr=0;
   int ma=0;

   if(Use_macd==true)macd=macdS();
   if(Use_rsi==true)rsi=rsiS();
   if(Use_wpr==true)wpr=wprS();
   if(Use_ma==true)ma=maS();

   CopyOpen(NULL,0,1,3,O);
   CopyHigh(NULL,0,1,3,H);
   CopyLow(NULL,0,1,3,L);
   CopyClose(NULL,0,1,3,C);

   Signals=0;
   for(int i=0;i<ObjectsTotal(0,0,OBJ_TREND);i++)
     {
      string sName=ObjectName(0,i,0,OBJ_TREND);
      if(StringFind(sName,"UpTrend")==0 || StringFind(sName,"DownTrend")==0)
        {
         ax=ObjectGetDouble(0,sName,OBJPROP_PRICE,0);
         bx=ObjectGetDouble(0,sName,OBJPROP_PRICE,1);
         p1=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,0);
         p2=(int)ObjectGetInteger(0,sName,OBJPROP_TIME,1);
         a=iBarShift(p1);
         b=iBarShift(p2);
         kkk=(bx-ax)/(a-b);
         lvl=bx+kkk*b;
         plvl=bx+kkk*(b-1);

         if(mode==0 || mode==2)
           {
            if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]>lvl)Signals=1;
            if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]<lvl)Signals=2;
           }

         if(mode==1 || mode==2)
           {
            if(StringFind(sName,"UpTrend")==0 && L[1]<=plvl && C[1]>plvl && C[0]<lvl)Signals=2;
            if(StringFind(sName,"DownTrend")==0 && H[1]>=plvl && C[1]<plvl && C[0]>lvl)Signals=1;
           }
        }
     }

   if(Signals==1
      &&(macd==1 || Use_macd==false)
      && (rsi==1 || Use_rsi==false)
      && (wpr==1 || Use_wpr==false)
      && (ma==1 || Use_ma==false))res=1;

   if(Signals==2
      &&(macd==2 || Use_macd==false)
      && (rsi==2 || Use_rsi==false)
      && (wpr==2 || Use_wpr==false)
      && (ma==2 || Use_ma==false))res=2;

   return(res);
  }
//+------------------------------------------------------------------+

Die Tests haben gezeigt, dass die Rentabilität des Roll-Back-Handels im Vergleich zum Durchbruch geringer ist.

Nachfolgend sind die Testergebnisse für den Test der drei Modi mit den folgenden Eingaben dargestellt:

input string s="-------------------------------------------"; // Die wichtigsten Einstellungen
input int Magic=12345;
input double LotSize=0.1;
input int Slippage=30; //Slippage, Points 
input int StopLoss=0; //Stop-Loss, Points 
input int TakeProfit=0; //Take-Profit, Points
input int TrailingStart=0; //Trailing-Start, Points
input int TrailingStop= 0; //Trailing-Stop, Points
input int TrailingStep= 0; //Trailing-Schrittweite, Points
input int SL_prof=0; //Start BE, Points
input int SL_lev=0; //BE Preis, Points
input int Buy_max=1; //Max. Kaufaufträge
input int Sell_max=1; //Max. Verkaufsaufträge
input bool Sig_close=true; //Schließen entgegengesetzter Positionen
input tip mode=0;
input string s0="-------------------------------------------"; // Einstellungen des Indikators
input int _ExtDepth=12;
input int _ExtDeviation=5;
input int _ExtBackstep=3;

input int _Min_dist=0;                                  // Mindestabstand
input int _fibo=30;                                     // Fibo.-Verhältnis
input int _tolerance=200;                               // Toleranz
input int _Intersection_ab=1;                           // Erlaubte Anzahl von Kreuzungspunkten zwischen den Punkten a und b
input int _Intersection_bc=1;                           // Erlaubte Anzahl von Kreuzungspunkten zwischen den Punkten b und c

input string s1="-------------------------------------------";     // MACD Einstellungen
input ENUM_TIMEFRAMES macd_tf=PERIOD_CURRENT;                      // Zeitrahmen
input int fast_ema_period=12;                                      // Periodenlänge des schnellen MA
input int slow_ema_period=26;                                      // Periodenlänge des langsamen MA
input int signal_period=9;                                         // Periodenlänge der Durchschnittsbildung
input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE;                // Preistyp

input string s2="-------------------------------------------";     // RSI Einstellungen
input ENUM_TIMEFRAMES rsi_tf=PERIOD_CURRENT;                       // Zeitrahmen
input int rsi_period=14;                                           // Periodenlänge 
input ENUM_APPLIED_PRICE rsi_applied_price=PRICE_CLOSE;            // Preistyp
input double rsi_max_s=100;                                        // Max. für Verkauf
input double rsi_min_s=70;                                         // Min. für Verkauf
input double rsi_max_b=30;                                         // Max. für Kauf
input double rsi_min_b=0;                                          // Min. für Verkauf

input string s3="-------------------------------------------";     // WPR Einstellungen
input ENUM_TIMEFRAMES wpr_tf=PERIOD_CURRENT;                       // Zeitrahmen
input int calc_period=14;                                          // Periodenlänge  
input double wpr_max_s=0;                                          // Max. für Verkauf
input double wpr_min_s=-20;                                        // Min. für Verkauf
input double wpr_max_b=-80;                                        // Max. für Kauf
input double wpr_min_b=-100;                                       // Min. für Kauf

input string s4="-------------------------------------------";     // MA Einstellungen
input ENUM_TIMEFRAMES ma_tf=PERIOD_CURRENT;                        // Zeitrahmen
input int ma_period=10;                                            // Periodenlänge des Ma 
input int ma_shift=0;                                              // Shift 
input ENUM_MA_METHOD ma_method=MODE_SMA;                           // Typ der Glättung 
input ENUM_APPLIED_PRICE ma_applied_price=PRICE_CLOSE;             // Preistyp

input bool Use_macd=true;                                          // MACD als Filter
input bool Use_rsi=false;                                          // RSI als Filter
input bool Use_wpr=false;                                          // WPR als Filter
input bool Use_ma=false;                                           // MA als Filter

input int sbar=1;                                                  // Signal-Bar 0-aktuell, 1-Schlusskurs

Während der Tests wurde nur eine Position mit jeweils 0,1 Lot in einer der Richtungen eröffnet. Im Falle eines entgegengesetzten Signals wurde die aktuelle Position geschlossen und der entgegengesetzte Handel eröffnet. Der MACD-Filter wurde angewandt, d.h. Kaufpositionen wurden bei Indikatorwerten kleiner als Null eröffnet, während Verkaufspositionen bei Indikatorwerten über Null eröffnet wurden. Der Test wurde an EURUSD H1 für 2015-2017 durchgeführt.

From level:


Level breakdown:


Nachfolgen die Testergebnisse mit den Standardeinstellungen von verschiedenen Paaren.

Hier sehen wir, dass nur EURUSD und USDCHF gute Ergebnisse zeigen. Das liegt zum einen daran, dass beim Handel nicht alle Linien berücksichtigt werden sollten. Wir müssen auch andere Faktoren berücksichtigen, die am Anfang des Artikels aufgeführt sind.

Darüber hinaus sollten wir den Einfluss der Fundamentalanalyse im Auge behalten, da Unterstützungs-/Widerstandslinien sehr oft nach einer Veröffentlichung wichtiger Nachrichten durchbrochen werden.

Daher ist es möglich, dem EA einen Nachrichtenfilter hinzuzufügen und die Arbeit sowohl zum Zeitpunkt der Pressemitteilungen als auch nach der Deaktivierung des Handels während der Nachrichten vollständig zu testen. Alternativ kann der EA auch auf RENKO-Karten verwendet werden. 

Optimierung

Meiner Meinung nach haben die ersten sieben Parameter bereits ihren optimalen Wert, daher habe ich sie nicht weiter optimiert. Die Parameter des ZigZag sind standardmäßig gesetzt, sind aber nicht ganz ideal. Bei der Optimierung konnte festgestellt werden, dass die am besten geeigneten Parameterwerte ​​für alle zuvor getesteten Währungen die folgenden sind:

  • _ExtDepth=24;
  • _ExtDeviation=55;
  • _ExtBackstep=9;

Um während der Optimierung Positionen zu eröffnen, haben wir definiert, welche Betriebsart für ein bestimmtes Finanzinstrument besser geeignet ist und wie stark der Filter das Ergebnis beeinflusst. Als Filter wurde nur der MACD-Indikator verwendet. Sie können aber auch beliebige andere Indikatoren auf verschiedenen Zeiträumen ausprobieren.

Die Funktion des Schließens durch ein entgegengesetztes Signal wurde genutzt, um eine Position mit Gewinn oder Verlust zu schließen. Um den Gewinn zu fixieren und das maximale Ergebnis zu erzielen, wurden die Funktionen Break-Even und Take-Profit verwendet. Die optimalen Parameter für jede Währung wurden während des Tests für diese Funktionen ermittelt.

Es wurde kein Stop-Loss verwendet. Positionen, die einen Verlust zeigen, wurden nur durch ein entgegengesetztes Signal geschlossen.

Die Optimierung ist in der Tabelle dargestellt. Der Test wurde mit einer Lotgröße von 0,1 für das Jahr 2017 durchgeführt. Außerdem wurde die Anzahl der offenen Kauf- und Verkaufspositionen auf 10 erhöht, für alle anderen Parameter wurden die Standardeinstellung verwendet

 Symbol Mode
  MACD filter TakeProfit
Start BE
Profit
 Profit Factor: Recovery Factor:
 Max DD,%
 Total Trades: Profit Trades,% 
EURUSD
level breakdown
false
0
25
117.20
1.88
1.65
0.69
79
73.42
USDCHF
level breakdown false 20
10
135.24
1.31
1.12
1.03
482
72.41
GBPCHF
from level
true
20
10
91.56
1.39
0.51
1.58
246
91.06
AUDUSD
level breakdown false 20
10
139.20
1.39
1.66
0.79
485
71.96
AUDCAD
level breakdown true 25
5
117.51
1.94
1.06
0.57
246
84.96
EURJPY
level breakdown false 20
5
128.90
1.60
0.98
1.26
341
78.89
GBPUSD
from level false 100
0
102.1
1.20
1.32
0.58
274
52.92
USDJPY
from level false 30
0
147.75
1.56
0.79
1.73
348
79.89
EURGBP
from level true 20
5
124.45
1.39
1.14
1.03
341
78.01
EURCHF
from level true 20
5
141.08
2.07
1.88
0.68
367
63.22
USDCAD
level breakdown false
100
25
142.57
1.46
0.45
1.22
248
78.87
NZDUSD
from level false 0
25
270.50
1.37
1.04
2.37
616
62.11
GBPJPY
level breakdown true 150
20
163.62
2.56
1.10
1.41
103
68.25

Schlussfolgerung

In diesem Artikel haben wir uns mit dem Grundprinzip der automatischen Konstruktion von Unterstützungs- und Widerstandslinien beschäftigt. Dieses Prinzip wurde genutzt, um ein EA zu entwickeln und die Einstellungen für 13 Finanzinstrumenten zu optimieren. Um das maximale Ergebnis für ein bestimmtes Finanzinstrument zu erhalten, müssen Sie die optimalen Parameter individuell auswählen. Der EA mit einer Reihe von Grundfunktionen und vier HTF-Filtern wurde entwickelt, um die optimalen Parameter zu finden, den Handel zu automatisieren und die Arbeit durch Unterstützungs-/Widerstandslinien zu überprüfen. Der Indikator und der EA können je nach Bedarf erweitert und verbessert werden.

Es hat sich herausgestellt, dass "from level" weniger profitabel ist als der "level breakdown" für einige Währungen. Dies zeigt, dass sich jedes Finanzinstrument in einer einzigartigen Weise bewegt, die einen individuellen Ansatz erfordert.


Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/3215

Beigefügte Dateien |
TrendlinesEA.mq5 (46.6 KB)
Trendlines.mq5 (30.78 KB)
Individuell Strategien testen basierend auf schnellen mathematischen Berechnungen Individuell Strategien testen basierend auf schnellen mathematischen Berechnungen
Der Artikel beschreibt die Art und Weise, wie man Strategien individuell testen und einen benutzerdefinierten Analysator für die Optimierungsdurchläufe erstellt. Nach dem Lesen werden Sie verstehen, wie die "Mathematische Berechnung" und der Mechanismus der sogenannten Frames funktionieren, wie Sie benutzerdefinierte Daten für Berechnungen vorbereiten und laden und effektive Algorithmen für ihre Komprimierung verwenden. Dieser Artikel wird auch für diejenigen interessant sein, die an Möglichkeiten interessiert sind, benutzerdefinierte Informationen innerhalb eines Experten zu speichern.
Automatische Auswahl vielversprechender Signale Automatische Auswahl vielversprechender Signale
Der Artikel beschäftigt sich mit der Analyse von Handelssignalen für MetaTrader 5 mit der automatischen Ausführung von Trades auf dem Konto des Abonnenten. Darüber hinaus geht es um die Entwicklung von Werkzeugen für die Suche nach vielversprechenden Handelssignalen direkt im Terminal.
LifeHack für Händler: Fast-Food aus Indikatoren LifeHack für Händler: Fast-Food aus Indikatoren
Wenn Sie gerade erst auf MQL5 umgestiegen sind, dann wird Ihnen dieser Artikel helfen. Erstens erfolgt der Zugriff auf die Indikatorendaten und -serien im üblichen MQL4-Stil. Zweitens ist diese ganze Einfachheit in MQL5 implementiert. Alle Funktionen sind so übersichtlich wie möglich und eignen sich perfekt für ein schrittweise Debugging.
Testen von Mustern, die beim Handel mit Währungskörben entstehen. Teil III Testen von Mustern, die beim Handel mit Währungskörben entstehen. Teil III
In diesem Artikel beenden wir die Tests der Muster, die beim Handel mit Währungskörben erkannt werden können. Hier präsentieren wir Ihnen die Ergebnisse der Tests der Muster, die die Bewegungen der Währungen des Paares relativ zueinander verfolgen.