Nachthandel während der asiatischen Handelszeit: wie man im Plus bleibt

26 Dezember 2017, 15:22
Dmitriy Zabudskiy
0
786

Einleitung

Viele haben den Begriff "Nachthandel" gehört. Das Erste, was einem dabei einfällt, ist dass es in der Nacht gehandelt wird. Aber wegen des Zeitunterschieds beginnt die Nacht an verschiedenen Orten der Welt nicht zur gleichen Zeit. Die amerikanische und europäische Handelszeiten liegen jeweils in den Zeitzonen -4 und +1 zur Koordinierten Weltzeit (UTC).

Börsen der asiatisch-pazifischen Region, deren Zeitzone zur amerikanischen und europäischen versetzt ist, beginnen später zu arbeiten. Hier beginnt erst der Handel, während amerikanische Händler nach Hause zurückkehren, und ihre europäischen Kollegen ins Bett gehen. Das ist der Nachthandel für unsere Begriffe. Die Perioden der Handelszeiten kann man auf der Weltkarte wie folgt darstellen (von rechts nach links):


Abb.1. Handelssessionen auf der Weltkarte

Abb.1. Handelszeiten auf der Weltkarte


Daraus folgt, dass der Nachthandel meistens in einem Seitwärtsmarkt auf solchen Paaren wie EUR/USD, GBP/USD, USD/CHF, USD/CAD und EUR/GBP stattfindet, auf USD/JPY, GBP/JPY und AUD/JPY wird auch aktiv gehandelt. Natürlich gibt es keine Garantien, dass es von Tag zu Tag so bleibt. Auf verschiedenen Währungspaaren können in der Nacht verschiedene Strategien laufen.

Strategien des Nachthandels

Die meisten Strategien am Devisenmarkt kann man in Strategien basierend auf Trends und Seitwärtsbewegungen aufteilen. Trendstrategien ermitteln Hinweise auf eine Trendwende. Hauptsächlich geht es um den Ausbruch horizontaler Kanäle oder um einen Sprung vom "bullischen" oder "bärischen" Kanal. Die Seitwärtsstrategie ist auf einen Sprung im Bereich des horizontalen Kanals ausgerichtet. Sowohl Seitwärtsmarkt als auch Trendmarkt können verschiedene Volatilität aufweisen. Häufig bildet sie sich bei der Veröffentlichung wichtiger makroökonomischer Nachrichten. In der Praxis zeichnet sich hauptsächlich eine Trendbewegung durch Volatilität aus, aber es gibt Ausnahmen. Für die Analyse von Signalen eines Trends und einer Seitwärtsbewegung werden gleiche Indikatoren verwendet, sie werden aber unterschiedlich interpretiert.

Nehmen wir das beliebte Paar EUR/USD. Am häufigsten beginnt es während der asiatischen Handlessitzung, die Volatilität zu reduzieren und sich im Seitwärtsmarkt zu bewegen. Die Korrektur kann in dieser Phase so unbedeutend sein, dass man sie für eine horizontale Bewegung halten kann.


Abb.2. Seitwärtsbewegung, asiatische Session, EUR/USD

Abb.2. Seitwärtsbewegung, asiatische Handelszeit, EUR/USD

Auf der Abb. 2 ist die Bewegung des Paares EUR/USD auf H1 während der asiatischen Handelszeit dargestellt. Auf dem ersten Rechteck (links) ist eine kleine Schwankung innerhalb des Kanals zu sehen. Am Anfang der Handelssitzung sieht man eine Bewegung nach dem vorherigen Trend, anschließend eine kurze Korrektur (in der Mitte der Handelszeit) und eine abrupte Rückkehr am Ende. Auf dem zweiten Rechteck ist eine langsame Aufwärtsbewegung zu verzeichnen, die in diesem Fall die Bewegung des Tagesendes wiederholt. Auf dem dritten Rechteck hat sich die Situation ein wenig verändert. Im Vergleich zu den vorherigen Handelszeiten korrigiert die Anfangsbewegung in der Nacht den Tagestrend.

In allen beschriebenen Fällen während der asiatischen Handelssitzung sind kleine Bewegungen im Preisbereich zu sehen (eine Art "Unsicherheit" des Marktes). Eine solche Bewegung kann als Seitwärtsbewegung interpretiert werden.

Auf den gelben Rechtecken sind obere und untere Grenzen zu sehen. Sie begrenzen den Kanal, innerhalb welchen der Preis schwankt. Es ist einfach, den Kanal auf einem bereits gebildeten Chart zu zeichnen, aber in Echtzeit ist es unbekannt, wohin sich der Preis bewegt. Viele Fragen wirft auch die Volatilität auf. Was tun?

Ich schlage vor, dieses Problem mithilfe des Trendindikators Bollinger Bands zu lösen, der relativ gute Ergebnisse im Seitwärtsmarkt erzielt.

