Nachthandel während der asiatischen Handelszeit: wie man im Plus bleibt
Dmitriy Zabudskiy | 26 Dezember, 2017
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. 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 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
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 Handelszeit auf USD/JPY H1
Gehen wir auf die Abschnitte der asiatischen Handelszeit ausführlicher ein:
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.
- 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.
- 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.
- 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.
- 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, 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.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
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
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)
Symbol: GBPUSD
Periode: M30 (2017.01.01 - 2017.11.06)
Parameter:
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)
Symbol: USDCAD
Periode: M30 (2017.01.01 - 2017.11.07)
Parameter:
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)
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.18. Testergebnisse für die Strategie einer starken Veränderung der Volatilität auf USDJPY H1
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.20. Testergebnisse für die Strategie einer starken Veränderung der Volatilität 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 |