English Русский 中文 Español 日本語 Português
preview
Wie man einen nutzerdefinierten Donchian Channel Indikator mit MQL5 erstellt

Wie man einen nutzerdefinierten Donchian Channel Indikator mit MQL5 erstellt

MetaTrader 5Handel | 27 Juli 2023, 13:33
232 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Einführung

In diesem Artikel werden wir über ein sehr wichtiges Konzept im Handel sprechen, nämlich die Identifizierung von Trends, und wir werden ein technisches Werkzeug kennenlernen, das dabei hilfreich sein kann, nämlich den Donchian Channel Indikator, einem Kanal-Indikator. Dieser Indikator ist ein Trendfolger, wie wir sehen werden.

All das werden wir in den folgenden Themen behandeln:


Haftungsausschluss: Alle Informationen werden in der vorliegenden Form nur zu Informationszwecken bereitgestellt und sind nicht für Handelszwecke oder als Ratschläge gedacht. Die Informationen garantieren keinen Erfolg. Wenn Sie sich dafür entscheiden, diese Materialien auf einem Ihrer Handelskonten zu verwenden, tun Sie dies auf eigenes Risiko und Sie sind allein verantwortlich.


Definition des Donchian Channels

In diesem Teil werden wir den Donchian Channel Indikator identifizieren und das Hauptkonzept dahinter verstehen, um ihn effektiv zu nutzen. Der Donchian Channel wurde von dem Händler Richard Donchian entwickelt, und sein Hauptziel ist es, den Trend zu erkennen, was bedeutet, dass er ein trendfolgender und nachlaufender Indikator ist, da er auch Trendrichtungen und Kursbewegungen folgt. Er besteht aus drei Linien, die einen Kanal (engl. channel) bilden, der den Preis enthält. Die obere Linie des Kanals korrespondiert mit den Hochs, die während eines bestimmten Zeitraums verzeichnet wurde, die untere Linie des Kanals mit den Tiefs eines bestimmten Zeitraums und die mittlere Linie ist die Mitte zwischen der oberen und der unteren Linie.

Das folgende Chart ist ein Beispiel für den Donchian Channel:

Beispiel für einen Indikator

Wie in der vorherigen Grafik zu sehen ist, gibt es eine Linie über den Preisen, eine weitere darunter und eine dritte dazwischen. Was macht der Indikator enthält oder umgibt die Preise von oberen und unteren Linien zusätzlich zu einer anderen mittleren Linie, die auch nützlich sein kann. Auf der Grundlage dieser Form des Indikators kann im Handel nützlich sein, indem sie auf der Grundlage verschiedener Strategien den Trend identifiziert und Ausbrüche, Unterstützung und Widerstände erkennt.

Das Hauptkonzept bei der Verwendung dieses Indikators besteht darin, die Hochs und Tiefs der Preise über einen bestimmten Zeitraum zu beobachten, um Trends oder die Richtung zu erkennen, für die wir voreingenommen sein können. Wenn der Kurs über dem höchsten Hoch eines bestimmten Zeitraums liegt, deutet dies auf eine Kraft nach oben hin und kann ein Kaufsignal sein. Liegt der Kurs unter dem tiefsten Tief eines bestimmten Zeitraums, deutet dies auf eine Kraft nach unten hin und kann ein Verkaufssignal sein. Sobald wir also einen bestimmten Zeitraum festgelegt und den höchsten und den niedrigsten Preis bestimmt haben, werden wir sie beobachten, bis sich die Preise in eine bestimmte Richtung nach oben oder unten bewegen, und das Signal ist hier das Durchbrechen des bestimmten höchsten Hochs oder niedrigsten Tiefs.

Dieser Indikator kann für die Bestimmung von Stop-Loss- und Take-Profit-Levels verwendet werden, was sehr wichtig und nützlich für den Handel ist, da es das Setzen falscher Levels eliminiert und reduziert, da die Levels des Indikators sehr klar sind und wichtige Levels darstellen, insbesondere wenn wir die richtigen Parameter verwenden. So kann beispielsweise das Tief des Kanals als Stop-Loss-Niveau für eine Kaufposition oder als Take-Profit-Niveau für eine Verkaufsposition verwendet werden. Die obere Kanalgrenze kann jedoch als Stop-Loss für eine Verkaufsposition oder als Gewinnziel für eine Kaufposition verwendet werden.