Abb.3. Bollinger Bands Indikator, EUR/USD M30

Abb.3. Bollinger Bands Indikator, EUR/USD M30

Auf der Abb. 3 ist der Chart des Währungspaares EUR/USD auf М30 dargestellt. Der Indikator Bollinger Bands ist auf den Chart gezogen, die Periode ist maximal klein (10), andere Einstellungen - standardmäßig. Hier sieht man, wie der Preis den so genannten "dynamischen Kanal" erreicht, der durch den Indikator erstellt wird. Die Signale dieses Kanals sind nicht ganz richtig. Auf dem ersten Rechteck zum Beispiel bewegt sich der Preis nach unten, und der Kanal wiederholt diese Bewegung. Dabei springt der Preis nicht von der unteren Grenze des Kanals, aber am Ende der asiatischen Handelszeit ändert sich die Situation. Der Markt beginnt von den Begrenzern der Kanäle zu springen. Auf dem zweiten Rechteck sind die Aktionen des Indikators erst am Ende zu sehen. Die Situation auf dem dritten Rechteck ist gleich der Situation auf dem ersten.

Daraus folgt, dass genaue Signale des Indikators während aller drei Handelszeiten am Ende des Handels gebildet werden. Mit anderen Worten ist eine Gesetzmäßigkeit festzustellen, basierend auf welcher man eine Strategie erstellen kann.

Nun wenden wir uns einer anderen Strategie zu, die auf einer starken Volatilität basiert. Für die asiatische Handelszeit sind das die Paare mit dem japanischen Yen. Die zu betrachtende Strategie ist ausführlich im Internet beschrieben. Die Idee besteht darin, dass man zu einem besonders volatilen Zeitpunkt in den Markt einsteigt, wenn eine starke Bewegung in irgendeine Richtung möglich ist. Zwei Pending Orders werden gleichzeitig in entgegengesetzte Richtungen mit dem gleichen Abstand und gleichen Parametern oberhalb des aktuellen Preises — für den Kauf, unterhalb — für den Verkauf platziert. Die Zeit des Platzierens dieser Orders befindet sich in der Regel in der zweiten Hälfte der asiatischen Handelssitzung (Ausnahmen möglich).

Auf der Abbildung 4 ist ein Chart von USD/JPY auf H1 dargestellt:


Abb.4. Asiatische Session auf USD/JPY H1

Abb.4. Asiatische Handelszeit auf USD/JPY H1

Gehen wir auf die Abschnitte der asiatischen Handelszeit ausführlicher ein:


Abb.5. Abschnitte der asiatischen Session, Währungspaar USD/JPY H1

Abb.5. Abschnitte der asiatischen Handelszeit, Währungspaar USD/JPY H1


Auf der Abb. 5 sind Einstiegsmöglichkeiten mit roten Labels markiert. Sie sind an den Open-Kurs der Kerze gesetzt. Das sind die Zeitpunkte, zu welchen die Strategie vorschlägt, Pending Orders zu platzieren.

Nun betrachten wir jeden Abschnitt einzeln. Auf allen vier Abschnitten ist die Zeit des Eröffnens auf 8.00 Uhr Moskauer Zeit (5.00 UTC) gesetzt.

  1. Im linken oberen Abschnitt beginnt die Eröffnung der Kerze bei 113.521. Tief 113.341, Hoch 113.553. Wir erhalten 32 Punkte vom Eröffnungspreis nach oben und 180 Punkte nach unten.
  2. Im rechten oberen Abschnitt beginnt die Eröffnung der Kerze bei 114.152. Tief 114.109, Hoch (bereits in der nächsten Stunde) 114.308. Wir erhalten 156 Punkte vom Eröffnungspreis nach oben und 43 Punkte nach unten. 
  3. Der linke untere Abschnitt wird bei 113.601 eröffnet. Tief 113.587, Hoch (drei Stunden später) 113.747. Insgesamt 146 Punkte vom Eröffnungspreis nach oben und 14 nach unten.
  4. Der letzte, untere rechte Abschnitt: Open 113.192, Tief 112.957, Hoch 113.193. Ein Punkt nach oben, 235 Punkte nach unten.

Stellen wir die Ergebnisse als Tabelle dar:

Tabelle 1

Nr. des Abschnitts Open Hoch Tief Maximale Punkte Minimale Punkte
1 113.521 113.553 113.341 180 32
2 114.152 114.308 114.109 156 43
3 113.601 113.747 113.587 146 14
4 113.192 113.193 112.957 235 1
Total --- --- --- Minimum 146 Maximum 43

Wie aus der Tabelle 1 hervorgeht, betrug das Minimum an maximalen Bewegungen in eine Richtungen während der vier Sitzungen 146 Punkte, und das Maximum an minimalen Bewegungen — 43 Punkte. Runden wir das Maximum auf 140 Punkte ab und das Minimum auf 45 Punkte auf. 

