English Русский 中文 Español 日本語 Português
Wie reduzieren Händler die Risiken

Wie reduzieren Händler die Risiken

MetaTrader 5Handel | 9 Februar 2018, 10:07
1 618 0
Aleksandr Masterskikh
Aleksandr Masterskikh

Inhalt


Einführung

Zunächst einmal wird dieser Artikel eine Hilfe für unerfahrene Händler und Analysten sein, die ihre eigenen Handelsstrategien entwickeln. Aber auch erfahrene Marktteilnehmer können etwas Sinnvolles finden, wie z.B. die Klassifizierung von Risikoarten, die Anwendung einer Kerzenanalyse zur Definition von überkauften/überkauften Bereichen, die Beziehung zwischen fundamentaler und technischer Analyse, die Auswahl von Periodenlängen für die Berechnung von gleitenden Durchschnitten sowie die Reduzierung von Risiken im Zusammenhang mit einem möglichen Preiskorrektur.

Der Artikel beschäftigt sich mit den folgenden Themen:

  • Das Wesen des Handelsprozesses an den Finanz- und Aktienmärkten in Bezug auf die Dynamik;
  • Gewinnwahrscheinlichkeit im Handel;
  • Möglichkeiten, die Risiken des Händlers bei der Entwicklung eines Handelssystems zu reduzieren.

Ich verspreche keine umfassende Analyse und vollständige Klassifizierung der Risiken beim Handel an den Finanzmärkten. Stattdessen werden wir uns auf die wichtigsten Marktrisiken konzentrieren, die mit der Preisdynamik von Finanzinstrumenten verbunden sind. Außerdem werden wir die Risiken beleuchten, die nicht direkt mit der Marktdynamik verbunden sind, aber dennoch für die Effizienz des Handels wichtig sind. Beim Verfassen des Artikels habe ich meine Erfahrungen aus der Analyse und Entwicklung von Handelssystemen genutzt.

Der EA in der Version für MQL5 befindet sich hier.


Was sind Finanzmärkte in Bezug auf die Prozessdynamik?

Bei der Entwicklung von Handelsstrategien (sowohl für den manuellen als auch für den automatisierten Handel) sollten wir verstehen, mit welchem Prozess wir es zu tun haben. Die Preisbewegung auf den Finanzmärkten ist kein stationärer Prozess. Sie wird von mehreren, oft nicht zu bestimmenden Faktoren beeinflusst.

Der nicht-stationäre Charakter des Prozesses wird durch das Verhalten der Marktteilnehmer verursacht. Ihre Reaktionen gehen in verschiedenste Richtungen. Daher lässt sich die Veränderung von Amplitude (Preisspanne) und Frequenz (Schwankungshäufigkeit) im Markt nicht durch deterministische Verhaltensgesetze bestimmen. Im Allgemeinen kann ein solcher Prozess als zufällig angesehen werden.

Obwohl es auch Bereiche gibt, in denen eine Bewegung korrekt vorhergesagt werden kann. Führen wir die Faktoren auf, bei denen das zutrifft.

  • Wellenförmige Kursbewegungen. Wir sind in der Lage, den Beginn der Welle zu definieren: zum Beispiel durch die Kerze, die eine Gruppe der gleitenden Durchschnitte kreuzt, oder durch Signale von herkömmlichen Indikatoren. Sprechen wir aber jetzt noch nicht über die genaue Definition. Hier stellen wir nur fest, dass dies möglich ist.
  • Enge Konsolidierungszonen (der Preis verlässt sie immer).
  • Einige Regeln für die Reaktion auf bestimmte grundlegende, grundlegende und technische Faktoren.

Wie hoch ist die Wahrscheinlichkeit, an den Finanzmärkten Gewinn zu erzielen?

Das ist die Hauptfrage, denn jeder Händler ist in Wirklichkeit ein Investor. Die Wahrscheinlichkeit, mit dem Handel an den Finanzmärkten Gewinne zu erzielen, steht in direktem Zusammenhang mit der Richtigkeit der Prognose über die Trendfortsetzung, da sich die Hauptbewegungsspanne genau in den Trendbereichen befindet.

Es gibt viele Methoden zur Berechnung der Trendfortsetzung oder -umkehr. Sie alle haben einen gemeinsamen Nachteil, da jedes Handelssystem ein Modell des Marktstatus' ist. Die Beurteilung der Genauigkeit eines solchen Modells ist immer problematisch. Erstens ist der Prozess selbst aufgrund seines nicht-stationären (zufälligen) Charakters in Bezug auf die Dynamik ziemlich kompliziert. Zweitens sind alle Bewertungsmethoden über die Genauigkeit "innerhalb" eines Zufallsprozesses ebenfalls komplex und ihre Effizienz unklar.

Um die Möglichkeit der Gewinnerzielung einzuschätzen, gehen wir also den umgekehrten Weg und verwenden tatsächliche (und nicht berechnete) Daten. Um dies zu tun, müssen wir Statistiken über die Effizienz des Devisen- und Börsenhandels analysieren, die von Investment- und Brokerfirmen bereitgestellt werden.

Nach den Angaben im Artikel "Effektivität des privaten Devisenhandels in Russland und den USA" (auf Russisch) betrug seit 2015 der Anteil der profitablen privaten Händler in Russland 28%, während er in den USA 33% betrug. Natürlich können diese Daten nicht als erschöpfend betrachtet werden, da nur eine begrenzte Anzahl von Unternehmen in die Studie einbezogen wurde und der Studienzeitraum nur sechs Monate betrug. Wie dem auch sei, diese Zahlen geben uns einen Einblick. Was ist die mögliche Schlussfolgerung?

Herkömmliche Analysemethoden, die von den meisten Marktteilnehmern verwendet werden, erlauben es uns nicht, den Prozess der Preisbewegung auf den Finanzmärkten effektiv vorherzusagen. Zusätzliche Maßnahmen, einschließlich Methoden des Geldmanagements, sind ebenfalls ineffizient. Der Grund liegt in der anfänglichen Ineffizienz der Basisprognose der Marktdynamik, die mittels technischer und fundamentaler Analysen durchgeführt wird. So erzielen weniger als ein Drittel der Finanzmarktteilnehmer Gewinne.

Was die Börse betrifft, so ist die Statistik nicht einheitlich. Ich werde relativ "moderate" Daten zitieren. Nach einer Untersuchung der französischen Agentur für Finanzmärkte verlieren acht von zehn Einzelhändlern schließlich ihr Geld. Das bedeutet, dass die Effizienz des Börsenhandels 20% beträgt. Dies ist sogar noch schlimmer als auf dem Forex-Markt, obwohl der Wert vergleichbar ist.

Wie wir sehen, ist eine umfassende Risikobetrachtung für jeden Investor von größter Bedeutung.

Lassen Sie uns zwei Hauptgruppen von Risiken hervorheben:

  • Risiken, die mit der Dynamik der Preisbewegung verbunden sind;sprechen und sie daher ineffizient sind.
  • Risiken, die nicht mit der Marktdynamik verbunden sind.

Wir werden diese Risiken und die Möglichkeiten, sie zu reduzieren, genauer betrachten.

Wir beginnen mit der ersten Gruppe von Risiken. Ihre Auflistung wird auf der Grundlage der Analyse von Finanzinstrument-Charts ermittelt. Wir müssen die Elemente eines Charts und ihre Parameter analysieren, einschließlich der Eigenschaften der einzelnen Kerzen und ihrer Gruppen sowie der gleitenden Durchschnitte. Wir werden keine der anderen konventionellen Indikatoren verwenden, da ihre mathematischen Modelle nicht dem Konzept der Preisbewegung entsprechen und sie daher ineffizient sind.


Marktrisiken im Zusammenhang mit der Dynamik der Preisbewegungen

Technisch gesehen ist das größte Risiko des Händlers eine Trendwende. Der Preis eines Finanzinstruments kann die Richtung ändern und sich entgegengesetzt zur offenen Position bewegen. Wenn eine Position noch nicht eröffnet wurde, liegt das Risiko in der Prognose einer solchen Trendumkehr.

Jeder Händler hat seine eigene Definition eines Trends. So merkwürdig es auch erscheinen mag, es gibt keine "offizielle" Definition dieses Begriffs in der technischen Analyse, und das bedeutet, dass auch die Bewertung der Wahrscheinlichkeit einer Trendumkehr subjektiv ist. Die kritische Amplitude (während einer Trendumkehr), die von jedem Händler definiert wird, hängt vom akzeptablen Risiko (Risikolimit) ab. Dieser Wert wird wiederum durch die Höhe der Geldmittel auf dem Konto jedes Händlers definiert. Mit anderen Worten, alles hängt von der maximal möglichen Inanspruchnahme (drawdown) ab. Was gut für eine Bank ist, ist schlecht für einen normalen Händler.

Werfen wir einen Blick auf die Risikoarten und suchen wir nach Lösungen, um sie zu reduzieren.

Klassifizierung der mit der Marktdynamik verbundenen Risiken

Die traditionelle Analyse zeigt drei Arten von Trends anhand ihrer Dauer auf: kurz-, mittel- und langfristige Trends.

Auch lokale und globale Trends werden oft erwähnt. Traditionell sind lokale Trends eher kurz- oder mittelfristig. Globale Trends haben eine längerfristige Tendenz. Es gibt keine klar definierten Werte, die Zeitgrenzen und Schwankungsbreiten dieser Konzepte bestimmen. Alles ist relativ. Vereinfachen wir daher die Analyse: Das Ausmaß der Kurskorrektur ist als Kriterium für das Risiko der Trendumkehr zu verwenden. Wir bewerten sie hinsichtlich wichtiger technischer Niveaus oder abhängig von der Höhe der Einlage des Händlers unter Berücksichtigung der vorgegebenen Risikobeschränkung.

Zur Klassifizierung der Risiken, die mit der Möglichkeit einer Trendwende verbunden sind, müssen auch die Faktoren der Marktpreisdynamik berücksichtigt werden. Untersuchen wir das kurz.

  • Risiken verbunden mit hoher Volatilität zum Zeitpunkt des Markteintritts.
  • Risiken verbunden mit dem Vorhandensein von Widerstandsniveaus zum Zeitpunkt des Markteintritts.
  • Risiken, zum Zeitpunkt des Markteintritts in eine überkaufte/überverkaufte Zone zu gelangen.
  • Risiken verbunden mit der Abwesenheit von klaren Trends zum Zeitpunkt des Markteintritts.
  • Risiken verbunden mit einer falschen Auswahl des Berechnungszeitraums der Indikatoren.
  • Risiken verbunden mit der Verwendung von Pending-Orders zum Zeitpunkt des Markteintritts.
  • Risiken verbunden mit der Unsicherheit der Preisschwankungen nach dem Markteintritt.
  • Risiken verbunden mit einer Preiskorrektur nach dem Markteintritt.
  • Risiken verbunden mit der Verwendung von nur einem Zeitrahmen in der Analyse.
  • Risiken verbunden mit der Verwendung von nur einer Analyseform (technisch oder fundamental).

Risiken verbunden mit hoher Volatilität zum Zeitpunkt des Markteintritts

Viele Händler berücksichtigen diese Art von Risiko überhaupt nicht. Dies ist ein großer Fehler, da das Ausmaß der Preisbewegung (auch gegen den Haupttrend) bei hoher Volatilität ansteigt. Das ist der Risikofaktor.

Die Bewertung der Volatilität anhand traditioneller Indikatoren ist zu subjektiv. Erstens sind die Einstellungen der Indikatoren selbst subjektiv, und zweitens sind ihre mathematischen Modelle nicht immer für eine solche Bewertung ausgelegt. Daher ist es zuverlässiger, die Konsolidierungszone als Modell zu verwenden, das den notwendigen Grad der Volatilität beim Markteintritt festlegt.

Um dieses Risiko zu reduzieren, können wir im Algorithmus für die Positionseröffnung folgende Bedingung festlegen: Einen Grenzwert für die Schwellenamplitude aus der letzten Kurshistorie. Eine solche Preisspanne kann wie folgt festgelegt werden:

  • Die Preisspanne zwischen zwei gegenüberliegenden Fraktalen
  • oder die Preisspanne einer Anzahl von Kerzen.