Nach dem, was wir erwähnt haben, werden wir die Art und Weise der Berechnung dieses Indikators die gleichen wie die folgenden einfachen Schritten zur Verfügung stellen:

  • Channel High (CH) = Der höchste Wert der letzten N Balken
  • Channel Low (CL) = Der niedrigste Wert der letzten N Balken
  • Middle line (ML) = (Channel High+Channel Low)/2

Wir müssen also den gewünschten Zeitraum bestimmen, in dem wir die Richtung erkennen müssen, den höchsten und den niedrigsten Preis ermitteln, eine Linie zur Beobachtung daneben zeichnen und die Mittellinie ermitteln, indem wir den halben Abstand zwischen dem höchsten und dem niedrigsten Niveau berechnen. Es ist auch gut zu erwähnen, dass es einen Unterschied zwischen den Kanälen der Donchian Channels und denen der Bollinger-Bändern gibt, da die Donchian Channel, wie bereits erwähnt, das höchste Hoch und das niedrigste Tief während eines bestimmten Zeitraums aufzeichnen, während die Bollinger-Bänder einen Durchschnitt eines Zeitraums nach Addition und Subtraktion von zwei Standardabweichungen aufzeichnen. Wenn Sie weitere Informationen benötigen, können Sie meinen früheren Artikel über die Bollinger-Bänder lesen, um mehr darüber zu erfahren und wie Sie ein darauf basierendes Handelssystem erstellen können.

Wir haben festgestellt, dass das Konzept dieses Indikators vor allem für Trendfolger sehr wichtig ist, da er hilft, Trends und Richtungen klar zu erkennen, um verschiedene Strategien auf der Grundlage dieses Indikators zu erarbeiten und zu testen, da er ein sehr gutes Werkzeug für unser Handelssystem sein kann. Es ist sehr wichtig zu beachten, dass es besser ist, diesen Indikator zusammen mit anderen aussagekräftigen technischen Indikatoren zu verwenden, um bessere Erkenntnisse und Ergebnisse zu erhalten.


Nutzerdefinierter Donchian Channel

In diesem Thema werde ich eine Methode vorstellen, mit der Sie einen nutzerdefinierten Donchian Channel Indikator mit MQL5 erstellen können. Wir werden den Indikator in Form einer oberen Linie, einer unteren Linie und einer mittleren Linie erstellen, wie wir in den folgenden Schritten sehen können. 

Erstellen wir zusätzliche Parameter mit den folgenden Werten für die Erkennung:

  • indicator_chart_window: um den Indikator im Chart-Fenster anzuzeigen.
  • indicator_buffers: zur Bestimmung der Anzahl der Puffer für die Indikatorberechnung. Die Anzahl ist 3.
  • indicator_plots: zur Bestimmung der Anzahl der gezeichneten Linien des Indikators.  Die Anzahl ist 3.
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3

Wir erstellen zwei Eingaben, eine für den Zeitraum und die andere für die Farbe der Indikatorlinien, wie im Folgenden beschrieben:

  • Wir erstellen eine Integer-Variable (indPeriod) und weisen ihr 20 als Standardwert zu, der jedoch je nach den Eingaben des Nutzers verändert werden kann.
  • Wir erstellen eine Variable vom Typ Farbe (indColor) und weisen ihr die Farbe Blaue als Standardwert zu, aber auch sie kann je nach Eingabe des Nutzers verändert werden.
input int indPeriod=20; //Period
input color indColor=clrBlue; //Color

Wir erstellen globale Variablen, wie im Folgenden beschrieben:

  • Arrays vom Typ double für upperBuff, lowerBuff, middleBuff.
  • Variablen vom Typ double für upperLine, lowerLine, middleLine.
  • Variablen vom Typ ganze Zahl für Start und den Balkenindex.
double upperBuff[];
double lowerBuff[];
double middleBuff[];
double upperLine,lowerLine,middleLine;
int start, bar;