Für alle vier Situationen platzieren wir je zwei gegenläufige Orders=50 Punkte. Stoploss setzen wir bei 100-110 Punkten, Takeprofit=50-80 Punkte. Der Profit beträgt jeweils 200-320 Punkte. In allen vier Fällen wird Takeprofit ausgelöst.

Wir haben wieder eine arbeitsfähige Strategie bekommen. Es bleibt nur ihren Code zu schreiben, sie anhand der Historie zu testen und zu erfahren, ob sie Gewinne bringt. 

Strategien coden

Strategien basierend auf dem Bollinger Bands Indikator 

Beziehen wir zuerst die Klasse CTrade für eine bequeme Verwaltung von Trades mit ein. Weiter beschäftigen wir uns mit Eingangsvariablen.

  • Die Variable div_work ist für Preissprünge verantwortlich: sie begrenzt den Wertebereich, in welchem das Signal liegen kann.
  • Die Variable div_signal ist für die Verzerrung des Signals verantwortlich. Als Signal gilt nicht der Punkt, an welchem die obere oder untere Grenze berührt wird, sie hat Spielraum. Mit anderen Worten wird das Signal ausgelöst, wenn der Preis über die Grenzen um den Abstand dieser Variablen hinausläuft. Dies filtert eine Reihe falscher Signale aus.
  • Die Variable work_alt — Flag, das erlaubt, die aktuelle Position zu schließen und eine neue beim Auftreten des entgegengesetzten Signals zu eröffnen.
//+------------------------------------------------------------------+
//|                                        BollingerBandsForFlat.mq5 |
//|                                                          Aktiniy |
//|                                                             BBFF |
//+------------------------------------------------------------------+
#property copyright "Aktiniy"
#property link      "BBFF"
#property version   "1.01"
#include<Trade\Trade.mqh>
//--- input parameters
input char     time_h_start=22;       // Anfangszeitpunkt des Handels
input char     time_h_stop=3;         // Endzeitpunkt des Handels
input int      bands_period=12;       // Periode von Bollinger Bands
input int      bands_shift=0;         // Verschiebung von Bollinger Bands
input double   bands_diviation=2;     // Abweichungen von Bollinger Bands
input double   div_work=3;            // Maximaler Abstand von der Grenze des Signals
input double   div_signal=5;          // Minimaler Abstand von der Grenze des Signals
input bool     work_alt=true;         // Arbeit mit der Position wenn ein entgegengesetztes Signal vorhanden
input int      take_profit=50;        // Take Profit
input int      stop_loss=100;         // Stop Loss
+//---+
input bool     mon=true;              // Arbeiten am Montag
input bool     tue=false;             // Arbeiten am Dienstag
input bool     wen=true;              // Arbeiten am Mittwoch
input bool     thu=true;              // Arbeiten am Donnerstag
input bool     fri=true;              // Arbeiten am Freitag
+//---+
input long magic_number=65758473787389; // Magic Number
input double order_volume=0.01;         // Lotgröße
input int order_deviation=100;          // Abweichung nach dem Eröffnen einer Position
//--- Variable
MqlDateTime time_now_str;
datetime time_now_var;
CTrade trade;
int bb_handle;
double bb_base_line[3];
double bb_upper_line[3];
double bb_lower_line[3];
bool work_day=true;

Alle anderen Input-Variablen sind ausführlich im Code kommentiert.

Was globale Variablen betrifft, gibt es hier:

  • zwei gleichwertige Zeit-Variablen (time_now_str und time_now_var),
  • Objekt der Klasse für die Arbeit mit Orders,
  • Handle des Indikators,
  • drei kleine Arrays für Daten des Indikators zum aktuellen Zeitpunkt (bb_base_line[], bb_upper_line[] und bb_lower_line[]).
  • Die Variable work_day ist für die Erlaubnis für die Platzierung von Orders nach Wochentagen verantwortlich.

Unten ist ein kurzer Code für die Initialisierung einiger Parameter für die Arbeit mit der Klasse angeführt:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  { 
+//---+
   trade.SetExpertMagicNumber(magic_number);
   trade.SetDeviationInPoints(order_deviation);
   trade.SetTypeFilling(ORDER_FILLING_FOK);
   trade.SetAsyncMode(false);
+//---+
   return(INIT_SUCCEEDED);
  }

Nun betrachten wir den Hauptcode der Interaktion und des Empfangens von Signalen.

Zuerst bekommen wir die aktuelle Zeit vom Server, anschließend überprüfen wir mithilfe des Schalter-Operators, ob das Platzieren von Orders heute erlaubt ist, dann schreiben wir die Information in die Variable work_day.