Eine Begrenzung durch eine Anzahl von Kerzen ist die einfachste Methode. Schauen wir uns den entsprechende Code-Ausschnitt an:

 //---ERÖFFNUNGSALGORITHMUS - KAUF-----------------------------------------------------------------------------------------
      
  if( 
   //----REDUZIEREN DES RISIKOS VERBUNDEN MIT HOHER VOLATILITÄT BEI MARKTEINTRITT ----
  
     //Simulieren der Abwesenheit von hoher Volatilität der letzten Zeit:
     ( High[1] - Low[1]) <= 200*Point &&                       //Grenze der Amplitude des kleineren Zeitrahmens (tfМ1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //Grenze der Amplitude des höheren Zeitrahmens (tfМ15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //Grenze der Amplitude des Kanals des höheren Zeitrahmens (tfМ15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //Grenzaktivität der vorher. Bar im Vergleich zur vor-vorherigen 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //gleich

Abb. 1. Modul des Algorithmus' der Eröffnung: Risiken verbunden mit hoher Volatilität zum Zeitpunkt des Markteintritts

Abb. 1 zeigt der Abschnitt des Algorithmus für die Positionseröffnung (Kauf).

Notation:

  • High{1], High[2], High[3] — Hochs der drei vorherigen Bars in M1,
  • H_prev_m15, H_2p_m15, H_3p_m15 — Hochs der drei vorherigen Bars in M15,
  • Low[1], Low[2], Low[3] — Tiefs der drei vorherigen Bars in М1,
  • L_prev_m15, L_2p_m15, L_3p_m15 — Tiefs der drei vorherigen Bars in М15.

Das Modul ermöglicht es Ihnen, die Risiken zu reduzieren, die entstehen, wenn sich der Einstiegspunkt im Bereich einer beträchtlichen Volatilität befindet. Dies wird durch die Modellierung eines horizontalen Preiskanals sowie durch die Modellierung der Aktivität (moderate Volatilität) am Ende des Kanals erreicht.

Preiskanäle auf den Zeitrahmen М1 und М15 werden simuliert, indem die Preisspanne der Kerzen auf die vorhergehenden drei begrenzt wird. Die Begrenzung der Spanne erfolgt sowohl für einzelne Kerzen als auch für die gesamte Kerzengruppe. Die Breite des Kanals ist definiert als Differenz zwischen den Extremwerten der ersten und letzten Kerze.

Eine moderate Volatilität am Ende des Kanals wird simuliert, indem das Verhältnis der Spannen zweier benachbarter Kerzen des Zeitrahmens M1 begrenzt wird (in diesem Fall beträgt das angewandte Verhältnis 1,1 bis 3,0). Natürlich können Sie auch andere Verhältnisse für die Preisspannen verwenden.

Die Frage ist, warum wir die Breite des gesamten Kanals festlegen sollten. Reicht es nicht aus, die Amplitude jeder Kerze einzustellen? Nein, ist es nicht. Wenn wir die Breite des gesamten Kanals nicht definieren, kann sich ein wellenförmiger (und nicht horizontaler) Kanal bilden, dessen Breite doppelt so groß sein kann wie die einer einzelnen Kerze.

Dieses Beispiel ist für einen Kauf. Für einen Verkauf bleibt der Code derselbe, da die Breite des Kanals und der einzelnen Kerzen als Differenz zwischen High und Low definiert ist, während die Richtung von einem anderen Modulen des Algorithmus für die Eröffnung und nicht im aktuellen festgelegt wird.

Risiken verbunden mit dem Vorhandensein von Widerstandsniveaus zum Zeitpunkt des Markteintritts.

Die Marktteilnehmer reagieren unterschiedlich auf die Widerstandsniveaus auf dem Chart. Für die einen ist dies das Gewinnziel, für andere eine Begrenzung der Verluste, für dritte das ursprüngliche Ziel einer Kurskorrektur. Aus diesem Grund sind Fraktalebenen oft von Bereichen umgeben, in denen sich der Preis innerhalb einer kleinen Spanne unterschiedlich bewegt. Die Risiken der Positionseröffnung sind in solchen Zonen erhöht, während nach den Testergebnissen verschiedener Handelssysteme eine Prognose innerhalb dieser Zonen ineffizient ist. Daher erscheint es sinnvoll, wenn eine Position außerhalb des Widerstandsniveaus in Richtung eines Trends liegt.

Wie können wir dieses Handelsrisiko berücksichtigen?

Wenn die Position bereits in Richtung eines Widerstandsniveaus geöffnet ist und sich der Preis nähert, dann ist es besser, diese Position im Voraus zu schließen, da eine hohe Wahrscheinlichkeit besteht, dass eine starke Korrektur das Ergebnis schmälert.

Wenn Sie eine Position nach Ihrem Algorithmus eröffnen wollen, nachdem der Preis den Widerstand überschritten hat, dann warten Sie auf einen zuverlässigen Ausbruch in der gewählten Richtung.

In der Tat handelt es sich hier um eine Frage falscher und wahrer Korrekturen. Eine der möglichen Lösungen wäre die folgende. Warten Sie, bis sich nach einem Fraktal ein neuer Widerstand gebildet hat. Dann warten Sie, bis der Preis diese durchbricht. Stellen Sie sicher, dass Sie einen der niedrigeren Zeitrahmen verwenden. Aber auch das reicht nicht aus. Die gegenwärtige Dynamik sollte eine deutliche Aktivität in Richtung des Durchbruchs und jenseits des neuen Fraktals aufweisen.

Der Nachteil dieses Ansatzes ist die Unsicherheit eines Zeitrahmens. Er wird subjektiv gewählt, weil es unmöglich ist, die Preisspanne für den Ausbruch im Voraus vorherzusagen. Daher vereinfachen wir das Problem, indem wir die Bedingung stellen, dass der Widerstand zur Eröffnungszeit existieren muss.

Bei der Entwicklung eidnes Handelssystems können wir mehrere Optionen im Algorithmus der Eröffnung verwenden, um das Risiko im Zusammenhang mit dem Vorhandensein von Widerständen zu reduzieren.

  • Möglichkeit 1. Die Suche nach dem nächstgelegenen Widerstand eines Fraktals (im Code wird es mit Hilfe einer Schleife implementiert). Der Vorteil dieser Methode: Wir werden in diesem Zeitraum den wirklichen Widerstand finden. Es gibt jedoch zwei Nachteile. Erstens, die Entwicklung von Schleifen kann schwierig sein für unerfahrene Programmierer. Zweitens kann sich herausstellen, dass das Fraktal zu alt ist, was bedeutet, dass es als Widerstand irrelevant geworden ist.
  • Möglichkeit 2. Verwenden Sie High (zum Kauf) und Low (zum Verkauf) der vorherigen Kerze. Es gibt zwei Vorteile dieser Methode. Erstens kann es einfach programmiert werden. Zweitens können Sie mehrere Zeitrahmen gleichzeitig verwenden, was der Suche nach älteren Fraktalen entspricht. Nachteil: Einige Fraktale können nicht erkannt werden, da die Extrema der Kerzen nur bei Anwesenheit von sogenannten Schatten gültige Fraktale sind.

Sowohl für Anfänger als auch bei der Entwicklung von manuellen Strategien empfehlen wir die Option 2: Sie ist einfach und effizient, obwohl sie durch den Verlust einiger Fraktale an Genauigkeit abnimmt. Hier ist das Codefragment:

 //----REDUZIEREN DES RISIKOS VERBUNDEN MIT EXISTENZEN VON WIDERSTÄNDEN BEI MARKTEINTRITT-----
  
     //Simulate the situation when the current price passes through the local resistance levels:
       Bid > High[1] &&           //in М1 (kleinerer Zeitrahmen)
       Bid > H_prev_m15 &&        //in М15 (höherer Zeitrahmen)

Abb. 2. Modul des Eröffnungs-Algorithmus: Reduzierung der Risiken, die mit dem Vorhandensein von Widerständen beim Markteintritt verbunden sind.

Die Abb. 2 zeigt das Modul im Eröffnungsalgorithmus zur Reduzierung der Risiken, die mit dem Vorhandensein von Widerständen für eine Aufwärtsbewegung verbunden sind, für einen Kauf. Dies wird dadurch erreicht, dass eine bestimmte Bedingung gestellt wird, dass der aktuelle Kurs den Widerstand in Form des Hochs der vorherigen Kerze bereits überschritten hat (getrennt nach zwei Zeiträumen).

Wir sollten zusätzlich die Bewegungsaktivität festlegen. Um die doppelte Variablen zu vermeiden, wurde dies jedoch in anderen Modulen (in denen sowohl die Richtung als auch die Aktivität festgelegt sind) durchgeführt.

Um zu verkaufen, verwenden wir das Tief der vorherigen Kerze (Zeitrahmen M1 und M15) als Unterstützung unter Berücksichtigung eines Abwärtstrends.

Risiken, zum Zeitpunkt des Markteintritts in eine überkaufte/überverkaufte Zone zu gelangen.

Zu diesen Risiken gehört die Eintrittswahrscheinlichkeit am Ende einer aktiven wellenförmigen Bewegung, wenn die verbleibende Ku in Kursspanne klein ist und die Umkehrwahrscheinlichkeit stark ansteigt. Solche Bereiche sind nichts anderes als überverkaufte/überkaufte Zonen. Die Verwendung traditioneller Indikatoren (RSI etc.) für ihre Definition ist oft ineffizient, in vielen Fällen sind ihre Signale falsch. Der Grund ist derselbe: Herkömmliche Indikatoren verfügen über keine adäquaten mathematischen Algorithmen zur Bestimmung dieser Bereiche. Für eine genauere Suche nach überkauften/überkauften Gebieten müssen Sie die Anzeichen einer Verlangsamung des Trends erkennen (auch bei M1, da diese sofort die Dynamik einer Trendumkehr in allen anderen Zeitrahmen anzeigt).

Wir werden die Anzeichen einer Verlangsamung erkennen, indem wir die Kombination von Fraktalen und Kerzen nach den folgenden Kriterien analysieren:

  • Verringerung eines Abstandes (Größe der Kursspanne) zwischen den benachbarten fraktalen Widerständen. Um die Amplituden zweier benachbarter Gebiete vergleichen zu können, benötigen wir drei Fraktale;
  • Erhöhung der Korrektur innerhalb einer Kerze, Verminderung des Kerzenkörpers (Interna der Kerze wird analysiert);
  • Die Drehrichtung der Pivot-Verschiebung der Kerze im Verhältnis zum Pivot der vorhergehenden Kerze zu ändern (hierfür werden drei Kerzen benötigt).

Wenn diese Methode verwendet wird, sollte die Bedingung für das Fehlen der aufgelisteten Faktoren dem Eröffnungsalgorithmus hinzugefügt werden. Dies kann z.B. mit falsch und wahr geschehen, wobei wahr bedeutet, dass die spezifizierten Verlangsamungsfaktoren auf dem Markt vorhanden sind.

Es gibt jedoch eine einfachere Möglichkeit. Sie steht nicht in direktem Zusammenhang mit der Suche nach einem überkauften/überkauften Zonen. Hier wird ein indirektes Zeichen verwendet: Wenn Sie zu Beginn einer wellenförmigen Bewegung den Markteintritt ermöglichen, wird die Wahrscheinlichkeit, in einen überkauften/überkauften Bereich zu fallen, stark reduziert. Tatsächlich simulieren wir die Anfangsphase eines lokalen Trends.

  • Zuerst müssen wir den Schnittpunkt eines oder mehrerer gleitender Durchschnitte (MA) innerhalb derselben Kerze identifizieren - dies ist der mögliche Beginn einer wellenförmigen Bewegung. Um den Beginn der Welle zu bestätigen, benötigen wir zusätzliche Bedingungen (siehe unten).
  • Dann simulieren wir die Anfangsphase der wellenförmigen Bewegung. Es wird der Beginn eines neuen Trends sein. Um dies zu erreichen, geben wir an: Richtung der Kerze nach der Ausbruch; ihre Aktivität; Richtung des schnellen МАs, der den Ausbruch auf der vorherigen Bar mitmacht; die aktuelle Preislage relativ zu diesem МАs.

Hinweis: Bei der Simulation der Anfangsphase eines lokalen Trends wird empfohlen, nur die Richtung des schnellen MAs festzustellen. Es ist nicht nötig, die Richtung des schnellen МАs festzulegen.

Der Grund für eine so unterschiedliche Verwendung der gleitende Durchschnitte ist folgender: Die langsameren MAs haben aufgrund ihrer größeren Verzögerung keine Zeit, sich in Richtung eines neuen Trends umzukehren. Folglich, wenn wir ihre Richtung festlegen, kann der simulierte Einstiegspunkt in den Markt weit vom Anfang des Trends entfernt sein und in eine gefährliche überkaufte/überkaufte Zone fallen.

Die zweite Option (Simulation der Anfangsphase eines lokalen Trends) ist einfacher und wird daher für unerfahrene Entwickler empfohlen. Schauen wir uns den Code-Abschnitt an:

//---REDUZIEREN DES RISIKOS VERBUNDEN MIT EINEM MARKEINTRITT IM ÜBERKAUFTEN BEREICH -----
  
    //Simulate binding to the beginning of the way to reduce the porbability of entering in the overbought area:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //Wellenbeginn - nicht mehr als drei Bars (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //gleich
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //Wellenbeginn - auf der vorherigen Bar im höheren Zeitrahmen (М15)
    

Abb. 3. Modul de Eröffnungsalgorithmus: Reduzierung des Risikos, zum Zeitpunkt des Markteintritts in einen überkauften Bereich zu fallen.

Notation:

  • МА8_prev, МА8_2p, МА8_3p — МА mit einer Periodenlänge von 8, berechnet auf der 2. bzw. 3. Bar (М1),
  • МА5_prev_m15, МА5_2p_m15, МА5_3p_m15 — МА mit einer Periodenlänge 5, berechnet auf der 2. bzw. 3. Bar (М15),
  • Die Extrema der Kerzen wurden vorher ermittelt (siehe Abb. 2).

Das Risiko, in einen überkauften Bereich zu fallen, wird reduziert, indem man einen Einstiegspunkt an den Beginn einer geschätzten Welle bindet. Das Signal für einen Wellenanfang ist ein MA, das von der Kerze gekreuzt wird: M1, der МА mit der Periodenlänge 8, M15, МА mit der Periodenlänge 5. Der Wert der Perioden gleitender Durchschnitte wird aus der Fibo-Serie ausgewählt. Auf diesen Parameter werden wir im Abschnitt "Risiken verbunden mit einer falschen Auswahl des Berechnungszeitraums der Indikatoren" näher eingehen.

Dieses Modul spezifiziert keine Parameter, die die Aktivität und Richtung von Kerzen und MAs sowie die Position des aktuellen Preises relativ zu MAs charakterisieren. Dies geschieht, um keine Variablen zu duplizieren. Diese Parameter werden wir im Modul aus dem Modul "Risiken verbunden mit der Abwesenheit von klaren Trends zum Zeitpunkt des Markteintritts" einstellen.

Beachten Sie, dass das Kreuzen von Kerze und MA im Zeitrahmen M1 nicht auf einer Bar in der Historie beschränkt ist. Sie wird durch das logische ODER gesetzt - entweder auf der vorherigen, oder auf der zweiten, oder auf der dritten Bar (auf M1). Auf M15 gibt es für diesen Fall eine einfache Kreuzungsoption - auf der vorherigen Bar. Diese Reihe von möglichen Optionen ermöglicht es, multi-varianten, realen Marktsituationen zu berücksichtigen, die mit der Entwicklung eines lokalen Trends relativ zu einer solchen Kreuzung verbunden sind.

Das obige Beispiel wurde für einen Kauf geschrieben (vermeiden der überkaufte Zone). Für einen Verkauf (Vermeidung des überverkauften Bereichs) ist das Modul das gleiche, da der Algorithmus von МА, der mit einer Kerze kreuzt, nicht von der Bewegungsrichtung abhängt.

So haben wir zwei Wege in Betracht gezogen, um in den Markt einzutreten, ohne in die überkauften/überkauften Bereiche zu fallen, sowie diese Bereiche zu finden. Mit diesen Methoden können Sie bei der Erstellung Ihres Handelssystems oder bei der Entwicklung von Handelsindikatoren selbst experimentieren.

Risiken verbunden mit der Abwesenheit von klaren Trends zum Zeitpunkt des Markteintritts

Das Fehlen eines deutlich erkennbaren Trends ist ein weiterer Unsicherheitsfaktor der Preisdynamik und des damit verbundenen Risikos. Es handelt sich um Situationen, in denen der Markt entweder von einem Seitwärtsmarkt mit geringer bis sehr geringer Schwankungsbreite beherrscht wird.

Es ist schwierig, die vorherrschende Richtung des Preises zu bestimmen, da er sich in einem engen Bereich ständig ändert. Damit steigt das Risiko eines Fehlers bei der Prognose einer Richtung für den Markteintritt.

Die Problematik ist noch komplizierter, da uns die herkömmlichen analytischen Methoden keine klare Definition einer Seitwärtsbewegung liefern (genauso wie beim Trends). Daher gibt es keine Definition der Grenze zwischen einer Seitwärtsbewegung und dem Beginn eines Trends. Bestehende Methoden sind sehr subjektiv: die Methode der quadratischen Abweichung (z.B. im StdDev-Indikator) sowie fortgeschrittene adaptive Funktionen (z.B. FRAMA). Noch komplizierter wird das Problem, wenn es sich um grafische Methoden einer Trenddefinition handelt. Unterschiedlichen Interpretationen zufolge werden verschiedene Marktsegmente (einschließlich derjenigen mit einer ziemlich großen Amplitude) als Seitwärtsmarkt angesehen. Dies führt zu entgangenen Gewinnen.

Nach meiner persönlichen Erfahrung (bestätigt durch die Ergebnisse von Handelssystemen oder HS) ist der effizienteste Weg die Grenzen einer Seitwärtsbewegung zu definieren ist, eine absoluten Spannbreite innerhalb des Seitwärtstrends zu ermitteln.

Aber wir müssen uns daran erinnern: Wenn die Amplitude größer als der gewählte Schwellenwert ist, heißt das nicht, dass wir einen neuen Trend sehen! Also schnell die Position sofort zu öffnen. Sie müssen diese Daten mit der aktuellen Dynamik bestätigen.

Die Anwendung absoluter Schwellenwerte erscheint vielversprechender als die Schätzung der relativen Amplitudenwerte, die unter den Bedingungen eines zufälligen, nicht stationären Prozesses nur sehr schwer zu definieren sind. Natürlich handelt es sich um eine ernsthafte Vereinfachung, aber in der Praxis bringt sie gute Ergebnisse. Ohne sie werden Sie mit einem ernsten Problem und komplexen theoretischen Berechnungen konfrontiert, da die Grenze zwischen einer Wohnung und einem Trend Gegenstand der Fuzzy-Logik ist.

Werfen wir einen Blick auf das Codabschnitt (für einen Kauf):

 //---REDUZIEREN DES RISIKOS VERBUNDEN MIT DER ABWESENHEIT EINES TRENDS BEI MARKTEINTRITT-------
  
      //Simulieren der Kerzenrichtung im kleineren Zeitrahmen:
      Close[2] > Open[2] &&      //vor-vorherige Aufwärtskerze (М1)
      Close[1] > Open[1] &&      //vorherige Aufwärtskerze (М1)
      
      //Simulieren der Richtung der gleitenden Durchschnitte im höheren Zeitrahmen:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //aufwärts МАs: Verwende gleitende Durchschnitte mit einer Periodenlänge von 5 und 60 (М1)
      
      //Simulieren einer Hierarchie von gleitenden Durchschnitten im kleineren Zeitrahmen:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //eine "Hierarchie" von 3 МАs auf М1 (Fibo-Periodenlängen:5,8,13), ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des kleineren Zeitrahmens:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //aktueller Preis liegt über МА (5,8,13,60) auf М1, ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren der Kerzenrichtung im höheren Zeitrahmen:
      C_prev_m15 > O_prev_m15 &&       //vorherige Aufwärtskerze (М15)
      
      //Simulieren der MA-Richtung im höheren Zeitrahmen: 
      MA4_cur_m15 > MA4_2p_m15 &&     //Aufwärts-MAs mit Periodenlänge 4 (М15)
      
      //Simulieren der Hierarchie von gleitenden Durchschnitten im höheren Zeitrahmen: 
      MA4_prev_m15 > MA8_prev_m15 &&  //eine "Hierarchie" von 2 МАs auf М15 (Periodenlängen:4 und 8), ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des höheren Zeitrahmens:
      Bid > MA4_cur_m15 &&            //aktueller Preis liegt über МА4 (M15), ein indirektes Zeichen eines Aufwärtstrends 
      Bid > MA24_cur_h1 &&            //aktueller Preis liegt über МА24 (M15), ein indirektes Zeichen eines Aufwärtstrends 
      
      //Simulieren eines Mikrotrends innerhalb der aktuellen Kerze im kleineren Zeitrahmen wie zum Einstiegspunkt:
      Bid > Open[0] &&               //Gegenwart eines Aufwärtsbewegung innerhalb der aktuellen Kerze (М1)
       
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im höheren Zeitrahmen:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne (vorherige Kerze М15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //Korrektur ist kleiner als 25% der Kerzenamplitude (vorherige Kerze М15)
      H_prev_m15 > H_2p_m15 &&                                       //Aufwärtstrend durch Widerstände (zwei Kerzen М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //Es gibt einen Docht (vorherige Kerze М15) im Verhältnis zum Körper der Kerze
      
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im kleineren Zeitrahmen: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne (vorherige Kerze М1)
     (High[1] - Low[1]) > 70*Point &&                                //Amplitude der vorherigen Kerze überschreitet den Schwellenwert eins (nicht total flach)
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //Korrektur ist kleiner als 20% der Kerzenamplitude (vorherige Kerze M1)
      High[1] > High[2] &&                                           //Aufwärtstrend wegen lokaler Widerstände (zwei Kerzen М1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //Docht (vorherige Kerze tfМ1) relativ zum Eröffnungspreis
      

Abb. 4. Modul des Eröffnungsalgorithmus: Reduzierung der Risiken, die mit dem Fehlen eines klar definierten Trends zum Zeitpunkt des Markteintritts verbunden sind.

Notation:

  • Open[1], Close[1] — Eröffnungs- und Schlusskurs der vorherigen Bar (М1);
  • МА5_cur, MA8_cur, MA13_cur, MA60_cur — МА-Werte der aktuellen Bar mit den Periodenlängen 5, 8, 13 und 60 (М1);
  • MA4_cur_m15, MA4_prev_m15, MA4_2p_m15 — МА mit der Periodenlängen 4 der vorherigen und vor-vorherigen Bar (М15);
  • MA8_prev_m15 — МА-Werte mit der Periodenlänge 8 der vorherigen Bar (М15).

Wir reduzieren dieses Risiko, indem wir einen klar definierten Trend in zwei Zeitrahmen (M1 und M15) gleichzeitig simulieren:

  • Die vorhergehenden Kerzen in Richtung der Positionseröffnung (zwei Kerzen bei М1 und eine Kerze bei М15);
  • Richtung der MAs (zwei МАs auf М1, ein MA auf М15);
  • Hierarchie der gleitenden Durchschnitte (drei МАs auf М1 und zwei MAs auf М15);
  • Position des aktuellen Preises relativ zu den MAs — drei МАs auf М1.

Dieses "Maßnahmenpaket" erhöht die Wahrscheinlichkeit, dass sich der Einstiegspunkt innerhalb eines klar definierten Trends und auf zwei Zeitrahmen gleichzeitig befindet, signifikant. Dementsprechend sinkt die Wahrscheinlichkeit, in einer Seitwärtsbewegung, zufällige Schwankungen und andere Bereiche eines unklaren Trends zu fallen. Das Risiko, das mit diesem ungünstigen Faktor verbunden ist, nimmt ebenfalls ab.

Dieses Beispiel bezieht sich auf einen Kauf. Für einen Verkauf wird der entgegengesetzte Algorithmus verwendet — die Abwärtsbewegung von Kerzen und МАs wird anstelle einer Aufwärtsbewegung gesetzt. Der Einstiegspunkt ist unterhalb der angegebenen МАs.

Risiken verbunden mit einer falschen Auswahl des Berechnungszeitraums der Indikatoren

Jeder Händler legt die Periodenlänge seiner Indikatoren, einschließlich des gleitenden Durchschnitts, auf der Grundlage seiner persönlichen Erfahrung fest. Jemand bevorzugt MA mit der Periodenlänge von 200, jemand bestimmt den Wert 50, während jemand die Fibo-Serie verfolgt. Intuitiv wählen wir spezifische Indikatoreneinstellungen (und vor allem den Zeitraum, für den wir uns am meisten interessieren).

Der Grund für diese forcierte Intuition liegt darin, dass die herkömmlichen Analysemethoden keine Mechanismen bieten, um frequenzmodulierte Schwingungen zu einem bestimmten Zeitpunkt zu identifizieren. Dies führt zu Unsicherheiten bei der Einstellung der Periodenlängen der Indikatoren. Natürlich gibt es Methoden zur Konstruktion adaptiver Funktionen (Kaufman, FRAMA etc.), aber ihre Algorithmen berücksichtigen auch nicht die sich ständig ändernde Häufigkeit von Marktschwankungen.

Betrachten wir die Teillösung: Wir verwenden konventionelle Analysemethoden und fügen bei der Definition der MA-Perioden eine gewisse Logik hinzu. Wir werden einige konstante Faktoren anwenden, die mit der Zeit zusammenhängen. Zu Gunsten dieses Prinzips ist die Tatsache, dass die Grenzen der Kerzen großer Zeiträume Fraktale für Intrakerzenbewegungen sind, aber nur, wenn diese Kerzen Dochte (Schatten) haben. Wenn es keinen Docht gibt, kann die Bewegung bis zur nächsten Kerze fortgesetzt werden, ohne dass ein Fraktal entsteht.

Wir vergleichen die Standard-Zeiträume und -Zahlen der Fibo-Reihe (ähnliche Größenordnung). Als Ergebnis erhalten wir die ungefähre Übereinstimmung zwischen Zeitrahmen und MA-Berechnungszeiträumen:

  • 1 Minute — nächster Fibo-Wert 1 (Minute, ein Pivotwert);
  • 5 Minuten — nächster Fibo-Wert 5 (Minuten);
  • 15 Minuten — nächster Fibo-Wert 13 (Minuten);
  • 1 Stunde (60 Minuten) — nächster Fibo-Wert 55 (Minuten);
  • 4 Stunden (240 Minuten) — nächster Fibo-Wert 3 (Stunden), 5 (Stunden), 233 (Minuten);
  • 1 Tag (24 Stunden) — nächster Fibo-Wert 21 (Stunden);
  • 5 Tage (Handelswoche, 120 Stunden für den Forexhandel) — nächster Fibo-Wert 89 (Stunden) und 144 (Stunden).

Darüber hinaus empfehlen wir eine Option, die Verzögerung des MA zu minimieren:

  • Verwendung nur der ersten Zahlen der Serien für jeden Zeitrahmen: 1 (Pivot), 3, 5, 8, 13;
  • Verwendung derer in komplexer Weise: Konvertieren in einen kleineren Zeitrahmen mittels des Verhältnisses zum Zeitrahmen. Verwendung des MA mit einem minimalen Periodenlänge, die die Verzögerung der Funktionen reduziert.

Als Ergebnis erhalten wir eine Reihe von MAs für die verschiedenen Zeitrahmen (beispielsweise bei den vier verwendeten Zeitrahmen):

  • für М1: МАs mit Periodenlängen 5, 8, 13, 55 (oder 60 =1 Stunde), 233 (oder 240 = 4 Stunden);
  • für М15: МАs mit Periodenlängen 5, 8, 13, 55 (oder 60=4 Stunden?);
  • für Н1: МАs mit Periodenlängen 5, 8, 13, 21 (oder 24 = 1 Tag), 89, 144 (oder 120 = 5 Tage);
  • für D1: МАs mit Periodenlängen 5, 8, 13, 21 (or 24 = 1 Handelsmonat).

Natürlich sind diese MAs nur ein Beispiel. Es steht Ihnen frei, eigene Werte hinzuzufügen. Wie dem auch sei, dieses Prinzip der Wahl der MA-Perioden hat das Recht zu existieren, da viele Faktoren, einschließlich des Beginns und des Endes der Handelszeiten, der statistischen Periodizität, der Dividendenausschüttung usw., eine klar definierte Periodizität haben. So erlaubt uns die logische Wahl des Indikatorzeitraums (in diesem Fall MA), die Häufigkeit der Marktereignisse zu berücksichtigen und somit die Risiken in gewissem Umfang zu reduzieren.

Wir werden diese Empfehlungen bei der Auswahl der MAs bei der Entwicklung weiterer beschriebener Module anwenden.

Risiken verbunden mit der Verwendung von Pending-Orders zum Zeitpunkt des Markteintritts

Hierunter verstehen wir Strategien, die sich auf schwebende Aufträge (und nicht auf marktübliche) stützen, um ein Zielniveau festzulegen. Häufiger werden Pending-Orders in Strategien verwendet, die mit dem Ausstieg aus den Konsolidierungszonen verbunden sind.

Bei aller Vielfalt solcher Strategien, lassen Sie uns über die Verwendung eines Paares von schwebenden Aufträgen sprechen, die auf beiden Seiten der Konsolidierungszone platziert wurden, in der Hoffnung, dass ein Auftrag korrekt funktioniert und der zweite sofort nach dem Auslösen des ersten Auftrags entfernt wird. Beachten Sie, dass die Verwendung von Pending-Orders zur Bestimmung eines Einstiegspunkts mit einem Risiko verbunden ist. Der Preis, mit dem die Pending-Order abgeschickt wird, wird immer definiert, bevor der gewünschte Preis erreicht wird. Die Pending-Order wird z.B. in % der Konsolidierungsgebietsamplitude oder intuitiv definiert, und das hat nichts mit der realen Preisdynamik zu tun.

Tatsächlich ist dies der Hauptnachteil der Pending-Orders im Vergleich zu Marktorders - die Unfähigkeit, die Eröffnung einer Position bei Vorhandensein von negativen Faktoren zum Zeitpunkt des Eintritts zu vermeiden. Unmittelbar nach Erreichen des Zielkurses kann sich die Marktdynamik für diese schwebende Orderart als ungünstig erweisen, der Markteintritt wird aber dennoch verlustbringend erfolgen.

Wenn Sie also immer noch von bestimmten festen Niveaus aus handeln wollen, dann ist es sinnvoller, diese innerhalb des Eingangsalgorithmus virtuell zuzuordnen, anstatt Standard-Pending-Orders anzuwenden. Betreten Sie den Markt mit festen Niveaus nur dann, wenn die notwendige Dynamik beim Überschreiten erkannt wurde. Dies ist natürlich komplizierter als die herkömmlichen Pending-Orders, da wir einen zusätzlichen Algorithmus zur Steuerung der Dynamik benötigen, wenn der Preis eine virtuelle Ebene überschreitet (Programmierkenntnisse für die Entwicklung eines solchen Algorithmus sind ebenfalls erforderlich). Dies ermöglicht es Ihnen jedoch, den Handel "im Dunkeln" loszuwerden, was bei der Anwendung konventioneller Pending-Orders unvermeidlich ist.

Diese Methode hat auch ihre Nachteile. Wenn der Preis das erforderliche Niveau erreicht, eröffnen wir die Position mit Hilfe der Marktorder (nicht 'pending', schwebend), die sich später als die bereits erteilten Pending-Orders in der Plattform des Brokers widerspiegelt. Bei einer großen Anzahl von Aufträgen ist die Wahrscheinlichkeit der Ausführungsverzögerung aufgrund der Auftragspriorität hoch. Im Falle eines starken Preisanstiegs zum Zeitpunkt des Eintrags ist auch ein Abrutschen möglich.

Daher sollten wir uns zwischen dem Risiko entscheiden, "im Dunkeln" mit Hilfe von Pending-Orders einzutreten, und dem Ausführungsrisiko von Marktorders. Gleichzeitig hat der Einsatz einer virtuellen Ebene den Vorteil, dass das System die Eingabe automatisch stornieren kann, wenn bei Erreichen der definierten Stufe keine weiteren günstigen Bedingungen für den Markteintritt bestehen.

Meine persönliche Meinung: Da die Verwendung von schwebenden Aufträgen das Risiko erhöht, ist es notwendig, dieses Risiko durch den Verzicht auf solche Aufträge zu reduzieren. Dies ist unter anderem dadurch gerechtfertigt, dass nur der Markt die Spanne der Preisbewegungen bestimmt. Unser einziges Ziel ist es, solche Bewegungen in einem bestimmten Entwicklungsstadium zu fixieren und sie dann mit analytischen Funktionen zu begleiten.

Risiken verbunden mit der Unsicherheit der Preisschwankungen nach dem Markteintritt

Ein typischer Fehler vieler Händler ist, dass sie übermäßig süchtig nach der Definition bestimmter Zielwerte sind. Betrachtet man einen zufälligen, nicht stationären Prozess der Preisbewegung, so ist die endgültige Trendamplitude ein Wahrscheinlichkeitswert. Wie bei den oben beschriebenen schwebenden Aufträgen ist die Platzierung von festen Zielgewinnniveaus (z.B. für die Definition eines Marktaustrittspunktes) intuitiv. Daher führt dieser Ansatz oft zu Verlusten.

Der Marktaustrittsalgorithmus sollte entweder eine Funktion zur Steuerung der Anzeichen einer Verlangsamung (adaptive Funktion) oder die Funktion zur Steuerung eines festen Amplitudenwertes in Bezug auf bestimmte Niveaus (Eingangsniveau, aktuelles Hoch oder Tief der offenen Position) enthalten. Wir werden auch die Risikobegrenzungskontrolle in die zweite Option aufnehmen - sowohl pro Position als auch für die gesamte Einlage. Wir werden die letzte, einfachere Version verwenden. Schauen wir uns den Code-Abschnitt an:

 //REDUZIEREN DES RISIKOS VERBUNDEN MIT THE UNCERTAINTY OF THE PRICE MOVEMENT AMPLITUDE BEI MARKTEINTRITT-- 
             
              //Track the fixed profit value (per position):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //Schließen in Gewinn
                     ||
                     
             //Verwalten der maximal zulässigen Abweichung 
             //vom aktuellem Maximum nach dem Markteintritt:    
             (shift_buy >= 1 &&                                                                          //shift um nicht mehr als 1 Kerze von Einstiegspunkt
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //hier ist das Maximum nach dem Einstiegspunkt
             Max_pos > OrderOpenPrice() &&                                                               //aktuelles Maximum ist im Gewinn
             Bid < Max_pos &&                                                                            //es gibt eine Preisumkehr
             (Max_pos - Bid) >= 200*Point)                                                               //umgekehrte Abweichung vom aktuellen Maximum betreffs Schließen der Position
                    ||
                      
             //Verfolgen des vordefinierten Risikolimits (pro Position):     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //Einstiegsbedingung in der Verlustzone (Stop-Loss)
                    ||
                    
             //Verfolgen des vordefinierten Risikolimits (gesamte Einlage):
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //if the risk limit for the entire deposit has been exceeded during the current trading 

Abb. 5. Modul des Exit-Algorithmus: Reduzierung der Risiken, die mit der Unsicherheit der Preisbewegungsamplitude nach einem Markteintritt verbunden sind.

Notation:

  • OrderOpenPrice() — Eröffnungspreis;
  • Shift_buy — Shift (in M1-Bars) relativ zur Eröffnung (notwendig, um ein Maximum während einer offenen Position zu definieren);
  • Max_pos  — Das Hoch während einer Position;
  • AccountBalance()Kontostand in Geldwerten;
  • Depo_first — Ersteinlage in Geldwerten;
  • Percent_risk_depo — maximal zulässiger Verlust in % vom Saldo.

Diese Art von Risiko wird durch die folgenden Funktionen reduziert:

  • Die Verwaltung des fixen Gewinns pro Position ist in der Tat ein "Schatten"-Take-Profit.
  • Verwalten der maximal zulässigen Preisabweichung vom aktuellen Maximum (für Kaufen) oder Minimum (für Verkaufen) nach dem Schließen einer Position.
  • Die Verwaltung einer vordefinierten Risikobegrenzung pro Position ist ein "Schatten"-Stop-Loss.
  • Verwaltung einer vordefinierten Risikobegrenzung für die gesamte Einlage.

In all diesen Fällen steuern wir einen bestimmten Amplitudenwert relativ zu den Niveaus, die ihren Wert verändern können, einschließlich des Einstiegsniveaus, des Maximums innerhalb der offenen Position und der Ersteinlage. Im Gegensatz zu den eng gesteckten Zielwerten sind diese daher in diesem Fall nicht fixiert.

Wir haben im Beispiel eines Kaufs den Algorithmus zum Schließen der Position besprochen. Für einen Verkauf muss nur die Handelsrichtung geändert werden. Anstelle des aktuellen Maximums innerhalb der Position (Max_pos) wird das aktuelle Minimum (Min_pos) verwendet.

Im nächsten Abschnitt betrachten wir Risiken, die auch die Preisgeschwindigkeit berücksichtigen, die besonders wichtig ist, wenn der Marktpreis einbricht.

Risiken verbunden mit einer Preiskorrektur nach dem Markteintritt

Eine der gefährlichen Formen einer lokalen Trendumkehr sind die Crashes und Spikes mit großer Amplitude in kurzer Zeit. Der Sprung einer Währung in einem Paar bedeutet immer den Zusammenbruch einer anderen Währung. Besonders gefährlich ist es, wenn es eine offene Position gibt und die Richtung des Zusammenbruchs ungünstig ist. In diesem Fall kann eine kleine Anzahlung komplett verloren gehen.

Der Kern des Problems

  • Die Preise bei einer heftigen Preiskorrektur lassen den Marktteilnehmern keine Zeit, angemessen darauf zu reagieren.
  • Die moderne Analytik bietet keinen Mechanismus zur Identifizierung dynamischer Strukturen, die für eine scharfe Preiskorrektur verantwortlich sind.
  • Bei einer offenen Position sind die Marktteilnehmer bei Kurseinbrüchen völlig schutzlos. Es ist ziemlich schwierig, einen Kollaps frühzeitig zu erkennen und erst recht darauf zu reagieren, da die Hauptbewegungsspitze bereits überschritten ist oder der Markt aufgrund von Panik in der Kette von Brokern und Banken blockiert ist.

Als Folge davon erleiden die Marktteilnehmer enorme Verluste. Zum Beispiel fiel der Dow Jones Index am 6. Mai 2010 in 6 Minuten um 1000 Punkte, während der Markt nach Expertenschätzungen rund eine Billion Dollar verlor.

Jüngstes Beispiel (Abb. 6) ist der Brexit, das Einbruch des GBPUSD am 24. Juni 2016 um 560 Punkte provoziert hat. Allein 473 Punkte in einer Minute:

GBPUSD 24/06/2014

Abb. 6. GBPUSD Preissturz vom 24. Juni 2016

Es gibt drei globale Gründe für Preiseinbrüche.

  1. Die Natur des Marktes selbst. Der Zusammenbruch ist nicht etwas Fremdes, sondern eine natürliche Manifestation der Marktdynamik. Das kann unter anderem zu starken Veränderungen der Geschwindigkeit der Preisbewegungen führen (z.B. durch die wachsende Zahl von Marktteilnehmern, darunter auch Handelsroboter). Medienberichten zufolge werden beispielsweise Tausende ultraschneller Schwankungen von weniger als einer Sekunde Dauer an der US-Börse registriert.
  2. Analytik-Entwicklungsebene. Die Methoden zur Identifizierung solcher Marktmanifestationen sind unvollkommen. Die adäquate Reaktion erfordert die Fähigkeit, die Situation in Bruchteilen einer Minute zu analysieren, während zweite Zeitrahmen für Marktplattformen eine Seltenheit sind.
  3. Fehler einer Gesetzgebung, die die Aktivitäten auf den Finanzmärkten regelt. So gibt es beispielsweise keine rechtlichen Mechanismen zur Bekämpfung der künstlichen Preismanipulation durch Market-Maker.

Hier ist ein Beispiel dafür, wie ein MACD-basierter EA viel zu langsam ist, um auf einen scharfen Einbruch des USDCHF-Preises zu reagieren:


USDCHF- MACD

Abb. 7. Ein EA auf Basis eines MACD hat keine Zeit, um auf einen scharfen Einbruch des USDCHF am 2. Okt. 2015 zu reagieren

Die Abb. 7 zeigt, dass der EA zwei Positionen eröffnet - vor (Pfeil 1) und nach (Pfeil 2) dem Kurseinbruch. Er reagierte nicht auf den Einbruch, weil er ihn einfach "nicht erkannte".

Wenn Sie also eine offene Position haben, besteht das Risiko, dass Sie bei einer Kurskorrektur oder einer Kursrallye einen wesentlichen Teil der Einlage verlieren. Das bedeutet, dass der Algorithmus für die Positionsschließung über ein spezielles Schutzmodul verfügen sollte.

Schauen wir uns den Code-Abschnitt an:

 if( 
            //REDUZIEREN DES RISIKOS VERBUNDEN MIT KURSKORREKTUR BEI MARKTEINTRITT---------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //exit conditions (in any zones) during a price collapse (reference point - М1 current candle open price)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //Ausstiegsbedingungen (in jedem Bereich) während des Preiseinbruchs (Referenzpunkt - aktuelle Kerze М15, Eröffnungspreis)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //Ausstiegsbedingungen (in jedem Bereich) während des Preiseinbruchs (Referenzpunkt - vorherige Kerze М1, Kerzenamplitude)
                     ||

Abb. 8. Modul im Exit-Algorithmus: Reduzierung der Risiken bei Preiskorrekturen nach einem Markteintritt

Das Risiko eines Kurskollaps nach der Eröffnung einer Position wird auf folgende Weise reduziert.

  • Die Grenzen der Preisumkehrabweichung (Kollaps) werden relativ zum Eröffnungspreis der aktuellen Kerze separat auf verschiedenen Zeiträumen festgelegt (in unserem Fall sind dies М1 und М15). Die maximal zulässige Dauer eines solchen Zusammenbruchs ist ebenfalls definiert.
  • Die Amplitude des maximal zulässigen Zusammenbruchs in Form der abgeschlossenen vorherigen Kerze auf M1 wird eingestellt (da es sich um eine Minutenkerze handelt, wird indirekt auch der Zeitpunkt des Zusammenbruchs angegeben).

So wird der Zusammenbruch sowohl am Anfang der aktuellen Kerze (unter Verwendung des Zusammenbruchs der vorherigen Kerze) als auch im Verlauf ihrer Entwicklung verfolgt. Tritt eine der angegebenen Bedingungen auf (durch ODER-Verknüpfung), wird die Position geschlossen - das Risiko wird minimiert.

In diesem Beispiel wird das Modul zum Schließen einer Kaufposition gezeigt. Um einen Verkauf zu schließen, betrachten Sie die Kursbewegung spiegelbildlich.

Risiken verbunden mit der Verwendung von nur einem Zeitrahmen

Kursveränderungen werden in den Charts der verschiedenen Zeitrahmen unterschiedlich dargestellt. Der scheinbare Trend zu einem niedrigeren Zeitrahmen kann nur eine geringfügige Korrektur sein, wenn wir ihn bei einem höheren betrachten.

Deshalb sollten wir die Preisdynamik in mehreren Zeitrahmen analysieren - einer reicht nicht aus.

Wie viele Zeiträume sollten für die Analyse verwendet werden? Die Antwort auf diese Frage liegt bei Ihnen. Persönlich benutze ich vier Zeitrahmen gleichzeitig (auf vier Bildschirmen), weil:

  • М1: Dieser Zeitrahmen ist gut geeignet, Trendumkehrungen (einschließlich globaler) und schnelle Marktzusammenbrüche zu zeigen;
  • М15: Kerzen auf dieses Zeitrahmens spiegeln oft die abgeschlossenen dynamischen Strukturen schneller Marktcrashs wider, die sich in niedrigeren Zeiträumen gebildet haben (М1 und М5);
  • Н1: Kerzen dieses Zeitrahmens sind natürliche Zeitbegrenzer (u.a. im Zeitplan der Handelssitzungen, Veröffentlichung von makroökonomischen Indizes, Nachrichten usw.);
  • D1: Kerzen dieses Zeitrahmens sind natürliche Begrenzungen (einschließlich Handelstage innerhalb einer Woche).

Ich glaube, dass diese Zeiträume eine effiziente Gruppe bilden, da sie es Ihnen ermöglichen, die Marktdynamik genau zu analysieren. Natürlich brauchen wir etwas Erfahrung mit der "volumetrischen" Wahrnehmung von Preisbewegungen, aber das ist für die Arbeit an den Finanzmärkten unerlässlich.

Da die Verwendung eines Zeitrahmens zwangsläufig die Risiken des Handels erhöht, sollte der Code des Eröffnungsalgorithmus die Analyse von Kerzen, MAs und anderen Indikatoren in Bezug auf mehrere Zeitrahmen beinhalten.

Risiken verbunden mit der Verwendung von nur einer Analyseform (technisch oder fundamental)

Die Preisbewegung wird von vielen Faktoren beeinflusst. Der Markt ist ein Verhaltenssystem, das auf den wirtschaftlichen Interessen der Teilnehmer basiert. Die technische Analyse (auf der die Handelsroboter basieren) verwendet nur eine Art von Daten - die Preise eines bestimmten Finanzinstruments. Die Fundamentalanalyse berücksichtigt wiederum nur eine Art von Daten (z.B. einen bestimmten makroökonomischen Faktor). Offensichtlich ist eine solche Analyse unvollständig, einseitig und daher ungenau. Es wäre falsch, nur die Preise zu analysieren, ohne die Faktoren ihrer Bewegung zu berücksichtigen, oder sich nur auf fundamentale Indikatoren zu konzentrieren, ohne die reale Dynamik des Preises zu berücksichtigen.

Sinnvoller ist es, beide Analysearten zu kombinieren, da sie sich logisch ergänzen. Grundlegende Faktoren im Allgemeinen (aber nicht unbedingt) bestimmen die Richtung der Preisbewegung, während technische Faktoren dies bestätigen. Aber der Vorrang fundamentaler Faktoren gegenüber technischen Faktoren ist nicht absolut.

Manchmal reagiert der Markt eher auf technische als auf fundamentale Faktoren, zum Beispiel beim Erreichen historischer Höchststände. Ein markantes Beispiel dafür ist der periodische Kollaps des Bitcoins (manchmal um 20% pro Tag) unmittelbar nach Erreichen eines historischen Höchststandes. Das Beispiel der Bitcoins ist jedoch nicht wirklich beispielgebend, da die fundamentale Analyse der Kryptowährung aufgrund der Marktspezifika problematisch ist.

Jedoch im Falle von Forex und vor allem Aktienmarkt, die Auswirkungen der fundamentalen Analyse ist offensichtlich. Beispielsweise wurde der Zusammenbruch von USDCHF (im Oktober 2015) durch die Schweizer Bank provoziert, die den CHF-Kurs vom EUR-Kurs "losbindet".

Daher ist es meines Erachtens sinnlos zu versuchen, die Priorität einer der Analysearten zu definieren, sondern sie stattdessen zu kombinieren. Es stellt sich jedoch die Frage: Wie können wir die Fundamentalanalyse im automatisierten Handel nutzen, wenn man bedenkt, dass die Algorithmen des Handelssystems nur technische Marktparameter verwenden?

Wir schlagen zwei Möglichkeiten vor, die Fundamentalanalyse in die Handelsstrategie (HS) einzubetten.

  • Möglichkeit 1. Implementieren Sie die grundlegenden Analyseparameter im HS-Algorithmus, indem Sie sie in technische Parameter umwandeln (z.B. geben Sie die Daten des Wirtschaftskalenders ein, nachdem Sie ihre Aktionslogik definiert haben).
  • Möglichkeit 2. Manuelle Begrenzung der Richtung bei einem Markteintritt innerhalb eines Expert Advisors (nur in der Richtung, die den fundamentalen Parametern entspricht).

Wie wir sehen können, ist die Verwendung der Fundamentalanalyse im Algorithmus umständlich, aber das ist der richtige Weg. Die kombinierte Anwendung der beiden Methoden im manuellen Handel ist einfacher. Das ist es, was Anfänger Analysten und Händler anstreben sollten.


Risiken, die nicht mit der Marktdynamik verbunden sind

Externe Faktoren — operative, finanzielle und rechtliche — sind ebenfalls Teil des Handelsprozesses. Sie spielen eine ebenso wichtige Rolle beim Eintreten von Risiken. Deshalb sollten wir sie möglichst bei der Entwicklung eines Handelssystems berücksichtigen.

Definieren wir ihre Liste.

Risikoklassen, die nicht mit einer Marktdynamik verbunden sind

Hier sind die häufigsten möglichen Risiken, die nicht mit der Preisdynamik zusammenhängen.

  • Risiken, die mit der Struktur des Handelssystems verbunden sind.
  • Risiken, die mit der Überschreitung eines Verlustlimits pro Einlage verbunden sind (Verwaltung des Risikolimits des Anlegers pro Einlage).
  • Risiken, die mit negativen Veränderungen der Handelsbedingungen verbunden sind.
  • Risiken, die durch die Qualität der Verbindung mit dem Handelsserver eines Brokers bestimmt werden.
  • Risiken, die mit der Erlaubnis zum automatisierten Handel auf der Seite des Brokers oder Kunden verbunden sind.
  • Risiken im Zusammenhang mit Änderungen der Finanzmarktgesetzgebung.

Schauen wir uns diese Risiken und die Möglichkeiten, sie zu reduzieren, genauer an.

Risiken verbunden mit der Struktur des Handelssystems

Die wichtigste Regel: Die Struktur eines Handelssystems sollte die Struktur der Risiken berücksichtigen. Es sollte den Schutz vor der größtmöglichen Anzahl der oben genannten Risiken umfassen. Dies wird die Handelseffizienz verbessern.

Während wir jedoch die Anzahl der Blöcke erhöhen, um Risiken zu minimieren, erhöhen wir zwangsläufig die Anzahl der Filter, da jede Methode zur Vermeidung von Risiken in Wirklichkeit ein Filter ist. Das Ergebnis ist die "Überfilterung" des Eröffnungsalgorithmus eines Handelsroboters. Gleichzeitig glauben die meisten Händler, dass der Roboter aktiv handeln sollte, indem er mindestens täglich Positionen eröffnet. In diesem Sinne agiert ein Händler als Kunde eines Roboters, und eine solche Anforderung erscheint für ihn logisch. Ich glaube jedoch, dass dies aufgrund der Natur des Prozesses falsch ist.

Jeder EA-Algorithmus simuliert sehr komplexe dynamische Prozesse und vereinfacht diese zwangsläufig. Die Fehler beziehen sich auf die unvollständige Anpassung eines bestimmten EA-Modells an die Dynamik des Marktes.

Jeder Entwickler weiß, dass es einen Zusammenhang zwischen der Anzahl der Positionen in einem Handelssystem und dem Umfang der Filterung im Eröffnungsalgorithmus gibt. Je größer die Anzahl der Filter, desto geringer die Anzahl der Eröffnungen und umgekehrt. Im Allgemeinen verbessert sich mit zunehmender Filtration das Finanzergebnis. Aber natürlich hängt alles vom Inhalt der Filter ab. Sie müssen einen Kompromiss zwischen der Anzahl der Einträge und dem Finanzergebnis, genauer gesagt, dem maximalen Risiko (Inanspruchnahme der Einlage) für jedes Handelssystem finden. Dies nennt man konventionelle Optimierung.

Aber was ist Filtration?

Wenn es sich dabei um die Zuweisung eines Nutzsignals aus dem gesamten Spektrum handelt, dann brauchen wir klare Kriterien für diese Nützlichkeit. Die herkömmliche Analyse kann sie nicht bieten. Die Aktivierung herkömmlicher Indikatoren kann kaum als "richtige" Filtration eines so komplexen Prozesses wie der Preisbewegung bezeichnet werden. Wenn wir zum Beispiel Elliotts Wellen oder technische Muster anwenden, um ein nützliches Signal zu finden, werden wir feststellen, dass sie nicht für die Analyse geeignet sind, da jeder Händler sie auf demselben Chart unterschiedlich bestimmt.

Daher sollte die Struktur des Handelssystems die Risiken reduzieren, indem sie die kritischen Werte ​​der Parameter aussortiert, anhand derer diese Risiken bestimmt werden. Aber es gibt viele Risiken, und der Grad der Filtration wächst mit der Menge. Bei der Bewertung der Effizienz eines einzelnen EAs kommt es daher nicht auf die Anzahl der Einträge an, sondern auf einen stabilen (wenn auch niedrigen) Gewinn mit einem akzeptablen Risiko (Drawdown). In diesem Fall kann die Anzahl der Einträge (bei der Prüfung auf ein einzelnes Finanzinstrument) unbedeutend sein. Der Gewinn kann durch gleichzeitiges Handeln auf mehrere Währungspaare erhöht werden.

Daraus folgt die Schlussfolgerung:

Die Anzahl der zu eröffnenden Positionen ist ein sekundärer Faktor bei der Beurteilung der Qualität des EA. Die Hauptsache ist seine relative Stabilität bei der Erzielung von Gewinnen.

Die Effizienz eines Handelssystems sollte an mehreren Finanzinstrumenten bewertet werden. Dies verbessert die Qualität der Simulation und das Ergebnis:a

  • Ein HS wird auf einer Vielzahl von Erscheinungsformen der Marktdynamik getestet;
  • Im Falle eines positiven Ergebnisses bei mehreren Instrumenten steigt der Gesamtgewinn auf der Einlage und befriedigt die Nachfrage des Anlegers nach dem Ertragswert.

Daher sollte die Optimierung eines HS auf die Auswahl solcher Einstellungen reduziert werden, die bei Tests mit mehreren Finanzinstrumenten einen Gewinn ausweisen.

Risiken verbunden mit der Überschreitung einer Verlustbegrenzung pro Einlage

Schon vor dem Handel ist es notwendig, das geldwertige Risiko einer Position zu begrenzen. Dabei kann es sich um einen festen und absoluten (in Geldwerten) oder relativen (in % der anfänglichen Einlage) Wert handeln. Nach dem Erreichen des Ziels stoppt der Handel.

Wenn Sie einen erfahreneren Händler mit der Verwaltung Ihres Kontos betrauen, legen Sie das Risikolimit in der Vereinbarung fest.

Wenn Sie selbständig handeln, müssen Sie den Code sowohl dem Eröffnungsalgorithmus (Deaktivieren eines Eintrags bei Überschreitung des Risikolimits) als auch dem Algorithmus zum Schließen hinzufügen (wir haben dies bereits früher im Abschnitt "Risiken im Zusammenhang mit der Unsicherheit der Preisbewegungsamplitude nach einem Markteintritt" besprochen). Die doppelte Kontrolle der Einlage ist notwendig, weil zunächst das Risikolimit für die Einlage erreicht wird, wenn eine offene Position besteht (dies ist im Exit-Algorithmus des Marktes festgelegt). Danach müssen wir die Nachbuchungen deaktivieren, da das Risiko-Limit für die Einlage bereits erreicht ist (dies wird im Modul vor dem Markteintrittsalgorithmus festgelegt).

Schauen wir uns den Code-Abschnitt an:

 //VERWALTUNG DER FINZ. PARAMETER FÜR DIE BEGRENZUNG DES GESAMTEN RISIKOS FÜR DIE EINLAGE--------------------------------
  
  if(kol < 1) //keine Aufträge
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//wenn das Risiko für die gesamte Einlage bereits überschritten wurde
    {
     Print("Entry disabled-risk limit reached earlier=",Percent_risk_depo, " % for the entire deposit=", Depo_first);
     Alert("Entry disabled-risk limit reached earlier=",Percent_risk_depo, " % for the entire deposit=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //Wenn die Margin die Eröffnung neuer Positionen nicht erlaubt, nicht genügend Geld
    {
     Print("Insufficient margin funds. Free account margin = ",AccountFreeMargin());
     Alert("Insufficient margin funds. Free account margin = ",AccountFreeMargin());
     return; //...dann zurück
    } 
  }     
        
 //-------------- 

Abb. 9. Modul vor dem Eröffnungsalgorithmus: Reduzierung der Risiken bei Überschreitung eines Verlustlimits für eine Einlage

Der erste Block verwaltet den Status der Kundeneinlage (Variable AccountBalance()). Anpassbare Variablen:

  • Depo_first — Ersteinlage in Geldwerten;
  • Percent_risk_depo - Verlustlimit pro Einzahlung (in % des Ausgangswertes).

Der Algorithmus wird ausgelöst, wenn die Verluste auf der Einlage den in der Variable Percent_risk_depo eingestellten Wert erreichen. Gleichzeitig wird der Markteintritt unterbunden und wir beenden das Programm.

Der zweite Block verwaltet die Margin des Kontos, die ein Markteintritt erlaubt. Der Algorithmus wird ausgelöst, wenn das Marginvolumen unter einer bestimmten Anzahl von Lots liegt. Der Markteintritt ist deaktiviert, und wir beenden das Programm.

Risiken, die mit negativen Veränderungen der Handelsbedingungen verbunden sind

Diese können sein: Qualität der von einem Broker bereitgestellten Kurse; Spreadausweitung bei Eröffnung und Schließung einer Position; Preisabweichung bei der Ausführung von Aufträgen; Verzögerungen bei der Ausführung von Aufträgen.

All dies kann die Ergebnisse des Handels stark beeinflussen (bis hin zum Totalverlust der Einlage), so dass Sie die relevanten Parameter überwachen müssen. Insbesondere müssen Sie automatisch die Werte von Preis, Spread, Triggerzeit der Algorithmen zum Eröffnen und Schließen, und dann vergleichen Sie sie mit den Werten für eine tatsächliche Eröffnung und Schließung der Position.

Sie können ein solches Modul in Ihrem Handelssystem selbst entwickeln.


Risiken bestimmt durch die Qualität der Verbindung zum Handelsserver des Brokers

Die Qualität der Verbindung zu einem Handelsserver hängt von zwei Faktoren ab:

  • Handelsserver-Status auf der Brokerseite;
  • Internetverbindung auf der Kundenseite.

Der zweite Faktor kann durch die Platzierung des Client-Terminals auf einem externen Server eliminiert werden. Der erste Faktor wird programmatisch verifiziert, indem dem HS-Algorithmus ein Code hinzugefügt wird.

Schauen wir uns den Code-Abschnitt an:

 if(IsConnected() == false) //Verbindungsprüfung des Terminal mit dem Server des Brokers
    {
     Print("Entry disabled-broker's server offline"); 
     Alert("Entry disabled-broker's server offline");
     return;
    } 

Abb. 10. Das Modul zur Risikoreduzierung in Bezug auf die Qualität der Verbindung mit dem Handelsserver eines Brokers.

Abb. 10 zeigt das Codefragment, mit dem die Verbindung zum Server des Brokers überwacht werden kann. Es muss vor dem Eröffnungsalgorithmus in das EA eingebaut werden. Wenn diese Bedingungen eintreten, werden die Öffnungspositionen gesperrt.

Risiken verbunden mit der Erlaubnis zum automatisierten Handel auf Seiten des Brokers und des Klienten

Manchmal sendet ein HS einen Auftrag an das Client-Terminal, aber er wird nicht ausgeführt. Die HS selbst darf jedoch den Handel nicht einschränken. Mögliche Gründe:

  • Der automatisierte Handel ist in den Client-Terminal-Einstellungen auf der Client-Seite deaktiviert;
  • Der Handel auf dem Girokonto wird von einem Broker deaktiviert.

Um diese Risiken zu eliminieren, ist es notwendig zu kontrollieren, ob der automatische Handel im Programm des Handelssystems erlaubt ist.

Schauen wir uns den Code-Abschnitt an:

 if(IsTradeAllowed() == false) //Prüfen der Handelsfähigkeit eines EAs (Broker, Erlaubnis)
    {
     
     Print("Entry disabled-broker's trading flow busy and/or the robot has no permission to trade :", IsTradeAllowed()); 
     Alert("Entry disabled-broker's trading flow busy and/or the robot has no permission to trade :", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //Prüfen der Kontoeigenschaften
    {
     Print("Automated trading disabled for the account :", AccountInfoInteger(ACCOUNT_LOGIN), "on trade server side"); 
     Alert("Automated trading disabled for the account :", AccountInfoInteger(ACCOUNT_LOGIN), "on trade server side"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //Prüfen, ob der Start von EA auf dem Terminal erlaubt ist
    {
     
     Print("Entry disabled- robot's trading permission disabled in the terminal :", IsExpertEnabled()); 
     Alert("Entry disabled- robot's trading permission disabled in the terminal :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //Prüfen auf Programm-Abbruch
    {
     Print("Entry disabled-command to complete mql4 program execution triggered"); 
     Alert("Entry disabled-command to complete mql4 program execution triggered");
     return;
    } 

Abb. 11. Modul zur Reduzierung der Risiken, die mit der Erlaubnis zum automatisierten Handel auf der Broker- und Kundenseite verbunden sind.

Das obige Codefragment steuert den Status der Berechtigungen für den automatisierten Handel sowohl auf der Broker- als auch auf der Händlerseite. Wenn Sie eine dieser Bedingungen erfüllen, ist der Markteintritt gesperrt.

Risiken aus einer sich verändernden Finanzmarktgesetzgebung

Dies sind die Regeln der Beziehungen in der Finanzmarktbranche, die sich direkt oder indirekt auf die Risiken des Kunden auswirken. Verschiedene Länder entwickeln Gesetzgebungsakte, die die Beziehungen in den Aktien- und Finanzmärkten regeln. In Zukunft sollen viele Risiken, die mit verschiedenen Verstößen verbunden sind, abnehmen.

Ein einfacher EA mit Modulen, die die besprochenen Risiken reduzieren

Wir haben die mit der Marktdynamik verbundenen und nicht mit ihr verbundenen Risiken identifiziert und untersucht. Außerdem haben wir spezifische Lösungen definiert, um sie zu reduzieren.

Die Risiken werden reduziert, indem spezifische Module in das EA eingefügt werden (vor dem Eröffnungsalgorithmus sowie in den Algorithmen zum Eröffnen und Schließen). Jedes Modul verwaltet eine bestimmte Art von Risiko.

Die wichtigsten Analyseelemente sind die Kerzen unterschiedlicher Zeitrahmen. Die Dynamik wird sowohl innerhalb von Kerzen (Einzelstrukturanalyse) als auch zwischen ihnen (Strukturgruppenanalyse) analysiert.

Nachfolgend ist der Code eines einfachen EAs mit Lösungen zur Reduzierung einiger der oben beschriebenen Risiken aufgeführt. Bitte beachten Sie, dass ausschließlich gleitende Durchschnitte und keine anderen Indikatoren (unter Berücksichtigung der oben genannten Einschränkungen) verwendet werden.

Der EA-Code für 5-stellige Kurse (oder 3-stellige für USDJPY):

//+------------------------------------------------------------------+
//|                                                 Reduce_risks.mq4 |
//|                            Copyright 2017, Alexander Masterskikh |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright   "2017, Alexander Masterskikh"
#property link        "https://www.mql5.com/en/users/a.masterskikh"

input double TakeProfit     = 600;   //Take-Profit                                    
input double StopLoss       = 300;   //Stop-Loss                                 
input double Lots           = 1;     //Lots
input int Depo_first        = 10000; //Ersteinlage in Geldwert
input int Percent_risk_depo = 5;     //Maximal erlaubtes Risiko bezüglich der Einlage (in % der Ersteinlage)
input bool test             = false; //Test = true (Standardeinstellung false für Live-Handel)

//-------------------------------------------------------------------------------------------------

void OnTick(void)
  {
   //---Variablendefinition---
   int f,numb,kol;
   double sl_buy, tp_buy, sl_sell, tp_sell;
   double L_prev_m15, L_2p_m15, L_3p_m15; 
   double H_prev_m15, H_2p_m15, H_3p_m15;
   double O_cur_m15, O_prev_m15, O_2p_m15, C_prev_m15, C_2p_m15;
   double MA4_cur_m15, MA4_prev_m15, MA4_2p_m15, MA5_prev_m15, MA8_cur_m15, MA8_prev_m15, MA8_2p_m15;
   double MA8_cur, MA8_prev, MA8_2p, MA8_3p, MA5_cur, MA5_prev, MA5_2p, MA13_cur, MA13_prev, MA13_2p,  
       MA60_cur, MA60_prev, MA60_2p, MA24_cur_h1;
   double C_prev_h1, O_prev_h1, H_prev_h1, L_prev_h1, H_2p_h1, L_2p_h1;    
   datetime Time_cur, Time_cur_m15; 
   double shift_buy, shift_sell;
   double Max_pos, Min_pos;    
  //--------

   //VERWALTUNG TECHNISCHER PARAMETER (STATUS UND ERLAUBNIS) - BROKER- UND HÄNDLER-SEITIG ------------------------------------------
   
 if(test==false) //check: test or trade (test - true, trade - false)
 {//parameters that are not checked when testing on history data---
     
    if(IsConnected() == false) //Stausprüfung der Verbindung Terminal - Server
    {
     Print("Entry disabled-broker server offline"); 
     Alert("Entry disabled-broker server offline");
     return;
    } 
    
    
    if(IsTradeAllowed() == false) //Prüfen der Handelsfähigkeit eines EAs (Broker, Erlaubnis)
    {
     
     Print("Entry disabled-broker trade flow busy and/or EA trading permission disabled :", IsTradeAllowed()); 
     Alert("Entry disabled-broker trade flow busy and/or EA trading permission disabled :", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //Prüfen der Kontoeigenschaften
    {
     Print("Auto trading disabled for account :", AccountInfoInteger(ACCOUNT_LOGIN), "on trade server side"); 
     Alert("Auto trading disabled for account :", AccountInfoInteger(ACCOUNT_LOGIN), "on trade server side"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //Prüfen, ob der Start von EA auf dem Terminal erlaubt ist
    {
     
     Print("Entry disabled- robot's trading permission disabled in the terminal :", IsExpertEnabled()); 
     Alert("Entry disabled- robot's trading permission disabled in the terminal :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //Prüfen auf Programm-Abbruch
    {
     Print("Entry disabled-command to complete mql4 program execution triggered"); 
     Alert("Entry disabled-command to complete mql4 program execution triggered");
     return;
    } 
    
 } //Keine Prüfung der Parameter bei Tests mit hist. Daten
 
 
  //Prüfen, ob ausreichend Kurse im Terminal für das Symbol vorliegen---
      
     if(Bars<100)
     {
      Print("insufficient number of bars on the current chart");
      return; 
     }
     
  //Verwaltung starten des EAs auf dem benötigten Zeitrahmen----
  
    if(Period() != PERIOD_M1)
    {
     Print("EA placed incorrectly, place EA on tf :", PERIOD_M1);
     Alert("EA placed incorrectly, place EA on tf :", PERIOD_M1);
     return;
    }
 
  //Verwaltung, starten des EAs mit dem benötigten Finanzinstrument----
  
   if(Symbol() != "EURUSD" && Symbol() != "USDCHF" && Symbol() != "USDJPY") 
     {
     Print("EA placed incorrectly-invalid financial instrument"); 
     Alert("EA placed incorrectly-invalid financial instrument");
     return;
    } 
    
    //----------
    
    
  //VERWALTUNG DER FINZ. PARAMETER FÜR DIE BEGRENZUNG DES GESAMTEN RISIKOS FÜR DIE EINLAGE--------------------------------
  
  if(kol < 1) //keine Aufträge
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//wenn das Risiko für die gesamte Einlage bereits überschritten wurde
    {
     Print("Entry disabled-risk limit reached earlier=",Percent_risk_depo, " % for the entire deposit=", Depo_first);
     Alert("Entry disabled-risk limit reached earlier=",Percent_risk_depo, " % for the entire deposit=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //Wenn die Margin die Eröffnung neuer Positionen nicht erlaubt, nicht genügend Geld
    {
     Print("Insufficient margin funds. Free account margin = ",AccountFreeMargin());
     Alert("Insufficient margin funds. Free account margin = ",AccountFreeMargin());
     return; //...dann zurück
    } 
  }     
        
 //-------------- 
        
         
  //Variablenwerte:
 
    L_prev_m15 = iLow(NULL,PERIOD_M15,1);
    L_2p_m15 = iLow(NULL,PERIOD_M15,2);
    L_3p_m15 = iLow(NULL,PERIOD_M15,3);
    H_prev_m15 = iHigh(NULL,PERIOD_M15,1);
    H_2p_m15 = iHigh(NULL,PERIOD_M15,2);
    H_3p_m15 = iHigh(NULL,PERIOD_M15,3);
    
    O_cur_m15 = iOpen(NULL,PERIOD_M15,0);
    O_prev_m15 = iOpen(NULL,PERIOD_M15,1);
    O_2p_m15 = iOpen(NULL,PERIOD_M15,2);
    C_prev_m15 = iClose(NULL,PERIOD_M15,1);
    C_2p_m15 = iClose(NULL,PERIOD_M15,2);
    Time_cur_m15 = iTime(NULL,PERIOD_M15,0);
    
    C_prev_h1 = iClose(NULL,PERIOD_H1,1);
    O_prev_h1 = iOpen(NULL,PERIOD_H1,1);
    H_prev_h1 = iHigh(NULL,PERIOD_H1,1);
    L_prev_h1 = iLow(NULL,PERIOD_H1,1);
    H_2p_h1 = iHigh(NULL,PERIOD_H1,2);
    L_2p_h1 = iLow(NULL,PERIOD_H1,2);
    
    MA4_cur_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,0);
    MA4_prev_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,1);
    MA4_2p_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,2);
    MA5_prev_m15 = iMA(NULL,PERIOD_M15,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_cur_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,2);

    MA8_cur = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,2);
    MA8_3p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,3);
    MA5_cur = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,0);
    MA5_prev = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA5_2p = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,2);
    MA13_cur = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,0);
    MA13_prev = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,1);
    MA13_2p = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,2);  
    MA60_cur = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,0);
    MA60_prev = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,1);
    MA60_2p = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,2);
    MA24_cur_h1 = iMA(NULL,PERIOD_H1,24,0,MODE_SMA,PRICE_TYPICAL,0);
    
    kol = OrdersTotal();
    Time_cur = TimeCurrent();
   
 if(kol < 1) //weiter, keine offenen Aufträge
     {
      
 //---ERÖFFNUNGSALGORITHMUS - KAUFEN-----------------------------------------------------------------------------------------
      
  if( 
   //----REDUZIEREN DES RISIKOS VERBUNDEN MIT EINER HOHEN VOLATILITÄT BEI MARKTEINTRITT ----
  
     //Simulieren der Abwesenheit einer hohen Volatilität in der jüngsten Vergangenheit:
     ( High[1] - Low[1]) <= 200*Point &&                       //Grenze der Amplitude im kleineren Zeitrahmen (М1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //Grenze der Amplitude im höheren Zeitrahmen (М15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //Grenze der Amplitude des Kanals des höheren Zeitrahmens (М15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //Aktivitätsgrenze der vorherigen Kerze im Verhältnis zur vor-vorherigen
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //gleich
  
    
   //----REDUZIEREN DES RISIKOS VERBUNDEN MIT WIDERSTANDSEBENEN BEI MARKTEINTRITT-----
  
     //Simulieren eines Ausbruchs des aktuellen Preises aus den lokalen Widerständen:
       Bid > High[1] &&           // М1 
       Bid > H_prev_m15 &&        //on М15 
           
    
   //---REDUZIEREN DES RISIKOS VERBUNDEN MIT EINEM ÜBERKAUFTEN BEREICH BEI MARKTEINTRITT-----
  
    //Simulieren eines Wellenbeginns zur Reduzierung der Wahrscheinlichkeit im überkauften Bereich zu sein:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //Wellenbeginn - nicht mehr als drei Bars (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //gleich
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //Wellenbeginn - auf der vorherigen Bar im höheren Zeitrahmen (М15)
      
  
  //---REDUZIEREN DES RISIKOS VERBUNDEN MIT DER ABWESENHEIT EINES TRENDS BEI MARKTEINTRITT-------
  
      //Simulieren der Kerzenrichtung im kleineren Zeitrahmen:
      Close[2] > Open[2] &&      //vor-vorherige Aufwärtskerze (М1)
      Close[1] > Open[1] &&      //vorherige Aufwärtskerze (М1)
      
      //Simulieren der Richtung der gleitenden Durchschnitte im höheren Zeitrahmen:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //aufwärts МАs: Verwende gleitende Durchschnitte mit einer Periodenlänge von 5 und 60 (М1)
      
      //Simulieren einer Hierarchie von gleitenden Durchschnitten im kleineren Zeitrahmen:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //eine "Hierarchie" von 3 МАs auf М1 (Fibo-Periodenlängen:5,8,13), ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des kleineren Zeitrahmens:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //aktueller Preis liegt über МА (5,8,13,60) auf М1, ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren der Kerzenrichtung im höheren Zeitrahmen:
      C_prev_m15 > O_prev_m15 &&       //vorherige Aufwärtskerze (М15)
      
      //Simulieren der MA-Richtung im höheren Zeitrahmen: 
      MA4_cur_m15 > MA4_2p_m15 &&     //Aufwärts-MAs mit Periodenlänge 4 (М15)
      
      //Simulieren der Hierarchie von gleitenden Durchschnitten im höheren Zeitrahmen: 
      MA4_prev_m15 > MA8_prev_m15 &&  //eine "Hierarchie" von 2 МАs auf М15 (Periodenlängen:4 und 8), ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des höheren Zeitrahmens:
      Bid > MA4_cur_m15 &&            //aktueller Preis liegt über МА4 (M15), ein indirektes Zeichen eines Aufwärtstrends 
      Bid > MA24_cur_h1 &&            //aktueller Preis überschreitet МА24 (МН1), Zeichen eines Aufwärtsbewegung
      
      //Simulieren eines Mikrotrends innerhalb der aktuellen Kerze im kleineren Zeitrahmen wie zum Einstiegspunkt:
      Bid > Open[0] &&               //Gegenwart eines Aufwärtsbewegung innerhalb der aktuellen Kerze (М1)
       
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im höheren Zeitrahmen:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne (vorherige Kerze М15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //Korrektur ist kleiner als 25% der Kerzenamplitude (vorherige Kerze М15)
      H_prev_m15 > H_2p_m15 &&                                       //Aufwärtstrend durch Widerstände (zwei Kerzen М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //Es gibt einen Docht (vorherige Kerze М15) im Verhältnis zum Körper der Kerze
      
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im kleineren Zeitrahmen: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne (vorherige Kerze М1)
     (High[1] - Low[1]) > 70*Point &&                                //Amplitude der vorherigen Kerze überschreitet den Schwellenwert eins (nicht total flach)
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //Korrektur ist kleiner als 20% der Kerzenamplitude (vorherige Kerze M1)
      High[1] > High[2] &&                                           //Aufwärtstrend wegen lokaler Widerstände (zwei Kerzen М1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //Docht (vorherige Kerze tfМ1) relativ zum Eröffnungspreis
      
        {
        //Wenn die Bedingungen für Kaufen erfüllt sind, erteile einen Kaufauftrag:
        sl_buy = NormalizeDouble((Bid-StopLoss*Point),Digits);
        tp_buy = NormalizeDouble((Ask+TakeProfit*Point),Digits);
        
         numb = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl_buy,tp_buy,"Reduce_risks",16384,0,Green); 
         
         if(numb > 0)

           {
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
            {
               Print("Buy entry : ",OrderOpenPrice());   
            }
           }
         else
            Print("Error when opening Buy order : ",GetLastError());
         return;
        }
        
 //--- Eröffnungsalgorithmus VERKAUF------------------------------------------------------------------------------------------------
    
  if( 
     //----REDUZIEREN DES RISIKOS VERBUNDEN MIT EINER HOHEN VOLATILITÄT BEI MARKTEINTRITT ----
  
     //Simulieren der Abwesenheit einer hohen Volatilität in der jüngsten Vergangenheit:
     ( High[1] - Low[1]) <= 200*Point &&                       //Grenze der Amplitude im kleineren Zeitrahmen (М1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //Grenze der Amplitude im höheren Zeitrahmen (М15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //Grenze der Amplitude des Kanals des höheren Zeitrahmens (М15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //Aktivitätsgrenze der vorherigen Kerze im Verhältnis zur vor-vorherigen
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //gleich
  
    
  //----REDUZIEREN DES RISIKOS VERBUNDEN MIT WIDERSTANDSEBENEN BEI MARKTEINTRITT-----
  
     //Simulieren eines Ausbruchs des aktuellen Preises aus den lokalen Widerständen:
       Bid < Low[1] &&           //на М1 
       Bid < L_prev_m15 &&       //на М15 
           
    
  //---REDUZIEREN DES RISIKOS VERBUNDEN MIT EINEM ÜBERVERKAUFTEN BEREICH BEI MARKTEINTRITT-----
  
    //Simulieren der Bindung an einen Wellenbeginn zur Reduzierung der Wahrscheinlichkeit in einem überverkauften Bereich zu kaufen:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //Wellenbeginn - nicht mehr als drei Bars (М1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //gleich
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //Wellenbeginn - auf der vorherigen Bar im höheren Zeitrahmen (М15)
      
  
  //---REDUZIEREN DES RISIKOS VERBUNDEN MIT DER ABWESENHEIT EINES TRENDS BEI MARKTEINTRITT-------
  
      //Simulieren der Kerzenrichtung im kleineren Zeitrahmen:
      Close[2] < Open[2] &&      //Abwärtskerze der vor-vorherigen Bar (М1)
      Close[1] < Open[1] &&      //vorherige Abwärtskerze (М1)
      
      //Simulieren der Richtung der gleitenden Durchschnitte im kleineren Zeitrahmen:
      MA5_cur < MA5_2p &&  MA60_cur < MA60_2p &&     //abwärts МАs: Verwende gleitende Durchschnitte mit einer Periodenlänge von 5 und 60 (М1)
      
      //Simulieren einer Hierarchie von gleitenden Durchschnitten im kleineren Zeitrahmen:
      MA5_cur < MA8_cur && MA8_cur < MA13_cur &&    //eine "Hierarchie" von 3 МАs auf М1 (Fibo-Periodenlängen:5,8,13), ein indirektes Zeichen eines Aufwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des kleineren Zeitrahmens:
      Bid < MA5_cur && Bid < MA8_cur && Bid < MA13_cur && Bid < MA60_cur && //aktueller Preis liegt über МА (5,8,13,60) auf М1, ein indirektes Zeichen eines Abwärtstrends
      
      //Simulieren der Kerzenrichtung im höheren Zeitrahmen:
      C_prev_m15 < O_prev_m15 &&      //vorherige Abwärtskerze (М15)
      
      //Simulieren der Kerzenrichtung im höheren Zeitrahmen: 
      MA4_cur_m15 < MA4_2p_m15 &&     //vorherige Abwärtskerze 4 (М15)
      
      //Simulieren der MA-Richtung im höheren Zeitrahmen: 
      MA4_prev_m15 < MA8_prev_m15 &&  //eine "Hierarchie" von 2 МАs auf М1 (Periodenlängen:4 und 8), ein indirektes Zeichen eines Abwärtstrends
      
      //Simulieren des Verhältnisses des aktuellen Preises zum gleitenden Durchschnitt des höheren Zeitrahmens:
      Bid < MA4_cur_m15 &&            //aktueller Preis liegt unter МА4 (M15), ein indirektes Zeichen eines Abwärtstrends 
      Bid < MA24_cur_h1 &&            //aktueller Preis liegt unter МА24 (MH1), ein indirektes Zeichen eines Abwärtstrends 
      
      //Simulieren eines Mikrotrends innerhalb der aktuellen Kerze im kleineren Zeitrahmen wie zum Einstiegspunkt:
      Bid < Open[0] &&                //Gegenwart eines Aufwärtsbewegung innerhalb der aktuellen Kerze (М1)
       
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im höheren Zeitrahmen:
     (O_prev_m15 - C_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne(vorherige Kerze М15)
     (C_prev_m15 - L_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //Korrektur ist kleiner als 25% der Kerzenamplitude (vorherige Kerze М15)
      L_prev_m15 < L_2p_m15 &&                                       //Aufwärtstrend durch Widerstände (zwei Kerzen М15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //Es gibt einen Docht (vorherige Kerze М15) im Verhältnis zum Körper der Kerze
      
     //Simulieren von ausreichender Aktivität des vorherigen Prozesses im kleineren Zeitrahmen: 
     (Open[1] - Close[1]) > (0.5*(High[1] - Low[1])) &&              //Anteil des Kerzenkörpers der überschreitet 50% der Kerzenspanne (vorherige Kerze М1)
     (High[1] - Low[1]) > 70*Point &&                                //Amplitude der vorherigen Kerze überschreitet den Schwellenwert eins (nicht total flach)
     (Close[2] - Low[2]) < (0.25*(High[2] - Low[2])) &&              //Korrektur ist kleiner als 20% der Kerzenamplitude (vorherige Kerze M1)
      Low[1] < Low[2] &&                                             //Abwärtstrend durch Widerstände (zwei Kerzen М15)
      Open[1] < High[1] && Open[1] > Low[1] )                        //Docht (vorherige Kerze tfМ1) relativ zum Eröffnungspreis
               
        {
         //Wenn die Bedingungen für Verkaufen erfüllt sind, erteile einen Verkaufsauftrag:
         
         sl_sell = NormalizeDouble((Ask+StopLoss*Point),Digits);
         tp_sell = NormalizeDouble((Bid-TakeProfit*Point),Digits);
         
         numb = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl_sell,tp_sell,"Reduce_risks",16384,0,Red);
          
         if(numb > 0)
           {
            
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Sell entry : ",OrderOpenPrice());
              }
           }
         else
            Print("Error when opening Sell order : ",GetLastError());
        }
      //--- Der Eröffnungsalgorithmus (Kauf, Verkauf) endet hier
      return;
     }
//--- Prüfen von offenen Positionen und des Symbols des Finanzinstrumentes Check zum Schließen der Position:  

   for(f=0; f < kol; f++)
     {
      if(!OrderSelect(f,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   //Prüfen der Auftragsart 
         OrderSymbol()==Symbol())  //Symbolprüfung 
        {
         
         if(OrderType()==OP_BUY) //Ist es eine Kaufposition, gehe zum Schließen der Kaufposition:
           {
            
   //------ALGORITHMUS ZUM SCHLIESSEN EINER KAUFPOSITION---------------------------------------------------------------------------------------------- 
          
         
     //Das Modul zum Suchen des Hochs einer Position;--------------
         
          //zuerst definieren Sie den Abstand von der aktuellen Position innerhalb der geöffneten Position bis zum Markteintritt Punkt:
             
             shift_buy = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //wenn die aktuelle Zeit ist weiter als der Einstiegspunkt...
            { shift_buy = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }    //definiert den Abstand in tfM1 Bars bis zum Einstiegspunkt
            
          //nun definieren Sie den maximale Preis, nachdem Markteintritt:
          
            Max_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_buy > 0) 
            { Max_pos = NormalizeDouble((High[iHighest(NULL,PERIOD_M1, MODE_HIGH ,(shift_buy + 1), 0)]), Digits);}
           
          //Ende der Suche nach dem maximalen Preis in der offenen Position---  
          
          //Rückkehr um die Position zu schließen (ODER-Optionen): 
       
            if( 
            //REDUZIEREN DES RISIKOS VERBUNDEN MIT EINER PREISKORREKTUR NACH DEM MARKTEINTRITT----------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //Eröffnungsbedingung (in jeder Zone) im Falle einer Preiskorrektur (Referenzpunkt - Eröffnungspreis der aktuellen Kerze M1)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //Exit-Bedingungen (in jeder Zone) im Falle einer Preiskorrektur (Referenzpunkt - Eröffnungspreis der aktuellen Kerze M15)</s11>
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //Exit-Bedingungen (in jeder Zone) im Falle einer Preiskorrektur (Referenzpunkt - Preisspanne vorherige Kerze M1)
                     ||
                     
            //REDUZIEREN DES RISIKOS VERBUNDEN MIT UNSICHEREN PREISSPANNEN NACH MARKTEINTRITT-- 
             
              //Verwalten fixer Profit (pro Position):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //Exit-Bedingungen einer Position im Gewinn (Take-Profit)
                     ||
                     
             //Verwalten der maximal zulässigen Abweichung 
             //vom aktuellen Hoch nach dem Markteintritt:    
             (shift_buy >= 1 &&                                                                          //shift um nicht mehr als 1 Kerze von Einstiegspunkt
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //hier ist das Maximum nach dem Einstiegspunkt
             Max_pos > OrderOpenPrice() &&                                                               //aktuelles Maximum ist im Gewinn
             Bid < Max_pos &&                                                                            //Es gibt eine Preisumkehr
             (Max_pos - Bid) >= 200*Point)                                                               //umgekehrte Abweichung vom aktuellen Maximum zum Markteintritt
                    ||
                      
             //Verwaltung vordefinierter Risikolimits (pro Position):     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //Ausstiegsbedingungen im Verlust (Stop-Loss)
                    ||
                    
             //Verwaltung einer vordefinierten Risikobegrenzung für die gesamte Einlage.
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //wenn das Risikolimit für die gesamte Einlage bereits überschritten wurde
   
          
              {
               
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))     //Wenn die Position geschlossen wrden soll, schließe die Kaufposition
                  Print("Error closing Buy position ",GetLastError());    //sonst drucke die Fehlermeldung
               return;
              }
        
           }
           else //otherwise, move to closing the Sell position:
           {
            
           //------ALGORITHMUS ZUM SCHLIESSEN EINER VERKAUFSPOSITION------------------------------------------------------------------
           
           
            //Das Modul zum Suchen des Hochs einer Position;--------------
         
          //zuerst definieren Sie den Abstand von der aktuellen Position innerhalb der geöffneten Position bis zum Markteintritt Punkt:
             
             shift_sell = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //wenn die aktuelle Zeit ist weiter als der Einstiegspunkt...
            { shift_sell = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }   //definiert den Abstand in M1 Bars bis zum Einstiegspunkt
            
          //nun definieren Sie den minimalen Preis nach dem Markteintritt:
          
            Min_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_sell > 0)  
           { Min_pos = NormalizeDouble( (Low[iLowest(NULL,PERIOD_M1, MODE_LOW ,(shift_sell + 1), 0)]), Digits); }
           
          //Ende der Suche nach dem maximalen Preis in der offenen Position---  
          
          
          //Rückkehr um die Verkaufsposition zu schließen (ODER-Optionen): 
           
           if( 
            //REDUZIEREN DES RISIKOS VERBUNDEN MIT PREISKORREKTUR NACH DEM MARKTEINTRITT-
            
              (Bid > Open[0] && (Bid - Open[0]) >= 100*Point && (Time_cur - Time[0]) <= 20)          //Ausstiegsbedingungen (in jedem Bereich) während des Preiseinbruchs (Referenzpunkt - aktuelle Kerze М1, Eröffnungspreis)
                     ||
              (Bid > O_cur_m15 && (Bid - O_cur_m15) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //Ausstiegsbedingungen (in jedem Bereich) während des Preiseinbruchs (Referenzpunkt - aktuelle Kerze М15, Eröffnungspreis)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] > Open[1] && 
              (Close[1] - Open[1]) >= 200*Point)                                                      //Ausstiegsbedingungen (in jedem Bereich) während des Preiseinbruchs (Referenzpunkt - vorherige Kerze М1, Kerzenamplitude)
                     ||
                       
           //REDUZIEREN DES RISIKOS VERBUNDEN MIT UNSICHEREN PREISSPANNEN NACH MARKTEINTRITT-- 
             
              //Verwalten fixer Profit (pro Position):
              (Bid < OrderOpenPrice() && (OrderOpenPrice()- Bid) >= 100*Point)                         //Exit-Bedingungen einer Position im Gewinn (Take-Profit)
                     ||
                     
             //Verwalten der maximal zulässigen Abweichung 
             //vom aktuellen Tief nach dem Markteintritt:      
             (shift_sell >= 1 &&                                                                         //shift um nicht mehr als 1 Kerze von Einstiegspunkt
             Time_cur > OrderOpenTime() && Min_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //there is the current minimum after entry
             Min_pos < OrderOpenPrice() &&                                                               //aktuelles Minimum ist im Gewinn
             Bid > Min_pos &&                                                                            //Es gibt eine Preisumkehr
             (Bid - Min_pos) >= 200*Point)                                                               //Abweichung vom aktuellen Maximum betreffs Schließen der Position
                    || 
                      
             //Verwaltung vordefinierter Risikolimits (pro Position):     
             (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 200*Point)                            //Ausstiegsbedingungen im Verlust (Stop-Loss)
                    ||
                    
             //Verwaltung einer vordefinierten Risikobegrenzung für die gesamte Einlage.
             (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )   //wenn das Risikolimit für die gesamte Einlage bereits überschritten wurde 
   
              {
        
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))     //Wenn die Position geschlossen wrden soll, schließe die Kaufposition
                  Print("Error closing Sell position ",GetLastError());   //sonst drucke die Fehlermeldung
               return;
              }  
          
           }
        }
     }
//---
  }
//-----------------------------------------------------------------------------------------------------------

Abb. 12. Der Beispiel-EA unter Berücksichtigung einiger der genannten Risiken

Die Code-Struktur des EA berücksichtigt einige der oben beschriebenen Risiken. Er enthält auch entsprechende Module, um sie zu reduzieren.

Der EA wurde auf М1 gestartet und auf historische Daten für die folgenden Symbole getestet: EURUSD, USDCHF und USDJPY.

EURUSD Testergebnisse:

Test_EURUSD

Abb. 13. EURUSD Testergebnisse

Positive Ergebnisse ergaben sich bei einem Test über eineinhalb Jahre.

USDCHF Testergebnisse:

Test_USDCHF

Abb. 14. USDCHF Testergebnisse

Positive Ergebnisse ergaben sich bei einem Test über eineinhalb Jahre. Allerdings ist die Zahl der Positionen ist nicht ausreichend.

USDJPY Testergebnisse


Test_USDJPY

Abb. 15. USDJPY Testergebnisse

Positive Ergebnisse ergaben sich bei einem Test über eineinhalb Jahre.

Bewerten wir nun die Bedeutung der einzelnen Risikoarten. Dazu verwenden wir das folgende Verfahren:

  • Der Nettogewinn, der durch den EA erzielt wird, wird als Hauptparameter betrachtet;
  • Die Bedeutung einer bestimmten Risikoart definieren wir, indem das entsprechende Modul im EA-Algorithmus (separat) deaktiviert wird;
  • Je schlechter das Finanzergebnis, desto wichtiger ist diese Art von Risiko.

Verwenden Sie die Testergebnisse von EURUSD als Ebene, auf der die Auswirkungen der einzelnen Module definiert sind. Schauen wir uns folgende Grafik an:

Signifikante Risikotypen

Abb. 16. Bedeutung der Risikoarten am Beispiel des zuvor beschriebenen EAs

Abb. 16, Notation:

  • NetProfit ist die Achse, auf der der Nettogewinn des EA angezeigt wird;
  • А - Reingewinn "in montierter Form" (alle Risikominderungsmodule sind enthalten);
  • 1 - das Modul zur Reduzierung von Risiken im Zusammenhang mit hoher Volatilität zum Zeitpunkt des Markteintritts ist deaktiviert;
  • 2 - das Modul zur Verringerung der Risiken, die mit dem Vorhandensein von Resistenzniveaus zum Zeitpunkt des Markteintritts verbunden sind, ist deaktiviert;
  • 3 - Das Modul zur Verringerung der Risiken, die mit dem Fall in den überkauften/überkauften Bereich zum Zeitpunkt des Markteintritts verbunden sind, ist deaktiviert;
  • 4 - das Modul zur Verringerung der Risiken, die mit dem Fehlen eines klar definierten Trends zum Zeitpunkt des Markteintritts verbunden sind, wird deaktiviert (der Block, der die ausreichende Aktivität des vorherigen Prozesses simuliert);
  • 5 - das Modul zur Verringerung der Risiken, die mit dem Fehlen eines klar definierten Trends zum Zeitpunkt des Markteintritts verbunden sind, ist deaktiviert (der Block, der die Richtung von Kerzen und gleitenden Durchschnitten simuliert).

Die Abbildung zeigt, dass der maximale Verlust dem Punkt 4 entspricht. Das Ergebnis ist hier um ein Vielfaches schlechter als an anderen Stellen des Diagramms. Die wichtigste HS-Komponente ist daher das Modul, in dem die Prozessaktivität festgelegt ist.

Das bedeutet, dass das bedeutendste Risiko (zumindest für den gegebenen EA) dasjenige ist, das mit dem Fehlen eines klar definierten Trends (unzureichende Prozessaktivität) verbunden ist.

Schlussfolgerung

Wir haben die wichtigsten Risikoarten klassifiziert - sowohl bezogen als auch unabhängig von der Marktdynamik. Wir haben auch die Möglichkeiten beschrieben, sie zu reduzieren und die Algorithmen für die Implementierung einiger von ihnen gezeigt. Als nächstes haben wir den Code des einfachen EA untersucht, der einige dieser Algorithmen enthält. Außerdem haben wir den EA an drei Finanzinstrumenten getestet — EURUSD, USDCHF und USDJPY. Bitte beachten Sie, dass die Ergebnisse ohne EA-Optimierung erzielt wurden. Die in den Modulen angewandten Schwellenpreisniveaus habe ich aufgrund meiner persönlichen Erfahrungen festgelegt.

Außerdem wurde ein Satz gleitender Durchschnitte zur Verwendung angeboten, zusammen mit der Methode ihrer Einbeziehung in das Set auf der Grundlage von Kalenderzyklen. Diese Methode habe ich bei der Entwicklung der Risikominderungsmodule und des EA als Ganzes angewandt. Die Methode, die es den Nutzern erlaubt, die Wahrscheinlichkeit, in einen überkauften/überkauften Bereich zu fallen, etwas zu verringern (basierend auf der Simulation der wellenförmigen Bewegung), wurde ebenfalls angeboten.

Das positive Ergebnis wurde bei drei Finanzinstrumenten erzielt, was im Allgemeinen die Richtigkeit der beschriebenen Ansätze bestätigt, und zwar sowohl bei der Klassifizierung der Risiken und der Art und Weise, wie sie reduziert werden können, als auch bei der Festlegung der Struktur eines Handelssystems, das diese Risiken berücksichtigt.

Die durchgeführte Analyse hat gezeigt, dass die trendfolgenden Handelssysteme ohne Prozessaktivitätssimulation das höchste Risiko aufweisen. Dieser Faktor spiegelt sich stärker als der Rest im Finanzergebnis wider.

Der Vorteil des obigen EA (und des beschriebenen Ansatzes zur HS-Konstruktion) ist das Fehlen traditioneller Indikatoren im Input- und Output-Algorithmus. Es werden nur die Kerzenanalyse und gleitende Durchschnitte (mit Einschränkungen) angewendet. Dadurch wird der Optimierungsaufwand deutlich reduziert. Dabei reduziert es sich auf die Auswahl von Schwellenwerten, bei denen die entsprechenden Module ausgelöst werden, sowie auf die Auswahl der MA-Perioden aus der verfügbaren Liste der Berechnungsperioden (siehe Abschnitt "Risiken verbunden mit einer falschen Auswahl des Berechnungszeitraums der Indikatoren").

Der Nachteil des beschriebenen Ansatzes ist die "Überfilterung" des Eintragsalgorithmus, da es zu viele Risiken (und die entsprechenden Eintragsfilter) geben kann. Das Ergebnis ist eine begrenzte Anzahl von Positionseröffnungen. Teilweise wird dies jedoch durch die Möglichkeit gemildert, gleichzeitig mit mehreren Finanzinstrumenten zu handeln (nach vorheriger Prüfung).

Das Ziel dieser Arbeit war es, ein einfaches EA zur Reduzierung der Hauptrisiken zu erstellen, wobei der Algorithmus, der von unerfahrenen Händlern leicht zu verstehen ist, verwendet wird. Natürlich können wir die Effizienz des EA deutlich verbessern, indem wir den Algorithmus zur Analyse fraktaler Ebenen einbeziehen. Dies beinhaltet jedoch die Suche nach Fraktalen (auch in einer Schleife, was den Code erheblich erschweren würde). Ich glaube, dass das Wichtigste für unerfahrene Analysten und Händler ist, die Struktur eines Handelssystems (in Bezug auf die Parameter der Marktdynamik) zu erfassen, bevor sie ihre Programmierkenntnisse weiter verbessern.

Am Beispiel dieses EAs können Sie Experimente durchführen, indem Sie bestimmte Module deaktivieren oder ihre Menge ändern, je nach Ihren logischen Entscheidungen.

Hinweis! Dieses EA ist eine vereinfachte Demoversion, die nicht für den realen Handel gedacht ist.

Die beschriebenen Ansätze zur Reduzierung von Marktrisiken können bei der Entwicklung eines eigenen Handelssystems hilfreich sein.

Die MQL5-Version des EA aus diesem Artikel ist hier verfügbar - Reduce_risks.

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

Beigefügte Dateien |
Reduce_risks.mq4 (60.14 KB)
test_EURUSD.png (147.15 KB)
test_USDCHF.png (148.42 KB)
test_USDJPY.png (143.03 KB)
Muster von Ausbrüchen aus einem Kanal Muster von Ausbrüchen aus einem Kanal
Kursverläufe bilden Preiskanäle, die auf dem Chart des Finanzsymbols beobachtet werden können. Der Ausbruch aus einem aktuellen Kanal ist ein starkes Signal einer Trendwende. In diesem Artikel schlage ich eine Möglichkeit vor, den Prozess der Suche nach solchen Signalen zu automatisieren und zu sehen, ob die Muster eines Kanalausbruchs für die Erstellung einer Handelsstrategie verwendet werden kann.
Risikobewertung durch die Abfolge von Positionen von Finanzanlagen. Fortsetzung Risikobewertung durch die Abfolge von Positionen von Finanzanlagen. Fortsetzung
Der Artikel entwickelt die im vorhergehenden Teil vorgeschlagenen Ideen und führt sie weiter aus. Er beschreibt die Probleme der Ertragsverteilung, der grafischen Darstellung und untersucht statistische Gesetzmäßigkeiten.
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.
Die Momentum-Pinball Handelsstrategie Die Momentum-Pinball Handelsstrategie
In diesem Artikel setzen wir die Programmierung der Handelsstrategien fort, die im Buch "Street Smarts: High Probability Short-Term Trading Strategies" von L. Raschke und L. Connors beschrieben ist. Diesmal beschäftigen wir uns mit dem System Momentum-Pinball: Erstellen von zwei Indikatoren, dem Handelsroboter und dem Signalteil.