Wir erstellen eine nutzerdefinierte Funktion des Indikators unter Verwendung von void, die nichts zurückgibt, und erstellen eine Variable indInit mit drei Parametern (index, buffer als dynamisches Array und label als Zeichenkette für jede Zeile des Indikators). Im Hauptteil der Funktion werden wir folgendes tun:

  • Wir verwenden die Funktion SetIndexBuffer, die einen angegebenen Indikator mit dem eindimensionalen dynamischen Array verknüpft. Ihre Parameter sind:
    • index: zur Angabe der Nummer des Anzeigepuffers. Wir werden die Indexvariable verwenden.
    • buffer[]: um das erstellte dynamische Array zu bestimmen, das der buffer[] ist.
    • data_type: zur Bestimmung der zu speichernden Daten, die den Standardwert (INDICATOR_DATA) darstellen.
  • Wenn Sie die Funktion PlotIndexSetInteger fünfmal mit verschiedenen Werten für die Parameter prop_id- und prop_value verwenden, wie wir im Code sehen werden, setzt diese Funktion den Wert der entsprechenden Indikatorlinie. Die Indikatoreigenschaft muss eine ganze Zahl sein. Alle Parameter sind wie folgt:
    • plot_index: um den Index der grafischen Darstellung zu bestimmen. Wir werden die Indexvariable verwenden.
    • prop_id: zur Bestimmung des Eigenschaftsbezeichnungswertes, der einer der ENUM_PLOT_PROPERT_INTEGER sein kann.
    • prop_value: um den Wert der bestimmten Eigenschaft in der prop_id zu ermitteln.
  • Verwendung der Funktion PlotIndexSetString, die den Wert des entsprechenden String-Eigenschaftsindikators festlegt. Ihre Parameter sind die gleichen wie bei der Funktion PlotIndexSetInteger, aber die Indikatoreigenschaft muss hier eine Zeichenkette sein.
  • Mit der Funktion PlotIndexSetDouble wird der Wert des entsprechenden Indikators der Eigenschaft double gesetzt. Die Parameter sind die gleichen, aber die Eigenschaft des Indikators muss vom Typ double sein.
void indInit(int index, double &buffer[],string label)
  {
   SetIndexBuffer(index,buffer,INDICATOR_DATA);
   PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1);
   PlotIndexSetInteger(index,PLOT_SHIFT,1);
   PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor);
   PlotIndexSetString(index,PLOT_LABEL,label);
   PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }

Danach, im Hauptteil von OnInit(), werden wir unsere nutzerdefinierte Funktion des Indikators dreimal für die drei Zeilen des Indikators verwenden, und es wird die gleiche wie die folgende sein:

   indInit(0,upperBuff,"Donchian Channel");
   indInit(1,lowerBuff,"Donchian Channel");
   indInit(2,middleBuff,"Middle Donchian");

Verwenden wir hier die Funktion IndicatorSetString, um die Textbeschriftung des Indikators zu setzen

IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");

Im OnCalculate-Teil werden wir die folgenden Schritte durchführen, um den Indikator zu berechnen:

Wir prüfen, ob rates_total kleiner ist als die vom Nutzer eingegebene Periode+1, wenn ja, muss das Programm Null zurückgeben.

   if(rates_total<indPeriod+1)
     {
      return 0;
     }

Wir weisen mit Hilfe des ternären Operators „?:“ einen Wertes der Variablen start zu. Wenn prev_calculated==0 dann indPeriod, andernfalls prev_calculated-1.

start=prev_calculated==0? indPeriod: prev_calculated-1;

Mit der Funktion „for“ wird eine Schleife zur Berechnung des Indikators erstellt. Der Ausdruck 1 ist (bar=start), der Ausdruck 2 ist (bar < rate_total) und der Ausdruck 3 ist (bar ++), um den Balken um eins zu erhöhen. Der Schleifen-Operator der „for“ dient dem Folgenden:

  • Berechnung von upperLine durch Ermittlung des Maximalwerts der Hochs mit Hilfe der Funktion ArrayMaximum, die nach dem höchsten Wert im Array sucht.
  • Berechnung von lowerLine durch Ermittlung des Mindestwerts der Tiefs mit Hilfe der Funktion ArrayMinimum, die nach dem niedrigsten Wert im Array sucht.
  • Berechnung von middleLine als Mittelwert von upperLine und lowerLine.
  • Zuweisung der Werte von upperBuff[bar], lowerBuff[bar] und middleBuff[bar}
   for(bar=start;bar<rates_total;bar++)
   {
      upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)];
      lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)];
      middleLine=(upperLine+lowerLine)/2;
      
      upperBuff[bar]=upperLine-(upperLine-lowerLine);
      lowerBuff[bar]=lowerLine+(upperLine-lowerLine);
      middleBuff[bar]=middleLine;

   }