Es wurde geplant, dass der Expert Advisor nicht nur während der asiatischen Handelszeit arbeitet, sondern universell ist. Darüber hinaus kann es sein, dass die Zeit des Terminals auf verschiedenen Servern unterschiedlich sein wird. Deswegen sollen wir die Arbeitszeit überprüfen. Hier gibt es zwei Varianten: entweder innerhalb der Periode zu arbeiten, oder über die Tagesperiode hinauszugehen. Schreiben wir die Information in das Flag work.

Wenn die Arbeitszeit und der ausgewählte Tag übereinstimmen, wird der Handle des Indikators und seine Daten in das vorher deklarierte Array kopiert. Weiter ermitteln wir den Kauf- und Verkaufspreis, weil nach diesen Parametern Kauf- und Verkaufsignale berechnet werden. Weiter, wenn es keine offenen Positionen gibt, platzieren wir die entsprechende Order.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
+//---+
   time_now_var=TimeCurrent(time_now_str);// aktuelle Zeit
   bool work=false;
   
      switch(time_now_str.day_of_week)
     { 
      case 1: if(mon==false){work_day=false;}
      else {work_day=true;}
      break;
      case 2: if(tue==false){work_day=false;}
      else {work_day=true;}
      break;
      case 3: if(wen==false){work_day=false;}
      else {work_day=true;}
      break;
      case 4: if(thu==false){work_day=false;}
      else {work_day=true;}
      break;
      case 5: if(fri==false){work_day=false;}
      else {work_day=true;}
      break;
     }

//--- Zeit der Arbeit überprüfen     
   if(time_h_start>time_h_stop)             // über die Grenzen des Tages hinauslaufen
     { 
      if(time_now_str.hour>=time_h_start || time_now_str.hour<=time_h_stop)
        { 
         work=true;
        }                                   // das Flag der Erlaubnis für die Arbeit übergeben
     }
   else                                     // Arbeit innerhalb des Tages
     { 
      if(time_now_str.hour>=time_h_start && time_now_str.hour<=time_h_stop)
        { 
         work=true;
        }
     }                                     // das Flag der Erlaubnis für die Arbeit übergeben

   int pos=PositionsTotal();

   if(work==true && work_day==true)        // Erlaubnis für die Arbeit erhalten
     { 
      bb_handle=iBands(_Symbol,_Period,bands_period,bands_shift,bands_diviation,PRICE_CLOSE);         // den Handle des Bollinger Bands Indikators herausfinden
      int i_bl=CopyBuffer(bb_handle,0,0,3,bb_base_line);
      int i_ul=CopyBuffer(bb_handle,1,0,3,bb_upper_line);
      int i_ll=CopyBuffer(bb_handle,2,0,3,bb_lower_line);
      if(i_bl==-1 || i_ul==-1 || i_ll==-1)
        {Alert("Error of copy iBands: base line=",i_bl,", upper band=",i_ul,", lower band=",i_ll);}   // kopierte Daten prüfen

      double price_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double price_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

      if(pos<1)
        { 
         if((price_ask-(div_signal*_Point))>=bb_upper_line[2]-(div_work*_Point) && (price_ask-(div_signal*_Point))<=bb_upper_line[2]+(div_work*_Point))// Verkaufssignal
           { 
            trade.Sell(order_volume,_Symbol,price_bid,(price_bid+(stop_loss*_Point)),(price_bid-(take_profit*_Point)),"pos<1_sell");
           }
         +if((price_bid+(div_signal*_Point))<=bb_lower_line[2]+(div_work*_Point) && (price_bid+(div_signal*_Point))>=bb_lower_line[2]-(div_work*_Point))// Kaufsignal
           { 
            trade.Buy(order_volume,_Symbol,price_ask,(price_ask-(stop_loss*_Point)),(price_ask+(take_profit*_Point)),"pos<1_buy");
           }
        }
      if(pos>0 && work_alt==true)
        { 
         if(trade.RequestType()==ORDER_TYPE_BUY)                     // wenn vorher eine Kauforder platziert wurde
            if((price_ask-(div_signal*_Point))>=bb_upper_line[2]-(div_work*_Point) && (price_ask-(div_signal*_Point))<=bb_upper_line[2]+(div_work*_Point))// Verkaufssignal
              { 
               trade.PositionClose(_Symbol,order_deviation);
               trade.Sell(order_volume,_Symbol,price_bid,(price_bid+(stop_loss*_Point)),(price_bid-(take_profit*_Point)),"pos>0_sell");
              }
         if(trade.RequestType()==ORDER_TYPE_SELL)                   // wenn vorher eine Verkaufsorder platziert wurde
            +if((price_bid+(div_signal*_Point))<=bb_lower_line[2]+(div_work*_Point) && (price_bid+(div_signal*_Point))>=bb_lower_line[2]-(div_work*_Point))// Kaufsignal
              { 
               trade.PositionClose(_Symbol,order_deviation);
               trade.Buy(order_volume,_Symbol,price_ask,(price_ask-(stop_loss*_Point)),(price_ask+(take_profit*_Point)),"pos>0_buy");
              }
        }
     }
   else
     { 
      if(pos>0)
        { 
         trade.PositionClose(_Symbol,order_deviation);
        }
     }
  }
