Zeichnen Horizontaler Durchbruch-Ebenen mit Fractals
Victor Chebotariov | 3 März, 2016
Fractals
Fractals sind einer der fünf Indikatoren von Bill Williams Handelsstrategie, die es ermöglichen Spitzen und Böden zu ermitteln. Die technische Definition eines Up-Fractals, ist eine Reihe von mindestens fünf aufeinanderfolgenden Balken, die zwei Balken mit niedrigerem Maximum direkt vor und hinter dem höchsten Maximum hat. Die entgegengesetzte Konfiguration (eine Reihe von fünf Balken, die höhere Minimums vor und hinter dem tiefsten Minimum) entspricht Down-Fractals. Fractals haben Hoch- und Tief-Werte und sind mit Pfeilen auf dem Chart markiert.
Wenn Sie das Chart genau betrachten, werden Sie verstehen, dass ein Überschreiten der Fractal-Ebenen häufig zur Fortsetzung der Bewegung in die Richtung des Fractals neigt. Bei einem steigenden Markt, dient diese Art des Überschreitens dem Halten einer Long-Position. Die niedrige Fractal-Ebene ist das Überschreiten des Support-Niveaus, was ein Signal zum Schließen einer Long-Position ist. Alles funktioniert auf die gleiche Weise, jedoch umgekehrt bei einem Abwärtstrend. Die Verwendung dieser Strategie in einem seitwärts bewegenden Markt wird keine Ergebnisse erbringen.
Indikator der Fractal Ebenen
Um die Ebene des letzten oberen und unteren Fractals einfacher zu bestimmen, können wir einen einfachen Indikator schreiben, der die Ebenen mit den horizontalen Ebenen zeichnet.
Mit dem "Expert Advisor Wizard" erstellen wir den Hauptteil des Indikators. Dazu führen wir die Befehle "Datei -> Neu" aus oder betätigen die Schaltfläche in der Werkzeugleiste. Der "Expert Advisor Wizard" wird auf dem Bildschirm geöffnet.
- Im ersten Schritt wählen Sie "Benutzerdefinierter Indikator".
- Im zweiten Schritt müssen Sie Name, Autor, Link und Parameter bestimmen. Da wir die Fractal-Anzeige für unseren Indikator verwenden, haben wir keine einstellbaren Parameter, also geben wir nur Name, Autor und Link an.
- Im dritten Schritt (in neuen MetaEditor Versionen ist dies der vierte Schritt) bietet der Wizard uns an, die Parameter zu Anzeige des benutzerdefinierten Indikators festzulegen. Da unser Indikator im Hauptchart angezeigt werden soll, setzen wir kein Häkchen bei "Indikator in separatem Fenster". Des Weiteren wird angeboten die Indizes zu bestimmen. Wir benötigen zwei Indizes: Einen für die Ebene des oberen Fractals und einen weiteren für die Ebene des unteren Fractals. Beide Indizes werden den "Linien" Typ haben, wir wählen die blaue Farbe für den ersten Index und die rote Farbe düe den zweiten Index und können dann die "Fertig stellen" Schaltfläche betätigen.
Die Erstellung des Körpers des Programms ist abgeschlossen, es sollte wie folgt aussehen:
//+------------------------------------------------------------------+ //| FractalsLine.mq4 | //| Copyright © 2006, Victor Chebotariov | //| http://www.chebotariov.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Victor Chebotariov" #property link "http://www.chebotariov.com/" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- //---- return(0); } //+------------------------------------------------------------------+
Nun bleibt nur noch ein kleines Stück Code einzufügen und unser Indikator wird fertig sein.
Wir brauchen:
1. Um den Wert des Indikators für jeden Balken zu berechnen, benötigen wir den Zyklus:
int i=Bars-counted_bars-1; while(i>=0) { // Here we calculate the value of the indicator for each bar (i) i--; }
2. Um die Werte der oberen und unteren Fractals zu erhalten:
double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1); double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1);
3. Das wichtigste - um den Wert des letzten Fractals zu behalten, werden wir Rückgriff auf die globalen Variablen haben:
if(upfrac_val>0) { GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val); } else if(lofrac_val>0) { GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val); }
4. Es bleibt das Auslesen der Daten aus den globalen Variablen und diese an unsere Indizes zu übergeben:
ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac"); ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac");
Der betriebsbreite Zustand unseres Indikators hat das folgende Aussehen::
//+------------------------------------------------------------------+ //| FractalsLine.mq4 | //| Copyright © 2006, Victor Chebotariov | //| http://www.chebotariov.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Victor Chebotariov" #property link "http://www.chebotariov.com/" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Red //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- int i=Bars-counted_bars-1; while(i>=0) { double upfrac_val=iFractals(NULL,0,MODE_UPPER,i+1); double lofrac_val=iFractals(NULL,0,MODE_LOWER,i+1); if(upfrac_val>0) { GlobalVariableSet(Symbol()+Period()+"upfrac",upfrac_val); } else if(lofrac_val>0) { GlobalVariableSet(Symbol()+Period()+"lofrac",lofrac_val); } ExtMapBuffer1[i] = GlobalVariableGet(Symbol()+Period()+"upfrac"); ExtMapBuffer2[i] = GlobalVariableGet(Symbol()+Period()+"lofrac"); i--; } //---- return(0); } //+------------------------------------------------------------------+
Er muss nur noch kompiliert werden, im Menü mit dem Befehlen "Datei -> Kompilieren" oder betätigen der Schaltfläche in der Werkzeugleiste.
Der neu erstellte Indikator kann dem Chart hinzugefügt werden.
Praktische Anwendung
Im ersten Fall können die Fractal-Ebenen nützlich sein um die StopLoss Ebene unter die rote Linie in einem steigenden Markt zu verschieben. Sie müssen den StopLoss in einem rückläufigen Markt über der blauen Linie halten. Auf diese Weise ist der sichere intelligente Abstand zwischen dem StopLoss und dem Markt gewährleistet.
Zum Beispiel, wir sind in dem Markt eingetreten (sehen sie Chart Markierung 1) mit dem StopLoss über der blauen Linie (Markierung 2), wird die rote Linie durchbrochen (Markierung 3), verschieben wir den StopLoss (Markierung 4), wenn ein neuer Durchbruch entritt (Markierung 5), verschieben wir den StopLoss entsprechend (Markierung 6). Wird die blaue Linie durchbrochen (Markierung 7), schließen wir die Position.
Um FractalsLine als Trailing-Stop zu verwenden, müssen wir zwei kleine Stücke Code in den EA einfügen:
Daten erhalten von dem FractalsLine Indikator:
double FLU = iCustom(NULL,0,"FractalsLine",0,0); // Blue fractal line double FLL = iCustom(NULL,0,"FractalsLine",1,0); // Red fractal line
Trailing-stop based on the FractalsLine indicator:
if(Close[0]>FLU) //Trailing-stop for the long positions { if(OrderStopLoss()<FLL-3*Point || OrderStopLoss()==0) { OrderModify(OrderTicket(),OrderOpenPrice(),FLL-3*Point,OrderTakeProfit(),0,Green); return(0); } }
if(Close[0]<FLL) //Trailing-stop for the short positions { if(OrderStopLoss()>FLL+(Ask-Bid+3)*Point || OrderStopLoss()==0) { OrderModify(OrderTicket(),OrderOpenPrice(),FLL+(Ask-Bid+3)*Point,OrderTakeProfit(),0,Red); return(0); } }
Die Implementierung des auf dem FractalsLine Indikator basierenden Trailing-Stop in den MACD Sample Expert Advisor brachte ein positives Ergebnis. Dies ist aus dem Vergleich der Tests ersichtlich.
Test des Standard MACD Sample
Symbol | EURUSD (Euro vs US Dollar) | ||||
Periode | 1 Std. (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01) | ||||
Modell | Jeder Tick (präziseste Methode, die auf allen verfügbaren kleinsten Zeitrahmen basiert zur Generierung jedes Ticksignals) | ||||
Parameter | TakeProfit=50; Lots=0.1; TrailingStop=30; MACDOpenLevel=3; MACDCloseLevel=2; MATrendPeriod=26; | ||||
Balken im Test | 4059 | Modellierte Ticks | 1224016 | Modellierungsqualität | 90.00% |
Fehler in Chartanpassung | 1 | ||||
Ursprüngliche Einzahlung | 10000.00 | ||||
Nettoprofit gesamt | 182.00 | Bruttoprofit | 1339.00 | Bruttoverlust | -1157.00 |
Profitfaktor | 1.16 | Erwartetes Ergebnis | 3.79 | ||
Absoluter Rückgang | 697.00 | Maximaler Rückgang | 827.00 (8.16%) | Relativer Rückgang | 8.16% (827.00) |
Anzahl an Trades | 48 | Sell-Positionen (davon gewonnen %) | 28 (82.14%) | Buy-Positionen (davon gewonnen %) | 20 (85.00%) |
Gewonnene Trades (in % von Gesamt) | 40 (83.33%) | Verlorene Trades (in % von Gesamt) | 8 (16.67%) | ||
Größter | Gewinntrade | 50.00 | Verlusttrade | -492.00 | |
Durchschnitt | Gewinntrade | 33.48 | Verlusttrade | -144.63 | |
Maximum | Gewinntrades in Folge (Profit in Geld) | 14 (546.00) | Verlusttrades in Folge (Verlust in Geld) | 3 (-350.00) | |
Maximum | Gewinn aufeinanderfolgender Gewinntrades (Anzahl) | 546.00 (14) | Verlust aufeinanderfolgender Trades (Anzahl) | -492.00 (1) | |
Durchschnitt | Gewinntrades in Folge | 7 | Verlusttrades in Folge | 1 |
Test des MACD Sample mit Trailing-stop Basierend auf dem FractalsLine Indikator
Symbol | EURUSD (Euro vs US Dollar) | ||||
Periode | 1 Std. (H1) 2008.01.02 12:00 - 2008.06.30 23:00 (2008.01.01 - 2008.07.01) | ||||
Modell | Jeder Tick (präziseste Methode, die auf allen verfügbaren kleinsten Zeitrahmen basiert zur Generierung jedes Ticksignals) | ||||
Balken im Test | 4059 | Modellierte Ticks | 1224016 | Modellierungsqualität | 90.00% |
Fehler in Chartanpassung | 1 | ||||
Ursprüngliche Einzahlung | 10000.00 | ||||
Nettoprofit gesamt | 334.00 | Bruttoprofit | 1211.00 | Bruttoverlust | -877.00 |
Profitfaktor | 1.38 | Erwartetes Ergebnis | 5.14 | ||
Absoluter Rückgang | 211.00 | Maximaler Rückgang | 277.00 (2.75%) | Relativer Rückgang | 2.75% (277.00) |
Anzahl an Trades | 65 | Sell-Positionen (davon gewonnen %) | 41 (41.46%) | Buy-Positionen (davon gewonnen %) | 24 (62.50%) |
Gewonnene Trades (in % von Gesamt) | 32 (49.23%) | Verlorene Trades (in % von Gesamt) | 33 (50.77%) | ||
Größter | Gewinntrade | 50.00 | Verlusttrade | -102.00 | |
Durchschnitt | Gewinntrade | 37.84 | Verlusttrade | -26.58 | |
Maximum | Gewinntrades in Folge (Profit in Geld) | 3 (150.00) | Verlusttrades in Folge (Verlust in Geld) | 4 (-168.00) | |
Maximum | Gewinn aufeinanderfolgender Trades (Anzahl) | 150.00 (3) | Verlust aufeinanderfolgender Trades (Anzahl) | -168.00 (4) | |
Durchschnitt | Gewinntrades in Folge | 2 | Verlusttrades in Folge | 2 |
Fazit
Die vorgestellten Tests zeigen, dass die Rentabilität gewachsen und der Drawdown zurückgegangen ist, mit FractalsLine.