Im Folgenden finden Sie den vollständigen Code in einem Block:

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
input int indPeriod=20; //Period
input color indColor=clrBlue; //Color
double upperBuff[];
double lowerBuff[];
double middleBuff[];
double upperLine,lowerLine,middleLine;
int start, bar;
void indInit(int index, double &buffer[],string label)
  {
   SetIndexBuffer(index,buffer,INDICATOR_DATA);
   PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(index,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(index,PLOT_DRAW_BEGIN,indPeriod-1);
   PlotIndexSetInteger(index,PLOT_SHIFT,1);
   PlotIndexSetInteger(index,PLOT_LINE_COLOR,indColor);
   PlotIndexSetString(index,PLOT_LABEL,label);
   PlotIndexSetDouble(index,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }
int OnInit()
  {
   indInit(0,upperBuff,"Donchian Channel");
   indInit(1,lowerBuff,"Donchian Channel");
   indInit(2,middleBuff,"Middle Donchian");
   IndicatorSetString(INDICATOR_SHORTNAME,"Donchian ("+IntegerToString(indPeriod)+")");

   return(INIT_SUCCEEDED);
  }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(rates_total<indPeriod+1)
     {
      return 0;
     }
   start=prev_calculated==0? indPeriod: prev_calculated-1;
   for(bar=start;bar<rates_total;bar++)
   {
      upperLine=high[ArrayMaximum(high,bar-indPeriod+1,indPeriod)];
      lowerLine=low[ArrayMinimum(low,bar-indPeriod+1,indPeriod)];
      middleLine=(upperLine+lowerLine)/2;
      
      upperBuff[bar]=upperLine-(upperLine-lowerLine);
      lowerBuff[bar]=lowerLine+(upperLine-lowerLine);
      middleBuff[bar]=middleLine;
   }
   return(rates_total);
  }

Nach der Kompilierung dieses Codes, muss es ohne Fehler oder Warnungen kompiliert werden. Dann kann der Indikator aus dem Navigator-Fenster heraus gestartet werden und wir erscheint das Fenster für die Eingaben:

Indikator-Eingaben

Wie wir in der vorherigen Abbildung sehen können, haben wir zwei Eingaben:

  • Period: um die Periodenlänge zu bestimmen, die wir für die Berechnung des Indikators verwenden wollen. Der Standardwert ist 20, kann aber vom Nutzer verändert werden.
  • Color: um die Farbe der Linien des Indikators zu bestimmen. Sein Standardwert ist blau, er kann aber auch aktualisiert werden.

Nachdem wir diese beiden Eingaben nach unseren Wünschen festgelegt und auf OK gedrückt haben, sehen wir den Indikator, der mit dem Chart verbunden ist, wie folgt:

Indikator gestartet

Wie wir im vorherigen Chart sehen können, gibt es drei Linien des Indikators: zwei Linien, die den Preis von oben und unten umgeben und einen Kanal bilden, und eine mittlere Linie, die den halben Abstand des Kanals darstellt.


Donchian Channel EA

In diesem Teil verwenden wir diesen nutzerdefinierten Donchian Channel Indikator in einem Handelssystem, indem wir einen Expert Advisor erstellen, der verwendet werden kann, um Signale basierend auf der Bewegung oder dem Verhalten des Indikators zu generieren. Dazu gibt es zwei verschiedene Methoden: Entweder wir schreiben den Code des Indikator-Konzepts in den EA oder wir verwenden die iCustom-Funktion, um den von Ihnen erstellten Indikator an den EA anzuhängen. Hier werden wir sehr einfache Systeme entwerfen, nur um das Konzept zu verstehen und zu sehen, wie wir diese Systeme auf der Grundlage der zweiten Methode verbessern können, da wir gelernt haben, wie man den Indikator erstellt.

Im Folgenden geht es um diese EAs:

Donchian Channel Simple EA

Wir beginnen mit der Erstellung des ersten Systems, das dazu verwendet werden kann, einen Kommentar auf dem Chart mit den Werten des Indikators (Channel High, Channel Middle und Channel Low) auszugeben. Wir brauchen also ein Programm, das diese Werte ständig überprüft und überwacht und sie als Kommentar auf dem Chart ausgibt.

Im Folgenden werden die Schritte zur Erstellung dieser Art von EA beschrieben:

Wir erstellen die Eingabevariable des Indikators indPeriod mit einem Standardwert (20), aber der Nutzer kann sie über die Eingaben des EA aktualisieren. 

input int indPeriod=20; //Period

Wir erstellen eine globale Integer-Variable donChianChannel.

int donchianChannel;

In OnInit() erstellen wir das Handle donchianChannel mit der Funktion iCustom, die das Handle des erstellten nutzerdefinierten Donchian Channel Indikators zurückgibt. Die Parameter sind:

  • symbol: Zur Angabe des Symbolnamens wird _Symbol verwendet, das für das aktuelle Symbol gilt.
  • period: zur Angabe des Zeitrahmens wird PERIOD_CURRENT verwendet, das für den aktuellen Zeitraum gilt.
  • name: um den Namen des Indikators und seinen Pfad anzugeben.
  • Danach geben wir die Eingaben des Indikators an, hier die Periodenlänge des Indikators indPeriod.
donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);