//+------------------------------------------------------------------+ 

Und das letzte Element des Codes: wenn die Nachtsitzung geschlossen wird, werden alle Orders geschlossen. Damit endet der Code des Expert Advisors.

Strategie auf Basis einer starken Veränderung der Volatilität

Hier ist alles ganz einfach: Orders werden nur innerhalb der Zeit order_time platziert. Orders werden mit dem Abstand order_div vom aktuellen Preis mit Stoploss (order_sl) und Takeprofit (order_tp) platziert. Wenn keine der Pending Orders ausgelöst wird, weist das auf eine Seitwärtsbewegung auf dem Markt hin, und alle Orders werden nach dem Ablauf der Zeit time_to_del (in Sekunden angegeben) gelöscht.

Alle anderen Eingabedaten — wie im vorherigen Expert Advisor.

Hier werden folgende globale Variablen hinzugefügt:

  • work — Flag der Erlaubnis für ein einmaliges Platzieren von Orders,
  • work_del — Flag der Erlaubnis für das Löschen der gegenläufigen Order im Falle der Auslösung einer der Orders,
  • work_day — Flag der Erlaubnis für die Arbeit am aktuellen Tag.

Es wurden auch zwei Strukturen der Ergebnisse hinzugefügt, die zum Erhalten von Informationen und Löschen der Pending Order dienen.

//+------------------------------------------------------------------+
//|                                                TimeBuyOrSell.mq5 |
//|                                                          Aktiniy |
//|                                                             TBOS |
//+------------------------------------------------------------------+
#property copyright "Aktiniy"
#property link      "TBOS"
#property version   "1.01"
#include<Trade\Trade.mqh>
//--- input parameters
input int      order_time=0;                        // Zeit des Eröffnens einer Order
input int      order_sl=200;                        // Stop Loss
input int      order_tp=180;                        // Take Profit
input int      order_div=120;                       // Abweichung nach dem Platzieren von Orders hinsichtlich des aktuellen Preises
input int      time_to_del=10800;                   // Zeit des Löschens einer Order
+//---+
input bool     mon=true;                            // Arbeit am Montag
input bool     tue=false;                           // Arbeit am Dienstag
input bool     wen=true;                            // Arbeit am Mittwoch
input bool     thu=true;                            // Arbeit am Donnerstag
input bool     fri=true;                            // Arbeit am Freitag
+//---+
input long magic_number=65758473787389;             // Magic Number
input double order_volume=0.01;                     // Lotgröße
input int order_deviation=100;                      // Abweichung nach dem Eröffnen der Position
//--- Variable
CTrade trade;
MqlDateTime time_now_str;
datetime time_now_var;
bool work=true;
bool work_del=true;
bool work_day=true;
+//---+
MqlTradeResult result_buy={0};
MqlTradeResult result_sell={0};

Unten ist ein kurzer Code für die Initialisierung einiger Parameter für die Arbeit mit der Klasse, die der vorherigen Klasse identisch ist, angeführt.

Der Beginn der Funktion OnTick ist ähnlich dem vorher beschriebenen Expert Advisor. Nach dem Erhalten des Flags für die Arbeit an diesem Tag wird überprüft, ob die aktuelle Stunde passt. Wenn alles erfolgreich ist, berechnen wir die Parameter für die Eröffnung der Orders (Take Profit, Stop Loss, Eröffnungskurs und Zeit des Löschens im Fall wenn die Order). Senden wir die entsprechenden Handelsaufträge an den Server.

