Die Magie der Filtration
Einleitung
Die meisten Entwickler von automatisierten Handelssystemen (Automated Trading Systems "ATS") nutzen auf die eine oder andere Weise, irgendeine Form von Signalfilterung. Obwohl es nicht der einzige Weg ist, um die Systemeigenschaften zu verbessern, wird er als effektivster gesehen. Anfänger, sogenannte "Gral-Bauer" verfallen oft der Magie der Filter. Es ist einfach eine Handelsstrategie zu nehmen und ihr ein Dutzend von Filtern anzuhängen und so einen profitablen Expert Advisor zu erhalten.
Allerdings gibt es auch Gegner hinsichtlich der Verwendung von Filtern. Filter reduzieren signifikant (manchmal um bis zu 2/3) die Anzahl der Transaktionen und es gibt keine Garantie, dass die Filter in Zukunft ebenso effektiv sind wie in der Vergangenheit. Sicherlich gibt es auch einige andere zwingende Gründe.
Lassen Sie uns also einen weiteren Blick darauf werfen und all dies Schritt für Schritt in Betracht ziehen.
Hypothese über die Sinnlosigkeit des Filterns
Wenn der Expert Advisor unrentabel ("Drainer") ist, ist es unwahrscheinlich, dass irgendeine Art der Filtration hier helfen wird. Die Magie des Filterns ist hier machtlos.
Diese Expert Advisors werden in diesem Artikel daher nicht berücksichtigt. Wir müssen jedoch wissen, dass es Studien zu Quantenfrequenzfiltern gibt, die in der Lage sind, praktisch einen jeden "Drainer" in einen pseudo-Gral zu verwandeln.
Hypothese über die Gefahren des Filterns
Wenn der Expert Advisor sich in seinen Eigenschaften einem idealen automatisierten Handelssystem nähert, dann wird ein Filtern es nur verschlechtern.
Wir sollten klären, was mit einem idealen automatisierten Handelssystem gemeint ist. Darunter versteht man eine Handelsstrategie, die nur profitable Transaktionen generiert, also keine Verluste bringt. In einem solchen System ist die Anzahl der nicht profitablen Trades = 0.
Was ist ein Filter?
In seiner einfachsten Form ist ein Handelssignalfilter eine logische Einschränkung wie zum Beispiel: wenn A nicht kleiner als B ist (A> = B), dann wird das Signal übersprungen, und wenn A kleiner ist (A <B) - dann wird es nicht übersprungen. Das Ergebnis ist, dass ein Teil der Signale eliminiert wird. Die Filterbedingungen werden durch den Entwickler des Handelsroboters etabliert. Um einige Trendarten zu etablieren, müssen wir den Einfluss verschiedener Faktoren auf die Eigenschaften von automatisierten Handelssystemen analysieren. Und es gibt eine große Vielfalt hinsichtlich solcher Faktoren. Wir müssen uns daher auf unsere Intuition verlassen, um die relevantesten und konstantesten zu wählen.
Ein Beispiel. Es kann eine Korrelation zwischen den Ergebnissen durch den Handel mit automatisierten Handelssystemen und dem Atmosphärendruck im Dorf Kukushkina geben, wenn Sie einen entsprechenden Filter erstellen und die Rentabilität des Expert Advisor verbessern, der dann das Wetter in dieser russischen Kleinstadt berücksichtigen wird. Es ist allerdings unwahrscheinlich, dass jemand so einen innovativen Ansatz zur Filterung gut finden würde, selbst wenn der Filter die Rentabilität des Systems erhöhen könnte.
Klassifizierung von Filtern
Obwohl es eine große Vielfalt an Filtern gibt, die bei automatisierten Handelssystemen verwendet werden, können sie dennoch in zwei Hauptgruppen unterteilt werden:
- Bandpass-Filter (P-filter) - sendet ein Band von Signalen;
- Diskreter Filter (D-filter) - selektives Senden von Signalen durch die Maske (Schablone).
Wo soll man anfangen?
Lassen Sie uns den Filtermechanismus betrachten, indem wir uns ein Beispiel ansehen. Lassen Sie uns den DC2008_revers Expert Advisor verwenden (siehe beigefügte Datei), der speziell für diesen Artikel entwickelt wurde, sowie seine Merkmale (ohne verwendete Filter) erkunden. Hier ist der Bericht, den wir während dem Testen erhalten haben.
Bericht
Symbol | EURUSD (Euro vs US Dollar) | ||||
Zeitraum | 1 Minute (M1) 07.09.2009 00:00 - 26.01.2010 23:59 (07.09.2009 - 27.01.2010) | ||||
Modell | Alle Ticks (die genaueste Methode hinsichtlich der kleinsten verfügbaren Zeitrahmen) | ||||
Parameter | Lots = 0,1; Symb.magic = 9001; nORD.Buy = 5; nORD.Sell = 5; | ||||
Balken in der Historie | 133967 | Modellierte Ticks | 900848 | Qualität der Modellierung | 25.00% |
Fehler durch nicht übereinstimmende Charts | 0 | ||||
Ursprüngliche Einzahlung | 10000,00 | ||||
Nettogewinn | 4408,91 | Bruttogewinn | 32827,16 | Bruttoverlust | -28418,25 |
Rentabilität | 1,16 | Erwartete Auszahlung | 1,34 | ||
Absolute Inanspruchnahme | 273,17 | Maximale Inanspruchnahme | 3001,74 (20,36%) | Relative Inanspruchnahme | 20,36% (3001,74) |
Gesamtanzahl der Transaktionen | 3284 | Short Positionen (gewinnbringend%) | 1699 (64,98%) | Long Positionen (gewinnbringend%) | 1585 (65,68%) |
Gewinnbringende Trades (% von der Gesamtanzahl) | 2145 (65,32%) | Verlustbringende Trades (% von der Gesamtanzahl) | 1139 (34,68%) | ||
Größter | gewinnbringender Trade | 82,00 | verlustbringender Trade | -211,00 | |
Durchschnittlicher | gewinnbringender Trade | 15,30 | verlustbringender Trade | -24,95 | |
Maximale Anzahl | aufeinanderfolgender Gewinne (Gewinn) | 29 (679,00) | aufeinanderfolgender Verluste (Verlust) | 16 (-290,34) | |
Maximaler | aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 679,00 (29) | aufeinanderfolgender Verlust (Anzahl der Verluste) | -1011,00 (10) | |
Durchschnittlich | aufeinanderfolgende Gewinne | 5 | aufeinanderfolgende Verluste | 3 |
Abbildung 1. Historie der Backtesting-Ergebnisse. Ursprünglicher Expert Advisor ohne Filter
Ergebnisanalyse:
- Der Expert Advisor ist profitabel und mehr als 60% sind gewinnbringende Trades - das ist gut.
- Eine maximale Inanspruchnahme von 20% der Einahlung bzw. $ 3000 sowie eine Mindestgröße hinsichtlich Lot - ist schlecht.
- Die Gesamtanzahl der Transaktionen ist ausreichend genug für den Einsatz von Filtern (> 3000).
Natürlich sind diese Schlussfolgerungen nur für den aktuell angegebenen Zeitraum der Historie relevant. Wir wissen nicht, wie der Expert Advisor an einer anderen Stelle handeln wird. Dies kann uns allerdings nicht davon abhalten, Änderungen bei seinen Eigenschaften vorzunehmen, indem wir Filter verwenden.
Daher können wir versuchen Filter für diesen Expert Advisor zu finden, die die Rentabilität verbessern und die Inanspruchnahme reduzieren.
Bandpass-Filter (P-Filter)
Dies ist einer der gängigsten und einfachsten Filter, da das Ergebnis unmittelbar nach dem Testen und ohne zusätzlicher Verarbeitung ausgewertet werden kann. Betrachten Sie die möglichen Optionen für die Verwendung im getesteten Expert Advisor. Lassen Sie uns das Band überspringen als einen der Parameter verwenden und bei verschiedenen Zeiträumen den Eröffnungskurs mit dem Schlusskurs des Balken vergleichen.
PERIOD_H4
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && iOpen(NULL,PERIOD_H4,1)<iClose(NULL,PERIOD_H4,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && iOpen(NULL,PERIOD_H4,1)>iClose(NULL,PERIOD_H4,1) ) { //---- Signal.Sell=true; }
Abbildung 2. Historie der
Backtesting-Ergebnisse. Expert Advisor mit P-Filter (PERIOD_H4)
PERIOD_H1
//+---------------------------------------------------------------------------------+ // BUY Signal //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signal //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) ) { //---- Signal.Sell=true; }
Abbildung 3. Historie der
Backtesting-Ergebnisse. Expert Advisor
mit P-Filter (PERIOD_H1)
PERIOD_M30
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && iOpen(NULL,PERIOD_M30,1)<iClose(NULL,PERIOD_M30,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && iOpen(NULL,PERIOD_M30,1)>iClose(NULL,PERIOD_M30,1) ) { //---- Signal.Sell=true; }
Abbildung 4. Historie der
Backtesting-Ergebnisse. Expert Advisor
mit P-Filter (PERIOD_M30)
PERIOD_M5
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && iOpen(NULL,PERIOD_M5,1)<iClose(NULL,PERIOD_M5,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && iOpen(NULL,PERIOD_M5,1)>iClose(NULL,PERIOD_M5,1) ) { //---- Signal.Sell=true; }
Abb.5 Bilanzchart.P-Filter PERIOD_M5
Um die Analyse der empfangenen Berichte zu vereinfachen, werden sie in der folgenden Tabelle zusammengefasst.
Kein Filtern | PERIOD_H4 | PERIOD_H1 | PERIOD_M30 | PERIOD_M5 | |
---|---|---|---|---|---|
Ursprüngliche Einzahlung | 10000,00 | 10000,00 | 10000,00 | 10000,00 | 10000,00 |
Nettogewinn | 4408,91 | 4036,33 | 4829,05 | 3852,90 | 4104,30 |
Bruttogewinn | 32827,16 | 19138,74 | 27676,50 | 18133,77 | 23717,68 |
Bruttoverlust | -28418,25 | -15102,41 | -22847,45 | -14280,87 | -19613,38 |
Rentabilität | 1,16 | 1,27 | 1,21 | 1,27 | 1,21 |
Erwartete Auszahlung | 1,34 | 2,92 | 2,20 | 3,59 | 2,02 |
Absolute Inanspruchnahme | 273,17 | 434,09 | 762,39 | 64,00 | 696,23 |
Maximale Inanspruchnahme | 3001,74 (20,36%) | 2162,61 (17,48%) | 2707,56 (17,22%) | 2121,78 (16,38%) | 1608,30 (12,46%) |
Relative Inanspruchnahme | 20,36% (3001,74) | 17,48% (2162,61) | 17,22% (2707,56) | 16,38% (2121,78) | 12,46% (1608,30) |
Gesamtanzahl der Transaktionen | 3284 | 1383 | 2195 | 1073 | 2035 |
Short Positionen (gewinnbringend%) | 1699 (64,98%) | 674 (54,01%) | 1119 (60,59%) | 547 (60,51%) | 1046 (63,48%) |
Long Positionen (gewinnbringend%) | 1585 (65,68%) | 709 (62,48%) | 1076 (64,96%) | 526 (64,64%) | 989 (66,63%) |
Gewinnbringende Trades (% der Gesamtanzahl) | 2145 (65,32%) | 807 (58,35%) | 1377 (62,73%) | 671 (62,53%) | 1323 (65,01%) |
Verlustbringende Trades (% der Gesamtanzahl) | 1139 (34,68%) | 576 (41,65%) | 818 (37,27%) | 402 (37,47%) | 712 (34,99%) |
Größter | |||||
gewinnbringender Trade | 82,00 | 201,00 | 157,00 | 204,00 | 97,00 |
verlustbringender Trade | -211,00 | -136,00 | -160,00 | -179,51 | -156,00 |
Durchschnittlicher | |||||
gewinnbringender Trade | 15,30 | 23,72 | 20,10 | 27,02 | 17,93 |
verlustbringender Trade | -24,95 | -26,22 | -27,93 | -35,52 | -27,55 |
Maximale Anzahl | |||||
aufeinanderfolgender Gewinne (Gewinn) | 29 (679,00) | 27 (817,98) | 36 (1184,32) | 36 (1637,38) | 44 (912,03) |
aufeinanderfolgender Verluste (Verlust) | 16 (-290,34) | 12 (-636,34) | 13 (-367,07) | 14 (-371,51) | 15 (-498,51) |
Maximaler | |||||
aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 679,00 (29) | 884,08 (16) | 1184,32 (36) | 1637,38 (36) | 912,03 (44) |
aufeinanderfolgender Verlust (Anzahl der Verluste) | -1011,00 (10) | -686,00 (10) | -758,00 (7) | -894,85 (10) | -589,00 (5) |
Durchschnittlich | |||||
aufeinanderfolgende Gewinne | 5 | 5 | 5 | 5 | 4 |
aufeinanderfolgende Verluste | 3 | 3 | 3 | 3 | 2 |
Tabelle 1. Vergleichstabelle der Testberichte für P-Filter
Ergebnisanalyse:
- Der Nettogewinn stieg nur beim P-Filter "PERIOD_H1" (4408,91 => 4829,05).
- Der Sieger hinsichtlich der erwarteten Auszahlung war der P-Filter "PERIOD_M30" (1,34 => 3,59).
- Die maximale Inanspruchnahme hat sich bei allen Filtern reduziert. Der kleinste Wert hinsichtlich Inanspruchnahme ist beim Filter "PERIOD_M5" aufgetreten (3001,74 => 1608,30).
- Das Filtern hat die Gesamtanzahl der Transaktionen um das 1,5-3fache reduziert.
SCHLUSSFOLGERUNGEN
- Der P-Filter kann die Eigenschaften von automatisierten Handelssystemen verbessern.
- Zur weiteren Analyse werden wir den P-Filter "PERIOD_H1" wählen, der die besten Gewinnergebnisse demonstriert hat.
Diskreter Filter (D-Filter)
Der einfachste und intuitiv am leichtesten verständliche diskrete Filter ist stundenweise zu handeln. Es ist einleuchtend, dass ein Expert Advisor im Laufe des Tages beim Handeln instabil ist. Während bestimmter Stunden ist er profitabler und während anderer Stunden kann das Gegenteil der Fall sein und er Verluste bringen. Zu diesem Zweck wollen wir den Einfluss dieses Filters auf die Handelsergebnisse studieren. Eine zusätzliche externe Variable muss vorher im Code des Expert Advisors eingearbeitet werden:
extern int Filter.Hour=0; // D-filter: trade by hour //---- extern double Lots=0.1; extern int Symb.magic=9001, nORD.Buy = 5, // max buy orders nORD.Sell = 5; // max sell orders
Und der Filter selbst:
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && Hour()==Filter.Hour ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && Hour()==Filter.Hour ) { //---- Signal.Sell=true; }
Wenn also die aktuelle Stunde mit dem diskreten Wert des D-Filters übereinstimmt, dann generieren (erlauben) wir das Kauf- oder Verkaufsignal - ansonsten tun wir es nicht.
Wir starten den Tester im optimierten Modus (die Eingabeparameter werden in den Bildern angegeben). Die Einzahlung muss als Maximum angegeben werden, um die Situation - "nicht genug Geld, um eine Position zu eröffnen" zu vermeiden und um nicht einen Teil einer Transaktion zu verlieren.
Abbildung 6. Eingabeparameter zum Finden der D-Filter Eigenschaften
Als Ergebnis erhalten wir die Charakteristik der Antwort des Filters: Gewinn, Anzahl der Transaktionen und die Inanspruchnahme (Y-Achse) in Abhängigkeit von der Tageszeit (X-Achse).
Abbildung 7. Charakteristik der Antwort des Filters. Stündlicher D-Filter
Unsere Annahme, dass der Expert Advisor verschiedene Gewinne zu unterschiedlichen Zeiten bringt, wurde also bestätigt!
... Es wurde also bestätigt, aber was tun wir nun damit? Das erste, was in den Sinn kommt, ist dem Expert Advisor zu verbieten, während der Stunden zu handeln, wo er nur Verluste bringt. Dies erscheint logisch. Nun, dann werden wir den D-Filter verändern, indem wir nur erlauben, dass während der profitablen Stunden gehandelt werden darf. Mit anderen Worten - wir werden eine Filtermaske erstellen. Jetzt können wir den fertigen D-Filter in den Code einfügen und den Testbericht betrachten.
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Symbol | EURUSD (Euro vs US Dollar) | ||||
Zeitraum | 1 Minute (M1) 07.09.2009 00:00 - 26.01.2010 23:59 (07.09.2009 - 27.01.2010) | ||||
Modell | Alle Ticks (die genaueste Methode hinsichtlich der kleinsten verfügbaren Zeitrahmen) | ||||
Parameter | Filter.Hour = 0; Lots = 0.1; Symb.magic = 9001; nORD.Buy = 5; nORD.Sell = 5; | ||||
Balken in der Historie | 133967 | Modellierte Ticks | 900848 | Qualität der Modellierung | 25.00% |
Fehler durch nicht übereinstimmende Charts | 0 | ||||
Ursprüngliche Einzahlung | 10000,00 | ||||
Nettogewinn | 6567.,66 | Bruttogewinn | 24285,30 | Bruttoverlust | -17717,64 |
Rentabilität | 1,37 | Erwartete Auszahlung | 4,13 | ||
Absolute Inanspruchnahme | 711,86 | Maximale Inanspruchnahme | 3016,21 (18,22%) | Relative Inanspruchnahme | 18,22% (3016,21) |
Gesamtanzahl der Transaktionen | 1590 | Short Positionen (gewinnbringend%) | 832 (61,30%) | Long Positionen (gewinnbringend%) | 758 (63,85%) |
Gewinnbringende Trades (% von der Gesamtanzahl) | 994 (62,52%) | Verlustbringende Trades (% von der Gesamtanzahl) | 596 (37,48%) | ||
Größter | gewinnbringender Trade | 194,00 | verlustbringender Trade | -161,00 | |
Durchschnittlicher | gewinnbringender Trade | 24,43 | verlustbringender Trade | -29,73 | |
Maximale Anzahl | aufeinanderfolgender Gewinne (Gewinn) | 40 (1096,16) | aufeinanderfolgender Verluste (Verlust) | 15 (-336,45) | |
Maximaler | aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 1289,08 (20) | aufeinanderfolgender Verlust (Anzahl der Verluste) | -786,51 (8) | |
Durchschnittlich | aufeinanderfolgende Gewinne | 5 | aufeinanderfolgende Verluste | 3 |
Abbildung 8. Bilanzchart. D-filter by the hour
Ergebnisanalyse:
- Reduzierung der Inanspruchnahme - nicht erreicht. Sie hat nicht abgenommen, sondern sogar leicht zugenommen (3001,74 => 3016,21)!?
- Der Nettogewinn stieg um rund 50% (4408,91 => 6567,66). Jedoch wurde dabei die Anzahl der Transaktionen fast halbiert (3284 => 1590).
- Die erwartete Auszahlung beim D-Filter (4,13) ist höher als der beste Wert aller untersuchten P-Filter (3,59).
- Die Zahl der gewinnbringenden Transaktionen hat sich verringert (64.98% => 62.52%). Das heißt, dass der Filter nicht nur verlustbringende, sondern auch eine Reihe von profitablen Transaktionen eliminiert hat.
SCHLUSSFOLGERUNGEN
- Die diskrete Filterung kann effektiver sein als die P-Filterung, aber sie erfordert mehr Feinabstimmung und die Auswahl von optimalen Eingangsbedingungen.
Filtern von Signalen mit Hilfe von zwei oder mehreren Filtern
Es ist nicht immer möglich, mit nur einem Filter, eine deutliche Leistungssteigerung bei automatisierten Handelssystemen zu erzielen. Es ist eher üblich, stattdessen mehrere Filter einzurichten. Daher stellen wir uns nun die Frage, wie wir diese Filter zusammenfügen.
Zum Zweck dieser Studie werden wir die oben genannten Filter hernehmen und sie zur Vereinfachung folgendermaßen kennzeichnen: Filter Nr. 1 (P-Filter "PERIOD_H1") und Filter Nr. 2 (D-Filter). Zunächst werden wir sie durch ein einfaches Hinzufügen miteinander verschmelzen. Um dies zu tun, werden wir den Code des Expert Advisor ändern.
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- filter №2 && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- filter №2 && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Danach testen wir die erzeugte Kombination von Filtern und als Ergebnis erhalten wir folgenden Bericht.
Bilanz
Symbol | EURUSD (Euro vs US Dollar) | ||||
Zeitraum | 1 Minute (M1) 07.09.2009 00:00 - 26.01.2010 23:59 (07.09.2009 - 27.01.2010) | ||||
Modell | Alle Ticks (die genaueste Methode hinsichtlich der kleinsten verfügbaren Zeitrahmen) | ||||
Parameter | Lots = 0.1; Symb.magic = 9001; nORD.Buy = 5; nORD.Sell = 5; | ||||
Balken in der Historie | 133967 | Modellierte Ticks | 900848 | Qualität der Modellierung | 25,00% |
Fehler durch nicht übereinstimmende Charts | 0 | ||||
Ursprüngliche Einzahlung | 10000,00 | ||||
Nettogewinn | 6221,18 | Bruttogewinn | 20762,67 | Bruttoverlust | -14541,49 |
Rentabilität | 1,43 | Erwartete Auszahlung | 5,47 | ||
Absolute Inanspruchnahme | 1095,86 | Maximale Inanspruchnahme | 3332,67 (20,13%) | Relative Inanspruchnahme | 20,13% (3332,67) |
Gesamtanzahl der Transaktionen | 1138 | Short Positionen (gewinnbringend%) | 584 (58,39%) | Long Positionen (gewinnbringend%) | 554 (61,19%) |
Gewinnbringende Trades (% von der Gesamtanzahl) | 680 (59,75%) | Verlustbringende Trades (% von der Gesamtanzahl) | 458 (40,25%) | ||
Größter | gewinnbringender Trade | 201,00 | verlustbringender Trade | -159,00 | |
Durchschnittlicher | gewinnbringender Trade | 30,53 | verlustbringender Trade | -31,75 | |
Maximale Anzahl | aufeinanderfolgender Gewinne (Gewinn) | 28 (1240,15) | aufeinanderfolgender Verluste (Verlust) | 16 (-600,17) | |
Maximaler | aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 1240,15 (28) | aufeinanderfolgender Verlust (Anzahl der Verluste) | -883,85 (10) | |
Durchschnittlich | aufeinanderfolgende Gewinne | 5 | aufeinanderfolgende Verluste | 3 |
Abbildung 9. Chart zur Bilanzveränderung.Zwei Filter: P-Filter + D-Filter (einfache Hinzufügung)
Allerdings können diese beiden Filter auch auf andere Weise miteinander verbunden werden. Nehmen wir an, dass Filter 1 besser konfiguriert ist als Filter 2. Das heißt, wir müssen einen neuen D-Filter bauen. Der Code des Expert Advisor wird folgendermaßen aussehen. Wir starten den Tester in einem optimierten Modus und erhalten die Eigenschaften von Filter 2 (stündlicher Handel).
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- filter №2 && Hour()==Filter.Hour ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- filter №2 && Hour()==Filter.Hour ) { //---- Signal.Sell=true; }
Abbildung 10. Die Gewinnveränderungen bei zwei D-Filtern. Vergleichsanalyse
Tatsächlich haben sich die Ansprecheigenschaften des Filters geändert. Und das ist kein Wunder, wenn man berücksichtigt, dass wir seine Eigenschaften geändert haben, indem wir Filter 1 dem Expert Advisor hinzugefügt haben. Folglich ist es notwendig, die Maske für Filter 2 zu ändern.
Abbildung 11. Merkmale der Reaktion von Filter 2. Stündliche D-Filterung (optimiert)
Endgültige Betrachtung des Expert Advisor Codes.
//+---------------------------------------------------------------------------------+ // BUY Signals //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- filter №2 && (Hour()==0 || Hour()==1 || Hour()==6 || Hour()==7 || Hour()==9 || Hour()==10 || Hour()==12 || Hour()==14 || Hour()==15 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // SELL Signals //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................Filters................................... //---- filter №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- filter №2 && (Hour()==0 || Hour()==1 || Hour()==6 || Hour()==7 || Hour()==9 || Hour()==10 || Hour()==12 || Hour()==14 || Hour()==15 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Bilanz
Symbol | EURUSD (Euro vs US Dollar) | ||||
Period | 1 Minute (M1) 07.09.2009 00:00 - 26.01.2010 23:59 (07.09.2009 - 27.01.2010) | ||||
Modell | Alle Ticks (die genaueste Methode hinsichtlich der kleinsten verfügbaren Zeitrahmen) | ||||
Parameter | Lots = 0.1; Symb.magic = 9001; nORD.Buy = 5; nORD.Sell = 5; | ||||
Balken in dr Historie | 133967 | Modellierte Ticks | 900848 | Qualität der Modellierung | 25,00% |
Fehler durch nicht übereinstimmende Charts | 0 | ||||
Ursprüngliche Einzahlung | 10000,00 | ||||
Nettogewinn | 5420,54 | Bruttogewinn | 22069,48 | Bruttoverlust | -16648,94 |
Rentabilität | 1,33 | Erwartete Auszahlung | 3,77 | ||
Absolute Inanspruchnahme | 826,86 | Maximale Inanspruchnahme | 2141,24 (14,06%) | Relative Inanspruchnahme | 14,06% (2141,24) |
Gesamtanzahl der Transaktionen | 1439 | Short Positionen (gewinnbringend%) | 758 (61,87%) | Long Positionen (gewinnbringend%) | 681 (64,46%) |
Gewinnbringende Trades (% von der Gesamtanzahl) | 908 (63,10%) | Verlustbringende Trades (% von der Gesamtanzahl) | 531 (36,90%) | ||
Größter | gewinnbringender Trade | 157,00 | verlustbringender Trade | -154,00 | |
Durchschnittlicher | gewinnbringender Trade | 24,31 | verlustbringender Trade | -31,35 | |
Maximale Anzahl | aufeinanderfolgender Gewinne (Gewinn) | 30 (772,70) | aufeinanderfolgender Verluste (Verlust) | 16 (-562,17) | |
Maximaler | aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 1091,32 (22) | aufeinanderfolgender Verlust (Anzahl der Verluste) | -926,15 (15) | |
Durchschnittlich | aufeinanderfolgende Gewinne | 5 | aufeinanderfolgende Verluste | 3 |
Abbildung 12. Chart mit den Bilanzänderungen als Ergebnis der Optimierung hinsichtlich der Eigenschaften der beiden Filter
Um die Analyse der Bereichte zu erleichtern, erstellen wir folgende Tabelle.
Kein Filtern | Hinzufügung | Optimierung | |
---|---|---|---|
Ursprüngliche Einzahlung | 10000,00 | 10000,00 | 10000,00 |
Nettogewinn | 4408,91 | 6221,18 | 5420,54 |
Bruttogewinn | 32827,16 | 20762,67 | 22069,48 |
Bruttoverlust | -28418,25 | -14541,49 | -16648,94 |
Rentabilität | 1,16 | 1,43 | 1,33 |
Erwartete Auszahlung | 1,34 | 5,47 | 3,77 |
Absolute Inanspruchnahme | 273,17 | 1095,86 | 826,86 |
Maximale Inanspruchnahme | 3001,74 (20,36%) | 3332,67 (20,13%) | 2141,24 (14,06%) |
Relative Inanspruchnahme | 20,36% (3001,74) | 20,13% (3332,67) | 14,06% (2141,24) |
Gesamtanzahl der Transaktionen | 3284 | 1138 | 1439 |
Short Positionen (gewinnbringend%) | 1699 (64,98%) | 584 (58,39%) | 758 (61,87%) |
Long Positionen (gewinnbringend%) | 1585 (65,68%) | 554 (61,19%) | 681 (64,46%) |
Gewinnbringende Trades (% der Gesamtanzahl) | 2145 (65,32%) | 680 (59,75%) | 908 (63,10%) |
Verlustbringende Trades (% der Gesamtanzahl) | 1139 (34,68%) | 458 (40,25%) | 531 (36,90%) |
Größter | |||
gewinnbringender Trade | 82,00 | 201,00 | 157,00 |
verlustbringender Trade | -211,00 | -159,00 | -154,00 |
Durchschnittlicher | |||
gewinnbringender Trade | 15,30 | 30,53 | 24,31 |
verlustbringender Trade | -24,95 | -31,75 | -31,35 |
Maximale Anzahl | |||
aufeinanderfolgender Gewinne (Gewinn) | 29 (679,00) | 28 (1240,15) | 30 (772,70) |
aufeinanderfolgender Verluste (Verlust) | 16 (-290,34) | 16 (-600,17) | 16 (-562,17) |
Maximaler | |||
aufeinanderfolgender Gewinn (Anzahl der Gewinne) | 679,00 (29) | 1240,15 (28) | 1091,32 (22) |
aufeinanderfolgender Verlust (Anzahl der Verluste) | -1011,00 (10) | -883,85 (10) | -926,15 (15) |
Durchschnittlich | |||
aufeinanderfolgende Gewinne | 5 | 5 | 5 |
aufeinanderfolgende Verluste | 3 | 3 | 3 |
Tab.2 Vergleichstabelle für die Testberichte über die Kombination von zwei Filtern: P-Filter und D-Filter
Ergebnisanalyse:
- Wenn wir den Vergleich auf der Grundlage der Kriterien von Umsatz, Gewinn und Erwartete Auszahlung machen, dann wurden die besten Ergebnisse erzielt, als wir beide Filter hinzugefügt hatten.
- Wenn wir uns auf die Inanspruchnahme konzentrieren, dann ist die Filteroptimierungsoption der Gewinner.
- In jedem Fall verbessert das Filtern die Eigenschaften von automatisierten Handelssystemen.
Fazit
- Was ist also der magische Filter? Die Magie ist seine Einfachheit und die Fähigkeit, die Eigenschaften von jedem Expert Advisor zu ändern.
- Die vorgeschlagene Technik zur Filtererstellung ist nicht zum einfachen Kopieren ausgelegt. Sie zeigt nur, wie ein P-Filter und D-Filter für einen bestimmten Expert Advisor entwickelt werden können. Ein Filter, der für einen Expert Advisor geeignet ist, kann einem anderen vielleicht schaden.
- Und denken Sie daran, ein ideales automatisiertes Handelssystem braucht keinen Filter! ... Sie träumen davon, ein solches System zu kreieren, nicht wahr?
- Ich weiß, dass dieser Code des Expert Advisor und Filters nicht optimiert und daher sicherlich nicht ideal ist. Aber für die Zwecke dieses Artikels haben wir uns für diese besondere Art der Programmierung entschieden. Dies wurde getan, so dass jeder "Dummie" in der Lage ist, den oben beschriebenen Vorgang zu wiederholen und seine eigenen Filter zu erstellen.
- ACHTUNG! Verwenden Sie den in diesem Artikel beschriebenen Expert Advisor nicht für den Echtgeld-Handel!
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/1577
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.