In OnDeinit() verwenden wir die Print-Funktion, um im Expert Advisor eine Meldung mit dem Text „Donchian Channel EA Removed“ auszugeben, wenn der EA entfernt wird.

Print("Donchian Channel EA Removed");

In OnTick() erstellen wir drei Arrays: channelBuff, channelBuff1, middleBuff

double channelBuff[],channelBuff1[], middleBuff[];

Um die Daten jedes Puffers des nutzerdefinierten Donchian Channel Indikators zu erhalten, verwenden wir die Funktion CopyBuffer(). Die Parameter:

  • indicator_handle: zur Angabe des Indikator-Handles wird das erstellte Handle donchianChannel für alle drei Puffer verwendet.
  • buffer_num: um die Puffernummer anzugeben, verwenden wir 0 für channelBuff, 1 für channelBuff1 und 2 für middleBuff verwendet.
  • start_pos: um die Position des ersten zu kopierenden Elements anzugeben, wird für alle drei Puffer 0 verwendet.
  • count: zur Angabe der Anzahl der zu kopierenden Daten, wir verwenden 3 für alle drei Puffer.
  • buffer[]: Um das zu kopierende Ziel-Array anzugeben, werden die drei Puffer (channelBuff, channelBuff1 und middleBuff) angegeben.
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);

Definition der aktuellen Werte jeder Zeile nach Erstellung einer Variablen vom Typ double für alle.

   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];

Wir verwenden die Funktion comment(), um einen Kommentar auf dem Chart mit drei Werten jeweils in einer eigenen Zeile auszugeben.

Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);

Im Folgenden ist der vollständige Code in einem Block dargestellt

input int indPeriod=20; //Period
int donchianChannel;
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   Comment("Channel High: ",channelHigh,"\nChannel Middle: ",channelMiddle,"\nChannel Low: ",channelLow);
  }

Nachdem wir diesen Code ohne Fehler oder Warnungen kompiliert haben, finden wir ihn im Navigator-Fenster im Ordner Expert Advisor. Wenn wir ihn auf dem gewünschten Chart starten, erscheint sein Fenster mit den Eingaben:

dcSimpleEA-Eingabefenster

Nach dem Start können wir feststellen, dass der EA zusätzlich zu den Niveaus des Donchian Channel Indikators als Kommentar auf dem Chart ausgibt, wie im Folgenden zu sehen:

dcSimpleEA gestartet und Signal

Wie wir sehen können, haben wir das gewünschte Signal auf dem Chart, das der Kommentar von drei Werten des Indikators ist (Channel High, Channel Middle und Channel Low), jeder Wert in einer separaten Linie.

Zur Bestätigung können wir zwischen den Signalwerten von EA und den Werten des Indikators vergleichen, wir können das folgende Bild finden, um zu sehen, dass der Indikator eingefügt ist und seine Werte im Datenfenster mit den Signalwerten von EA übereinstimmen, wie das folgende Bild zeigt:

dcSimpleEA-Signal und Indikator


Wenn wir diesen EA verbessern wollen, um Signale zu finden, die auf den Bewegungen und Niveaus des Indikators basieren, werden wir versuchen, dies durch die folgenden Handelssysteme (EAs) zu tun, indem wir versuchen, Bedingungen zu setzen, die auf dem Konzept des Indikators basieren, um Kauf- und Verkaufssignale zu erhalten.

Donchian Channel Breakout EA:

In dieser Version des EA muss das Programm kontinuierlich alle drei Werte der Indikatoren überprüfen, und wenn der Preis (Ask) das Hoch des Kanals durchbricht, müssen wir ein Kaufsignal als Kommentar auf dem Chart erhalten. Das andere Szenario, wenn der Preis (Bid) den unteren Kanal kreuzt, müssen wir ein Verkaufssignal als Kommentar auf dem Chart schreiben. Wenn es etwas anderes gibt, brauchen wir nichts zu empfangen.

Im Folgenden finden Sie den vollständigen Code zur Erstellung dieser Art von Handelssystem (EA):

input int indPeriod=20; //Period
int donchianChannel;
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(ask>channelHigh)
     {
      Comment("Buy Signal");
     }
     else if(bid<channelLow)
     {
      Comment("Sell Signal");
     }
     else Comment(" ");
  }