Nach dem Platzieren der Pending Orders verfolgt der Expert Advisor das Auslösen einer von ihnen und löscht die übrige aus der Struktur des Ergebnisses nach dem Ticket (result_buy, result_sell).

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
+//---+
   time_now_var=TimeCurrent(time_now_str);// aktuelle Zeit

   switch(time_now_str.day_of_week)
     { 
      case 1: if(mon==false){work_day=false;}
      else {work_day=true;}
      break;
      case 2: if(tue==false){work_day=false;}
      else {work_day=true;}
      break;
      case 3: if(wen==false){work_day=false;}
      else {work_day=true;}
      break;
      case 4: if(thu==false){work_day=false;}
      else {work_day=true;}
      break;
      case 5: if(fri==false){work_day=false;}
      else {work_day=true;}
      break;
     }

   if(time_now_str.hour==order_time && work==true && work_day==true)
     { 
      double price_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double price_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

      double div=order_div*_Point;
      double sl=order_sl*_Point;
      double tp=order_tp*_Point;

      double price_buy=price_ask+div;
      double price_sell=price_bid-div;

      double buy_sl=price_buy-sl;
      double buy_tp=price_buy+tp;
      double sell_sl=price_sell+sl;
      double sell_tp=price_sell-tp;

      datetime time_end=time_now_var+time_to_del;     //3600 Sekunden, eine Stunde

      trade.BuyStop(order_volume,price_buy,_Symbol,buy_sl,buy_tp,ORDER_TIME_SPECIFIED,time_end,"BuyLimit");
      trade.Result(result_buy);

      trade.SellStop(order_volume,price_sell,_Symbol,sell_sl,sell_tp,ORDER_TIME_SPECIFIED,time_end,"SellLimit");
      trade.Result(result_sell);

      work=false;
     }

   if(PositionsTotal()>0 && work_del==true)
     { 
      PositionSelect(_Symbol);
      long position_type=PositionGetInteger(POSITION_TYPE);
      if(position_type==POSITION_TYPE_SELL)
         trade.OrderDelete(result_buy.order);
      if(position_type==POSITION_TYPE_BUY)
         trade.OrderDelete(result_sell.order);

      work_del=false;
     }
   if(PositionsTotal()==0)
      work_del=true;

   if(time_now_str.hour!=order_time)
     { 
      work=true;
     }

  }
//+------------------------------------------------------------------+

Am Ende des Codes wird das Flag der Erlaubnis für das Platzieren von Orders gesetzt, wenn die Eröffnungszeit überschritten wird.

Testen und Profitabilität

Strategien basierend auf dem Bollinger Bands Indikator 

  • Symbol: EURUSD
  • Periode: М30 (2017.01.01 - 2017.11.03)
  • Broker: Halifax Investment Services Pty Ltd
  • Währung: AUD
  • Ersteinzahlung: 100,00
  • Hebel: 1:100

Im Laufe der Optimierung wurden folgende Parameter festgestellt:


Kurze Erklärung: die Arbeit läuft in der Nacht von 1:00 bis 11:00 Uhr Moskauer Zeit, Periode des Indikators 11, maximaler Abstand von der Grenze des Signals 12, minimaler Abstand von der Grenze des Signals 13, Stop Loss=140 und Take Profit=120, Arbeit an allen Tagen außer Dienstag.

Zunächst schauen wir uns die Ergebnisse des Testens im Modus "OHLC auf M1" an, Abb. 6 und 7:


Abb.6. Testergebnisse für die Strategie basierend auf Bollinger Bands anhand OHLC auf M1

Abb.6. Testergebnisse für die Strategie basierend auf Bollinger Bands, OHLC auf M1

Abb.7. Testergebnisse im Chart (Bollinger Bands, OHLC auf M1)

Abb.7. Testergebnisse im Chart (Bollinger Bands, OHLC auf M1)

Testergebnisse mit denselben Parametern, aber im Modus "Jeder Tick anhand realer Ticks", Abb. 8 und 9:

Abb.8. Testergebnisse für die Strategie basierend auf Bollinger Bands im Modus "Jeder Tick anhand realer Ticks"

Abb.8. Testergebnisse für die Strategie basierend auf Bollinger Bands im Modus "Jeder Tick anhand realer Ticks"

Abb.9. Testergebnisse im Chart (Bollinger Bands im Modus "Jeder Tick anhand realer Ticks")

Abb.9. Testergebnisse im Chart (Bollinger Bands im Modus "Jeder Tick anhand realer Ticks")

Wie aus den Ergebnissen hervorgeht, wird in beiden Fällen Gewinn erzielt: im ersten Fall — 152%, im zweiten — 48%, (auf die Qualität der Historie zurückzuführen). In beiden Tests betrug der Rückgang weniger als 25%. Ich glaube, das ist ein interessantes und beachtenswertes Ergebnis.

Auf der Abb. 3 haben wir drei Perioden der Handelszeit betrachtet und die Strategie beschrieben. Schauen wir nun, wie der Expert Advisor auf den ersten zwei Abschnitten gehandelt hat (Abb. 10 und 11):

Abb.10. Das Ergebnis der Ausführung des Expert Advisors in der früher betrachteten ersten Periode

Abb.10. Das Ergebnis der Ausführung des Expert Advisors in der früher betrachteten ersten Periode

Auf der Abbildung 10 (das ist die erste Periode auf der Abb. 3) sieht man, wie der Expert Advisor drei Einstiege implementiert. Der erste ist nicht erfolgreich und endet mit einem Stop Loss, aber zwei weitere — am Ende der asiatischen Handelszeit und am Anfang der europäischen — werden nach Take Profit geschlossen.

Abb.11. Das Ergebnis der Ausführung des Expert Advisors in der früher betrachteten zweiten Periode

Abb.11. Das Ergebnis der Ausführung des Expert Advisors in der früher betrachteten zweiten Periode