Unterschiede in diesem Code sind die gleichen wie die folgenden:

Abrufen von Ask und Bid durch Verwendung der Funktion SymbolInfoDouble, um die Kurswerte (Ask, Bid) zurückzugeben, nachdem für sie double-Variablen erstellt wurden.

   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

Bedingungen der Strategie,

Im Falle eines Kaufs

Wir brauchen das Programm, um den Ask und den Channel High zu überprüfen, um ihre Positionen zu bestimmen. Wenn der Ask über der oberen Kanalgrenze liegt, ist dies die Kaufbedingung, und der EA muss ein Kaufsignal als Kommentar auf dem Chart ausgeben, sobald diese Bedingung erfüllt ist.

   if(ask>channelHigh)
     {
      Comment("Buy Signal");
     }

Im Falle des Verkaufs

Wir brauchen das Programm, um Bid und die untere Kanalgrenze zu überprüfen, um ihre Positionen zu bestimmen. Wenn der Bid unter der unteren Kanalgrenze liegt, ist dies die Verkaufsbedingung, und der EA muss ein Verkaufssignal als Kommentar auf dem Chart ausgeben, sobald diese Bedingung erfüllt ist.

     else if(bid<channelLow)
     {
      Comment("Sell Signal");
     }

Im Falle von nichts

Wir brauchen den EA auch, um nichts zurückzugeben, wenn es keine Kauf- oder Verkaufsbedingungen gibt.

else Comment(" ");

Nachdem wir diesen Code ohne Fehler oder Warnungen kompiliert haben, können wir ihn im Chart ausführen, indem wir ihn auf den gewünschten Chart ziehen, um Signale zu erhalten, die auf der Strategie basieren, wie in den folgenden Beispielen:

Im Falle eines Kaufsignals:

dcBreakout Kaufsignal

Wie wir in der oberen linken Ecke des vorherigen Charts sehen können, haben wir ein Kaufsignal, nachdem wir das Hoch des Kanals nach oben durchbrochen haben.

Im Falle eines Verkaufssignals

dcBreakout Verkaufssignal

Wie wir in der oberen linken Ecke des vorherigen Charts sehen können, haben wir ein Verkaufssignal, nachdem der Tiefpunkt des Kanals nach unten durchbrochen wurde.

Im Falle von nichts

dcBreakout kein Signal

Wie wir sehen können, gibt es kein Signal, da sich der Preis innerhalb des Kanals bewegt, was bedeutet, dass der Preis unter der oberen und über der unteren Kanalgrenze liegt.

Donchian Channel und MA-Durchbruch:

Jetzt müssen wir den EA ein wenig verbessern, indem wir Signale filtern, indem wir den gleitenden Durchschnitt zu den Bedingungen der Strategie hinzufügen, und das ist, was wir in diesem Handelssystem tun werden. Wir müssen also ein Kaufsignal erhalten, wenn der Preis (Ask) über das Hoch des Kanals ausbricht, falls der 200-Perioden-EMA (Exponential Moving Average) unter dem Ask liegt. Im Falle eines Verkaufssignals müssen wir sicherstellen, dass Bid unter das Kanaltief gefallen ist und gleichzeitig auch unter den 200-Perioden-EMA. In allen anderen Fällen sollten wir nichts erhalten.

Im Folgenden finden Sie den vollständigen Code für diese Art von Handelssystem:

input int indPeriod=20; //Period
input int maPeriod=200; //Moving Average Period
int donchianChannel;
int EMA;
double emaArray[];
int OnInit()
  {
   donchianChannel=iCustom(_Symbol,PERIOD_CURRENT,"My Files\\Donchian_Channel\\Donchian_Channel",indPeriod);
   EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   Print("Donchian Channel EA Removed");
  }
void OnTick()
  {
   double channelBuff[],channelBuff1[], middleBuff[];
   CopyBuffer(donchianChannel,0,0,3,channelBuff);
   CopyBuffer(donchianChannel,1,0,3,channelBuff1);
   CopyBuffer(donchianChannel,2,0,3,middleBuff);
   ArraySetAsSeries(emaArray,true);
   CopyBuffer(EMA,0,0,3,emaArray);
   double channelHigh=channelBuff1[0];
   double channelMiddle=middleBuff[0];
   double channelLow=channelBuff[0];
   double EMAValue=NormalizeDouble(emaArray[0],_Digits);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(ask>channelHigh&&ask>EMAValue)
     {
      Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA");
     }
     else if(bid<channelLow&&bid<EMAValue)
     {
      Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA");
     }
     else Comment(" ");
  }

Unterschiede in diesem Code sind die gleichen wie die folgenden:

Wir erstellen eine weitere Integer-Variable maPeriod für die Periodenlänge des EMA mit einem Standardwert (200), den der Nutzer jedoch nach seinen Wünschen aktualisieren kann.

input int maPeriod=200; //Moving Average Period

Erstellen einer globalen Integer-Variable für den EMA:

int EMA;

Erstellen des Arrays emaArray[]:

double emaArray[];

Aktualisieren der EMA-Variable, indem wir die Funktion iMA verwenden, um das Handle des Indikators für den gleitenden Durchschnitt zurückzugeben; die Parameter sind

  • symbol: zur Angabe des Symbols und wir verwenden (_Symbol) zur Anwendung auf das aktuelle Symbol.
  • period: Angabe des zu verwendenden Zeitrahmens (_period), der auf den aktuellen Zeitraum angewendet werden soll.
  • ma_period: Zur Angabe des Periodenlänge der Mittelwertbildung wird die Nutzereingabe von (maPeriod) verwendet.
  • ma_shift: um anzugeben, ob es eine Verschiebung gibt, verwenden wir (0), da wir keine Verschiebung benötigen.
  • ma_method: um die Art der Glättung des gleitenden Durchschnitts anzugeben, verwenden wir (MODE_EMA), da wir den exponentiellen gleitenden Durchschnitt benötigen.
  • applied_price: zur Angabe der Art des Preises wird (PRICE_CLOSE) verwendet.
EMA = iMA(_Symbol,_Period,maPeriod,0,MODE_EMA,PRICE_CLOSE);

Mit der Funktion ArraySetAsSeries kann die AS_SERIES eingestellt werden, die Parameter sind

  • array[]: Zur Angabe des Arrays wird das emaArray verwendet.
  • flag: Um die Richtung der Array-Indizierung festzulegen, wird true verwendet.
ArraySetAsSeries(emaArray,true);

Verwendung der Funktion CopyBuffer zum Abrufen von Daten aus dem Puffer des gleitenden Durchschnitts

CopyBuffer(EMA,0,0,3,emaArray);

Definition des EMA-Wertes und Normalisierung des Wertes

double EMAValue=NormalizeDouble(emaArray[0],_Digits);

Bedingungen der Strategie,

Im Falle eines Kaufs

Wenn der Preis > der oberen Kanalgrenze, müssen wir den folgenden Kommentar auf dem Chart zeigen:

  • Buy signal (Kaufsignal)
  • Ask above Channel High (Ask über Channel High)
  • Ask above (period) EMA (Ask über EMA)
   if(ask>channelHigh&&ask>EMAValue)
     {
      Comment("Buy Signal","\nAsk above Channel High","\nAsk above (",maPeriod,") EMA");
     }

Im Falle des Verkaufs

Wenn der Preis < der unteren Kanalgrenze, müssen wir den folgenden Kommentar auf dem Chart zeigen:

  • Sell signal (Verkaufssignal)
  • Bid below Channel Low (Bid unter Channel Low)
  • Bid below (period) EMA (Bid unter EMA)
     else if(bid<channelLow&&bid<EMAValue)
     {
      Comment("Sell Signal","\nBid below Channel Low","\nBid Below (",maPeriod,") EMA");
     }

Falls kein Signal vorhanden ist

else Comment(" ");

Nach der Kompilierung dieses Codes ohne Fehler oder Warnungen, können wir die Signale dieses Handelssystems wie folgt finden

Im Falle eines Kaufsignals:

dc & EMABreakout Kaufsignal

Wie wir im vorherigen Beispiel sehen können, haben wir das Kaufsignal und die Bedingungen dieses Signals, nämlich dass der Preis über dem Hoch des Kanals liegt und der 200 EMA erfüllt ist, auf den Charts kommentiert, wie wir es brauchen.

Im Falle eines Verkaufssignals

dc & EMABreakout Verkaufssignal

Wie wir im vorherigen Beispiel sehen können, haben wir das Verkaufssignal und die Bedingungen dieses Signals, nämlich dass der Preis unter dem Tiefpunkt des Kanals liegt und der 200 EMA erfüllt ist, wie wir es brauchen.

Falls kein Signal vorhanden ist

dc & EMABreakout kein Signal

Wie wir sehen können, gibt es kein Signal auf dem Chart anzeigt, da der Preis über der unteren und unter der oberen Kanalgrenze liegt, auch wenn der der Preis unter dem 200 EMA liegt, was einen Verkauf signalisiren könnte.