Auf der Abb. 11 (das ist die zweite Periode auf der Abb. 3) steigt der Expert Advisor zweimal in den Markt ein — am Ende der asiatischen Handelszeit und am Anfang der europäischen. Ein Einstieg ist profitabel, der andere verlustbringend. In der dritten Periode auf der Abb. 3 stieg der Expert Advisor nicht in den Markt ein. Es war Dienstag und entsprechend den Einstellungen handelt der Expert Advisor an diesem Tag nicht.

Nun schauen wir, wie sich die Strategie auf den anderen Hauptwährungspaaren zeigt:

Symbol: AUDUSD

Periode: M30 (2017.01.01 - 2017.11.07)

Parameter:


Abb.13. Testergebnisse auf AUDUSD M30 (BollingerBands)

Abb.13. Testergebnisse auf AUDUSD M30 (BollingerBands)

Abb.13. Testergebnisse auf AUDUSD M30 (BollingerBands)

Symbol: GBPUSD

Periode: M30 (2017.01.01 - 2017.11.06)

Parameter:


Abb.14. Testergebnisse auf GBPUSD M30 (BollingerBands)

Abb.14. Testergebnisse auf GBPUSD M30 (BollingerBands)

Abb.14. Testergebnisse auf GBPUSD M30 (BollingerBands)

Symbol: NZDUSD

Periode: M30 (2017.01.01 - 2017.11.07)

Parameter:


Abb.15. Testergebnisse auf NZDUSD M30 (BollingerBands)

Abb.15. Testergebnisse auf NZDUSD M30 (BollingerBands)

Abb.15. Testergebnisse auf NZDUSD M30 (BollingerBands)

Symbol: USDCAD

Periode: M30 (2017.01.01 - 2017.11.07)

Parameter:


Abb.16. Testergebnisse auf USDCAD M30 (BollingerBands)

Abb.16. Testergebnisse auf USDCAD M30 (BollingerBands)

Abb.16. Testergebnisse auf USDCAD M30 (BollingerBands)

Symbol: USDCHF

Periode: M30 (2017.01.01 - 2017.11.07)

Parameter:


Abb.17. Testergebnisse auf USDCHF M30 (BollingerBands)

Abb.17. Testergebnisse auf USDCHF M30 (BollingerBands)

Abb.17. Testergebnisse auf USDCHF M30 (BollingerBands)

Wenn man alle Testergebnisse zusammenfasst, kann man folgende Schlussfolgerungen ziehen:

  • Am besten passen für die Arbeit mit diesem Expert Advisor EURUSD, NZDUSD und AUDUSD. Nach den Parametern ist es klar, dass die Signale auf den oben genannten Währungspaaren arbeiten, wo sich Take Profit und Stop Loss höchsten um das Dreifache voneinander unterscheiden. Natürlich ist hier der Gewinn größer.
  • Der Wochentag beeinflusst den Profit ganz eindeutig. Die Währungspaare verhalten sich unterschiedlich an verschiedenen Wochentagen, wir konnten aber keine Zusammenhänge feststellen: alles hängt vom ausgewählten Währungspaar und konkreten Einstellungen ab.

Strategie auf Basis einer starken Veränderung der Volatilität

Folgende Parameter ändern sich:

  • Symbol: USDJPY
  • Periode: H1 (2017.01.01 - 2017.11.03)

Zunächst einmal überprüfen wir die oben beschriebene Strategie: 

  • order_time=8;
  • order_sl=140;
  •  order_tp=70;
  • order_div=50;
  • time_to_del=18000.

Hier haben wir den Stoploss Level von 110 auf 140 erhöht, das hat die Profitabilität der Strategie ein wenig gesteigert. Die Testergebnisse sind auf den Abbildungen 18 und 19 dargestellt:

Abb.12. Testergebnisse für die Strategie einer starken Veränderung der Volatilität auf USDJPY H1

Abb.18. Testergebnisse für die Strategie einer starken Veränderung der Volatilität auf USDJPY H1

Abb.13. Testergebnisse im Chart

Abb.19. Testergebnisse auf USDJPY H1

Im Chart sieht man, dass die Strategie ungefähr ab der Mitte des Testens zu arbeiten beginnt. Aber beim Testen anhand einer längeren Periode (ca. ab 2015) erzielt die Strategie keine Profite. Nach diesen Parametern erfolgt der Einstieg um 8:00 Uhr Moskauer Zeit, d.h. er überschneidet sich mit der europäischen Handelszeit. Diesen Handel kann man auch als Morgenhandel bezeichnen.

Das erhaltene Ergebnis ist also nicht positiv. Führen wir die Optimierung auf einem größeren Zeitraum und nur in der "Nacht" durch.

Folgende Parameter ändern sich:

  • Symbol: USDJPY
  • Periode: H1 (2015.01.01 - 2017.11.03)

Testparameter:


D.h. der Expert Advisor arbeitet nur am Dienstag, platziert Positionen um 4:00 Uhr Moskauer Zeit (asiatische Handelszeit), Stop Loss und Take Profit sind fast gleich und betragen jeweils 270 und 220 Punkte, die Orders werden mit einem Abstand von 130 vom Einstiegspreis platziert. Die Testergebnisse sind auf den Abbildungen 20 und 21 dargestellt:

Abb.14. Testergebnisse für die Strategie einer starken Veränderung der Volatilität auf USDJPY H1 (2015-2017)

Abb.20. Testergebnisse für die Strategie einer starken Veränderung der Volatilität auf USDJPY H1 (2015-2017)

Abb.15. Testergebnisse auf USDJPY H1 (2015-2017)

Abb.21. Testergebnisse auf USDJPY H1 (2015-2017)

Beim letzten Testen in den Modi "Jeder Tick anhand realer Ticks" und "OHLC auf M1" ändert sich das Ergebnis nicht besonders, deswegen wird die erste Variante dargestellt (Abb. 20 und 21)

Fazit

Man kann die Schlussfolgerung ziehen, dass der "Nachthandel" (asiatische Handelszeit) mit Gewinnen und einem kleinen Rückgang möglich ist. Besonders gute Ergebnisse lieferte im Laufe des Testens die Strategie basierend auf dem Bollinger Bands Indikator, sowohl in den Nachtstunden als auch während des ganzen Tages (in diesem Artikel sind nur die Ergebnisse der asiatischen Handelszeit und des Anfangs der europäischen Handelszeit vorgestellt). Ich möchte weiter an der Verbesserung dieser Strategie arbeiten, denn ich halte sie für relativ einfach und erfolgversprechend.

Was die Strategie basierend auf der Veränderung der Volatilität betrifft, erzielte diese schlechtere Ergebnisse. Trotzdem ist es möglich, diese in Ergänzung zu einer anderen Strategie zu verwenden. Sie wurde sowohl innerhalb des Tages, als auch während der europäischen Sitzung getestet und zeigte relativ gute Ergebnisse. Diese Strategie hängt viel mehr von Wochentagen ab, als die Strategie basierend auf dem Bollinger Bands Indikator, dies wurde während des Testens auf einer langen Periode festgestellt. In dem Expert Advisor wurde eine Vielzahl von Funktionen implementiert, was seine weitere Modernisierung quasi unmöglich macht.


Dateien:

# Name Typ Beschreibung
1 BollingerBandsForFlat_v1.01.mq5 Expert Advisor Expert Advisor für den Handel während der asiatischen Handelszeit im Seitwärtsmarkt basierend auf Signalen des Bollinger Bands Indikators
2 TimeBuyOrSell_v1.01.mq5 Expert Advisor Expert Advisor für den Handel während einer besonders volatilen Zeit


Übersetzt aus dem Russischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/ru/articles/4102

Das Erstellen einer neuen Handelsstrategie und sich die Positionseröffnungen durch Indikatoren bestimmen lassen Das Erstellen einer neuen Handelsstrategie und sich die Positionseröffnungen durch Indikatoren bestimmen lassen

Der Artikel schlägt eine Technologie vor, die jedem helfen kann, eine eigene Handelsstrategie durch die individuelle Auswahl von Indikatoren sowie den zu entwickelnden Signalen für die Positionseröffnung zu entwickeln.

Die Eröffnung durch Indikatoren bestimmen lassen Die Eröffnung durch Indikatoren bestimmen lassen

Im Leben eines Händlers gibt es verschiedene Situationen. Häufig wünschen wir uns, die Strategie von geschlossen, erfolgreichen Positionen fortzusetzen, während wir versuchen, die der Verlust bringenden Positionen weiterzuentwickeln und zu verbessern. In beiden Fällen vergleichen wir Positionen mit bekannten Indikatoren. Dieser Artikel schlägt die Methoden eines Batch-Vergleichs von Positionen mit einer Reihe von Indikatoren vor.

Handeln nach den Ebenen von DiNapoli Handeln nach den Ebenen von DiNapoli

Der Artikel beschäftigt sich mit der Möglichkeit, mit einem Expert Advisor und den Standardelementen aus MQL5 die DiNapoli-Ebenen zu handeln. Es wird die Leistungsfähigkeit getestet und die Ergebnisse besprochen.

Der NRTR Indikator und Handelsmodule basierend auf NRTR für MQL5 Wizard Der NRTR Indikator und Handelsmodule basierend auf NRTR für MQL5 Wizard

Der Artikel beschreibt den NRTR Indikator und ein Handelssystem, das auf diesem Indikator basiert. Wir erstellen ein Modul von Handelssignalen, mit welchen Strategien basierend auf Kombinationen von NRTR und zusätzlichen Indikatoren, die einen Trend bestätigen, entwickelt werden.