Schlussfolgerung

Wie wir durch das erwähnte Thema dieses Artikels gelernt haben, haben wir festgestellt, dass der Donchian Channel Indikator ein nützliches und wertvolles Werkzeug sein kann, insbesondere nachdem wir ihn selbst als nutzerdefinierten Indikator erstellt haben, zusätzlich zur Erstellung von Handelssystemen, die auf dem Konzept des Indikators basieren. Er soll Sie in die Lage versetzen, Ihren eigenen Donchian Channel Indikator nach Ihren Vorlieben zu gestalten, damit er ein gutes Werkzeug für Ihren Handel ist. Darüber hinaus können Sie mit ihm und der Funktion iCustom ein Handelssystem (EA) erstellen, um die Signale auf der Grundlage des Indikators zu erhalten, das Sie auch noch verbessern können.

Ich hoffe, dass Sie diesen Artikel nützlich für Ihren Handel Reise in Bezug auf immer bessere Ergebnisse und Einblicke oder zumindest fanden Sie diesen Artikel nützlich und gab Ihnen gute Einblicke über eine andere verwandte Konzept. Ich werde auch nicht vergessen, noch einmal zu bestätigen, dass Sie den Inhalt dieses Artikels nicht in Ihrem realen Konto verwenden, bevor Sie ihn getestet haben, um sicherzustellen, dass er für Sie profitabel ist, da es kein Tool gibt, das für alle Menschen geeignet ist. 

Wenn Sie diesen Artikel nützlich gefunden und Sie wollen mehr Artikel für mich zu lesen, können Sie meine anderen Artikel von dieser Veröffentlichung Link zu lesen, können Sie eine Reihe von Artikeln darüber, wie man Handelssysteme auf der Grundlage der beliebtesten technischen Indikatoren und andere ich hoffe, Sie fanden sie nützlich auch zu erstellen.

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

Beigefügte Dateien |
dcSimpleEA.mq5 (0.74 KB)
dcBreakout.mq5 (0.91 KB)
Entwicklung eines Replay-Systems — Marktsimulation (Teil 03): Anpassen der Einstellungen (I) Entwicklung eines Replay-Systems — Marktsimulation (Teil 03): Anpassen der Einstellungen (I)
Beginnen wir mit der Klärung der gegenwärtigen Situation, denn wir haben keinen optimalen Start hingelegt. Wenn wir es jetzt nicht tun, werden wir bald in Schwierigkeiten sein.
Datenwissenschaft und maschinelles Lernen (Teil 14): Mit Kohonenkarten den Weg in den Märkten finden Datenwissenschaft und maschinelles Lernen (Teil 14): Mit Kohonenkarten den Weg in den Märkten finden
Sind Sie auf der Suche nach einem innovativen Ansatz für den Handel, der Ihnen hilft, sich auf den komplexen und sich ständig verändernden Märkten zurechtzufinden? Kohonenkarten (Kohonen maps), eine innovative Form künstlicher neuronaler Netze, können Ihnen helfen, verborgene Muster und Trends in Marktdaten aufzudecken. In diesem Artikel werden wir untersuchen, wie Kohonenkarten funktionieren und wie sie zur Entwicklung intelligenter und effektiverer Handelsstrategien genutzt werden können. Egal, ob Sie ein erfahrener Trader sind oder gerade erst anfangen, Sie werden diesen aufregenden neuen Ansatz für den Handel nicht verpassen wollen.
Kategorientheorie (Teil 9): Monoid-Aktionen Kategorientheorie (Teil 9): Monoid-Aktionen
Dieser Artikel setzt die Serie über die Implementierung der Kategorientheorie in MQL5 fort. Hier setzen wir Monoid-Aktionen als Mittel zur Transformation von Monoiden fort, die im vorigen Artikel behandelt wurden und zu mehr Anwendungen führen.
Frequenzbereichsdarstellungen von Zeitreihen: Das Leistungsspektrum Frequenzbereichsdarstellungen von Zeitreihen: Das Leistungsspektrum
In diesem Artikel erörtern wir Methoden zur Analyse von Zeitreihen im Frequenzbereich. Hervorhebung des Nutzens der Untersuchung der Leistungsspektren von Zeitreihen bei der Erstellung von Vorhersagemodellen. In diesem Artikel werden wir einige der nützlichen Perspektiven erörtern, die sich aus der Analyse von Zeitreihen im Frequenzbereich unter Verwendung der diskreten Fourier-Transformation (dft) ergeben.