Optimieren einer Strategie unter Verwendung einer Kurve der Salden und dem Vergleich der Ergebnisse mit dem Kriterium "Balance + max Sharpe Ratio"

Vladimir Karputov | 14 November, 2017


Inhalt

1. Einführung

Während meiner Arbeit wurde mir klar, dass es für die Saldenkurve nicht ausreicht, einfach nur das historische Wachstum zu beurteilen. Außerdem sollte sie möglichst gerade sein. Mit anderen Worten, die mittlere quadratische Abweichung von der Trendlinie sollte so klein wie möglich sein. Das bedeutet, dass wir neben Profit auch Stabilität erreichen wollen. Um das zu erreichen, lassen Sie uns noch einen weiteren Optimierungsparameter überprüfen: Die Saldenkurve und die Varianz der Abweichungen der Werte von der Regressionsgeraden.

Wir verwenden die Bibliothek ALGLIB für numerische Berechnungen der linearen Regression und einige andere statistischer Kenngrößen.


2. Wie berechnet man eine Trendlinie aus einer Grafik der Salden?

Wir müssen jene Trendlinie für die Saldenkurve ermitteln, die die Summe der Quadrate der Abweichungen von der Linie minimiert.

Die Parameter der Geradengleichung y=ax+b werden mit der Standardmethode des kleinsten Quadrats (LS) ermittelt. Ich werde nicht alle notwendigen mathematischen Gleichungen entwickeln. Stattdessen werde ich eine fertige Funktion aus der Bibliothek ALGLIB verwenden, die an unsere Erfordernisse angepasst wird.

2.1. Algorithmus der Berechnung des Kriteriums für die Optimierung

Schauen wir uns ein Beispiel von fünf Positionen an:

Abb. 1. Die Salden und die lineare Regression

Abb. 1. Saldenkurve und die lineare Regression

Diese fünf Positionen aus "Balance" 1-2-3-4-5 Saldenkurve. Die linearen Regression wird mit die Methode der kleinsten Quadrate berechnet und gezeichnet (berechnet durch die numerische Analyse der Bibliothek ALGLIB).

2.2. Einführung der ersten Variable TrendProfit

Sie steht für Gewinn je Position in der gezeichneten Linie:

Abb. 2. Parameter TrendProfit

Abb. 2. TrendProfit parameter

Die Variable errechnet sich aus dem Verhältnis der Regressionsgeradenhöhe zur Anzahl der Positionen. Die Höhe wird wiederum als Differenz der Regressionsgeraden an den Punkten B und A berechnet.

Nun müssen wir den Fehler der Regressionsgeraden ermitteln - die durchschnittliche Abweichung der Regressionsgeraden von der Saldenkurve. Wir nennen dies die Standardabweichung der Salden von der linearen Regression und kennzeichnen sie als LR Standardabweichung:

Abb. 3. LR Standardabweichung

Pic. 3. LR Standardabweichung

In dieser Gleichung wird der Fehler aus der Differenz vom Saldo und dem Wert der linearen Regression ermittelt. Sie finden Details dazu hier (auf russisch). 

Im Fall der Abb. 1, sind die Fehler wir folgt:

error #1 error #2 error #3 error #4 error #5
10 000 - 10 600 = - 600 12 000 - 11 200 = 800 11 000 - 11 800 = - 800 14 000 - 12 400 = 1600 12 000 - 13 000 = - 1000

Daher errechnet sich der LR Standardabweichung wie folgt:

Abb. 4. Berechnung des LR Standardabweichungs

Pic. 4. Berechnung des LR Standardabweichungs

2.3. Die Variable ProfitStability.

Dieser Parameter ist verantwortlich für die Glätte des Saldenkurve. Unsere Ziele:

  • Die Regressionsgerade sollte möglichst steil sein, relativ zur Waagerechten - das bedeutet mehr Gewinn;
  • Die Abweichung der Saldenkurve von der Regressionsgeraden sollte so gering wie möglich sein - dies deutet auf eine stabilere Handelsbilanz hin.

Die ProfitStability wird als Verhältnis von TrendProfit und LR Standardabweichung berechnet:

Abb. 5. Die Variable ProfitStability

Pic. 5. Die Variable ProfitStability 

Um die Auswirkungen von Positionen mit unterschiedlichen Volumina zu reduzieren, können wir die Variable ProfitStability durch das Gesamtvolumen aller Positionen dividieren.


3. Arbeiten mit der Bibliothek ALGLIB

Aktuell (Build 1645) ist die Bibliothek ALGLIB seit langem Teil der Standardbibliothek: [date folder]\MQL5\Include\Math\Alglib\alglib.mqh

Abb. 6. alglib

Pic. 6. Der Pfad zu Bibliothek ALGLIB in der Standardbibliothek

Die Klassen der Bibliothek ALGLIB 

Um mit der linearen Regression arbeiten zu können, benötigen wir die folgenden Klassen:
  • Klasse CLinReg — Basisklasse zur Berechnung der linearen Regression
    • Methode CLinReg::LRBuild — Berechnet die linearen Regression
    • Methode CLinReg::LRUnpack — Rückgabe des Koeffizienten der linearen Modells
  • Klasse CLinearModel — Hilfsklasse
  • Klasse CLRReport — Struktur, die die erweiterten Daten des linearen Modells enthält. Insbesondere interessieren wir uns für die Variable m_rmserror (mittlerer quadratischer Fehler).

Klasse BalanceRegression.mqh

Alle Arbeiten, die mit der linearen Regression und der Parameterberechnung zusammenhängen, werden in der Klasse BalanceRegression.mqh ausgeführt.

Methoden der Klassen

 Parametereinstellungen
 SetStartBalance   Bestimmt den Anfangssaldo
 SetFromDate  Setzt das Anfangsdatum in der Handelshistorie
 SetVolumeNormalization  Bestimmt die Art, die Volumina zu normalisieren
 Abfrage der Ergebnisse
 GetProfitStability  Abfrage der Ergebnisse 


Die Arbeit mit CBalanceRegression umfasst folgende Schritte.

  1. Bestimmen des Anfangssaldo — Aufruf der Methode SetStartBalance.
  2. Setzten das Anfangsdatum in der Handelshistorie — Aufruf der Methode SetFromDate.
  3. Bestimmen der Art, die Volumina zu normalisieren — Aufruf der Methode SetVolumeNormalization. Wenn Sie die Volumina normalisieren wollen, über geben Sie 'true', sonst — 'false'. 
  4. Abfrage der Ergebnisse — Aufruf der Methode GetProfitStability, sie gibt die Ergebnisse von OnTester zurück.

3.1. Berechnungsschritte (Methode GetProfitStability)

Die Ergebnisse der Positionen mit (Kommission + Swap + Gewinn) > 0.0 werden im Array arr_profits gesichert. Die Volumina aller Positionen müssen in der Variablen total_volume aufsummiert werden.

//---
   double   arr_profits[];                            // array of results deals 
   double   total_volume=0;                           // total volume

Als nächstes gehen Sie alle Positionen durch - tragen Sie sie in das Array arr_profits ein und addieren Sie die Volumina der Positionen zur Variablen total_volume:

//--- request trade history 
   HistorySelect(m_from_date,to_date);
   uint total_deals=HistoryDealsTotal();
   ulong ticket_history_deal=0;
//--- for all deals 
   for(uint i=0;i<total_deals;i++)
     {
      //--- try to get deals ticket_history_deal 
      if((ticket_history_deal=HistoryDealGetTicket(i))>0)
        {
         long     deal_type         =HistoryDealGetInteger(ticket_history_deal,DEAL_TYPE);
         double   deal_volume       =HistoryDealGetDouble(ticket_history_deal,DEAL_VOLUME);
         double   deal_commission   =HistoryDealGetDouble(ticket_history_deal,DEAL_COMMISSION);
         double   deal_swap         =HistoryDealGetDouble(ticket_history_deal,DEAL_SWAP);
         double   deal_profit       =HistoryDealGetDouble(ticket_history_deal,DEAL_PROFIT);

         if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
            continue;

         if(deal_commission==0.0 && deal_swap==0.0 && deal_profit==0.0)
            continue;

         total_volume+=deal_volume;

         int arr_size=ArraySize(arr_profits);
         ArrayResize(arr_profits,arr_size+1,50);   // resize the aray

         if(arr_size==0)
            arr_profits[arr_size]=GetSetStartBalance()+deal_commission+deal_swap+deal_profit;
         else
            arr_profits[arr_size]=arr_profits[arr_size-1]+deal_commission+deal_swap+deal_profit;

         int d=0;
        }
     }

Anmerkung: Wenn wir den ersten Eintrag in das Array arr_profits vornehmen, summieren wir den Anfangssaldo und die Resultate der Positionen. Für alle nachfolgenden Einträge summieren Sie die vorherige Eintragung und das Endergebnis des Handels.

Deklarieren Sie das Objekt der Klasse CMatrixDouble. Eigentlich ist das eine Matrix. Füllen wir sie aus: Positionsnummer (beginnend in "1") und das finanzielle Ergebnis.

//--- CMatrixDouble object
   CMatrixDouble xy(arr_size,2);
   for(int i=0;i<arr_size;i++)
     {
      xy[i].Set(0,i+1);
      xy[i].Set(1,arr_profits[i]);
      //Print(arr_profits[i]); // for debag
     }

Deklarieren Sie die Objekte der benötigten Klassen (CLinReg, CLinearModel, CLRReport) und berechnen Sie die linearen Regression:

//--- linear regression construction
   CLinReg        linear_regression;
   CLinearModel   linear_model;
   CLRReport      linear_report;
   int retcode;
   linear_regression.LRBuild(xy,arr_size,1,retcode,linear_model,linear_report);
   if(retcode!=1)
     {
      Print("Linear regression failed, error code=",retcode);
      return(0.0);
     }
   int nvars;
   double coefficients[];
   linear_regression.LRUnpack(linear_model,coefficients,nvars);
   double coeff_a=coefficients[0];
   double coeff_b=coefficients[1];
   PrintFormat("y = %.1f x + %.1f",coeff_a,coeff_b);

Rufen Sie schließlich die Methode LRUnpack auf, um die Koeffizienten für der Gleichung y = a*x + b zu erhalten. Die Koeffizienten sind im Array der Koeffizienten.

Nachdem wir nun die lineare Regression mit Hilfe der Bibliothek ALGLIB berechnet haben, können wir direkt mit der Berechnung des Parameters fortfahren, der den Schwerpunkt des gesamten Artikels bildet.

//--- сalculation of parameters
   double TrendProfit=((double)arr_size*coeff_a+coeff_b)-(1.0*coeff_a+coeff_b);  // the projection of the regression line on the "Y" axis 
   TrendProfit/=(double)arr_size;                                                // divided by the number of trades
   double TrendMSE=linear_report.m_rmserror;                                     // root mean square error on a training set
   double ProfitStability=TrendProfit/TrendMSE;
//--- normalize the trading volume
   if(GetVolumeNormalization())
      ProfitStability/=total_volume;
//--- we multiply by the number of deals - we aren't interested in passes which have few deals
   ProfitStability*=arr_size;
//---
   return(ProfitStability*10000.0);

Abhängig vom anfänglichen Parametern, gesetzt von der Methode SetVolumeNormalization, teilen wir den Parameter ProfitStability entweder in die Summe der gehandelten Volumina auf oder nicht. Das Ergebnis wird mit 10 000 multipliziert, um die Ergebnisse besser darstellen zu können.


4. Einbinden der Klasse CBalanceRegression

Betrachten wir den Vorgang verschiedener EAs, die Klasse CBalanceRegression einzubinden.  

4.1. Ein Expert Advisor erstellt mit dem MQL5 Wizard

Wir wollen prüfen, wie sich die Normalisierung der gehandelten Volumina auf das Ergebnis auswirkt. Das bedeutet, dass wir einen EA benötigen, der dynamisch das Volumen der offenen Positionen berechnet. Dies kann im MQL5 Wizard geschehen: Wählen Sie Expert Advisor (erstellen) und fügen Sie eines der Geldmanagementmodule auf der Seite "Geldmanagement" hinzu:

  • "Handeln mit fixer Margin" — berechnet die Lotgröße in % der freien Margin
  • "Handeln mit fixem Risiko" — berechnet die Lotgröße in % des Kontosaldos
  • "Handeln mit optimierten Handelsvolumen" — berechnet die Lotgröße in Abhängigkeit der Handelshistorie

Für diesen Artikel wählte ich das Geldmanagementmodul "Handeln mit fixem Risiko", und der EA heißt "EA test balance regression.mq5". Beispielsweise zeige ich die Einbindung der Datei mit der Klasse CBalanceRegression.

Schritt 1. Einbinden der Datei CBalanceRegression und Anlegen des Klassenobjektes (m_balance_regression).

ACHTUNG: Die Datei der Klasse CBalanceRegression sollte sich im Verzeichnis [data-Ordner]\MQL5\Include\Balance regression befinden.

//--- available money management
#include <Expert\Money\MoneyFixedRisk.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+

and

//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
CBalanceRegression m_balance_regression;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+

Schritt 2. Ergänzen eines Eingabeparameters, um das Normalisieren der Volumina zu aktivieren/deaktivieren:

input double             Money_FixRisk_Percent=10.0;                            // Percentage of risk
//--- inputs for balance normalization
input bool               InpVolumeNormalization=true;                           // Volume normalization
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+

Schritt 3. Legen Sie die Parameter für das Objekt m_balance_regression der Klasse CBalanceRegression fest: Ausgangsdaten für die Abfrage der Handelshistorie und des Modus der Normalisierung des Handelsvolumens:

//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- Initializing expert

Schritt 4. Fügen Sie die Funktion OnTester ganz am Ende der Datei hinzu. Hier erhalten wir das eigene Optimierungskriterium (durch Aufruf von GetProfitStability) und übergeben die Parameter an den Tester:

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

4.2. Der Expert Advisors auf Basis eines standardmäßigen MACD und einem gleitenden Durchschnitt

Die originalen EAs befinden sich in [Datenordner]\MQL5\Experten\Beispiele\MACD\MACD Sample.mq5 bzw. [Datenordner]MQL5\Experten\Beispiele\Moving Average\Moving Average.mq5.

Nehmen Sie die original EAs und speichern Sie ihre Kopien unter einem anderen Namen. Ich habe die Namen "MACD Sample balance regression.mq5" und "Moving Average balance regression.mq5" gewählt.

Schritt 1.  Binden Sie die Datei der Klasse CBalanceRegression ein und deklarieren Sie das Objekt dieser Klasse (m_balance_regression).

ACHTUNG: Die Datei der Klasse CBalanceRegression sollte sich im Verzeichnis [data-Ordner]\MQL5\Include\Balance regression befinden.

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
#include <Trade\AccountInfo.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;
//---
input double InpLots          =0.1; // Lots
#include <Trade\Trade.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Schritt 2. Ergänzen eines Eingabeparameters, um das Normalisieren der Volumina zu aktivieren/deaktivieren:

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
input int    InpMATrendPeriod =26;  // MA trend period
//--- inputs for balance normalization
input bool   InpVolumeNormalization=true; // Volume normalization
//---
int ExtTimeOut=10; // time out in seconds between trade operations
input int    MovingShift        = 6;       // Moving Average shift
//--- inputs for balance normalization
input bool   InpVolumeNormalization=true;  // Volume normalization
//---
int    ExtHandle=0;

Schritt 3. Legen Sie die Parameter für das Objekt m_balance_regression der Klasse CBalanceRegression fest: Ausgangsdaten für die Abfrage der Handelshistorie und des Modus der Normalisierung des Handelsvolumens:

MACD Sample balance regression.mq5  Moving Average balance regression.mq5
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters                 |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- initialize common information
  
//+------------------------------------------------------------------+
//| Initialisierungsfunktion des Experten                            |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- prepare trade class to control positions if hedging mode is active

Schritt 4. Fügen Sie die Funktion OnTester ganz am Ende der Datei hinzu. Hier erhalten wir das eigene Optimierungskriterium (durch Aufruf von GetProfitStability) und übergeben die Parameter an den Tester:

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

5. Optimierung mit EURUSD H4, kein Vorwärts-Test

Wir haben drei EAs, mit denen wir die Idee der Optimierung der Saldokurve mit der Regressionsmethode überprüfen können. Die beiden EAs ("EA Test Balance Regression.mq5" und "Moving Average Balance Regression.mq5") berechnen das Positionsvolumen dynamisch während des Handels, während "MACD Sample Balance Regression.mq5" eine fixe Lotgröße verwendet.

5.1. "EA test balance regression.mq5", EURUSD, H4, kein Vorwärts-Test

Um keine Optionen zu verpassen und das Testen zu beschleunigen, habe ich die beiden Parameter zur Optimierung gewählt - die Parametergrenzen für die Signale zum Eröffnen und Schließen der Position:

Abb. 7. EA-Fenster zur Optimierung

Pic. 7. EA-Fenster zur Optimierung

  • Test 1: Optimierung des Standardparameters "Balance + max Sharp Ratio", 
  • Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist, 
  • Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist.

5.1.1 Test 1: Optimierung der Standardparameter "Balance + max Sharp Ratio".

Einstellungen des Testers für Test 1 (Hinweis: Der Parameter "Optimierung" entspricht "Balance + max Sharpe Ratio"):

Abb. 8. Eingabefenster des Testers

Pic. 8. Eingabefenster des Testers

5.1.2. Vergleich der Testgeschwindigkeit zwischen der im lokalen Netzwerk mit zwei PC und der in der Cloud

Das lokale Netzwerk mit zwei Computern:

  1. Ein Laptop mit Quad-Core Intel Core i3-3120M @2.50GHz, 8077 MB. Es wurden nur drei der vier Agenten für den Test verwendet, das das Terminal mit den Agenten des zweiten Computers Verbindung halten muss;
  2. Ein Desktop-PC mit einem Sechskern AMD Phenom II X6 1075T Prozessor, 4058 MB. Es wurden nur vier der sechs für den Test verwendet, um die CPU nicht zu überhitzen.

Abb. 9. Optimierung im lokalen Netzwerk

Pic. 9. Optimierung im lokalen Netzwerk

Test 1 im lokalen Netzwerk dauerte 21 Minuten und 43 Sekunden.

Jetzt lösche ich die gespeicherten Testergebnisse und starte Test 1 erneut in der MQL5 Cloud Europe 1. In der Cloud, benötigte der Test 1 Minute und 9 Sekunden. Der Test kostete $0.06.

Die Ergebnisse des Tests 1, absteigend sortiert nach der Spalte "Result", die fünf besten Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 100
345 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 25 100
344 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 20 100
343 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 15 100
327 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 95

Abb. 10. Test 1, Optimierungsdurchlauf 346

Pic. 10. Test 1, Optimierungsdurchlauf 346

5.1.3. Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist,

Die Einstellungen für Test 2 (Hinweis: "Custom max" entspricht "Optimization"):

Abb. 11. Eingabefenster des Testers

Pic. 11. Eingabefenster des Testers

Die Einstellungen für Test 2 (Hinweis: "Volume normalization" ist auf 'false' gesetzt):

Abb. 12. EA-Fenster zur Optimierung

Pic. 12. EA-Fenster zur Optimierung

Die Ergebnisse des Tests 2, absteigend sortiert nach der Spalte "Result", die fünf besten Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
270 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 80
269 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 25 80
268 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 20 80
267 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 15 80
251 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 75


Abb. 13. Test 2, EURUSD H4, Optimierungsdurchlauf 270

Pic. 13. Test 2, EURUSD H4, Optimierungsdurchlauf 270

Die Optimierung durch den benutzerdefinierten Parameter "Custom max" erlaubte es uns, die Ergebnisse mit geringerer Rentabilität, aber mit kleinerem Drawdown des Kapitals (Spalte Eigenkapital DD %) zu wählen. Außerdem hat Test 2 eine kleineren Drawdown des Kapitals. Das sieht man auch visuell, wenn wir die Bilder 12 und 13 vergleichen.

5.1.4. Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist:

Die Einstellungen für Test 3 (Einstellungen sind gleich denen von Test 2):

Abb. 14. Eingabefenster des Testers

Pic. 14. Eingabefenster des Testers

Die Einstellungen für Test 2 (Hinweis: "Volume normalization" ist auf 'true' gesetzt):

Abb. 15. EA-Fenster zur Optimierung

Pic. 15. EA-Fenster zur Optimierung

In der Cloud benötigt der Test 2 Minuten und 27 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.08.

Test 3 Ergebnisse, absteigend sortiert nach der Spalte "Result", die fünf besten Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 100
345 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 25 100
344 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 20 100
343 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 15 100
327 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 95

Da der Parameter Handelsvolumen gleich 'true' im Test 3 ist, ist es dieselbe Option wie im Test 1. Dies ist eine guter Wert für den Vergleich mit die Ergebnisse der Optimierung der Saldenkurve mit der linearen Regression.

Fazit: Die Optimierung der Saldenkurve mit der linearen Regression erlaubt es, Ergebnisse auszuwählen, die nicht schlechter oder gar vergleichbar mit der Optimierungsmethode "Balance + max Sharp Ratio" sind.

5.2. "Moving Average balance regression.mq5", EURUSD H4, kein Vorwärts-Test

Die folgenden Parameter werden zur Optimierung ausgewählt:

Abb. 16. EA-Fenster zur Optimierung

Pic. 16. EA-Fenster zur Optimierung

Ich werde drei Tests mit dem EA "Moving Average balance regression" durchführen:

  • Test 1: Optimierung des Standardparameters "Balance + max Sharp Ratio", 
  • Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist, 
  • Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist.

Die Einstellungen des Tests (Währung, Ticks und Zeitintervall sind die gleichen wie auf dem Bild 5).

5.2.1. Test 1 (Optimierung des Standardparameters "Balance + max Sharp Ratio") wurde in der Cloud durchgeführt. In der Cloud dauerte der Test 1 Minute und 22 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.03.

Test 1 Ergebnisse, Ergebnisspalte absteigend sortiert, fünf beste Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
19 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 9 13
18 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 8 13
17 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 7 13
21 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 11 13
20 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 10 13

Prüfen wir den Durchlauf #19:

Abb. 17. Test 1, EURUSD H4, Optimierungsdurchlauf 19

Pic. 17. Test 1, EURUSD H4, Optimierungsdurchlauf 270

5.2.2. Test 2 (Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist) wird in der Cloud durchgeführt. In der Cloud dauert der Test 0 Minuten und 00 Sekunden, weil die Ergebnisse aus dem Cache abgeholt wurden, obwohl sie umgekehrt sind. Der gesamte Test wird in der MQL5 Cloud Europe 2 durchgeführt. Der Test kostet $0.00.

Test 2 Ergebnisse, Ergebnisspalte absteigend sortiert, fünf beste Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 14 22
140 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 13 22
139 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 12 22
142 101254.84 1037.87 25.95 2.15 2.31 0.22 101254.8 3.93 40 15 22
138 90936.41 960.67 24.02 2.09 2.08 0.21 90936.41 4.31 40 11 22

Der Durchlauf 141 ist der oberste der Tabelle (er hat das Maximum in der Spalte "Result"):

Abb. 18. Test 2, EURUSD H4, Optimierungsdurchlauf 141

Pic. 18. Test 2, EURUSD H4, Optimierungsdurchlauf 141

Im Test 2, die Optimierung der Saldenkurve zeigt bessere Ergebnisse als die Optimierung von "Balance + max Sharp Ratio".

5.2.3. Test 3 (Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung des gehandelten Volumens 'true' ist) wird in der Cloud durchgeführt. In der Cloud dauert der Test 1 Minute und 13 Sekunden. Der gesamte Test wird in der MQL5 Cloud Europe 2 durchgeführt. Die Kosten betrugen $0.05.

Test 3 Ergebnisse, absteigend sortiert nach der Spalte "Result", die fünf besten Ergebnisse:</s1>

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 14 22
140 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 13 22
139 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 12 22
142 13235.93 1037.87 25.95 2.15 2.31 0.22 13235.93 3.93 40 15 22
138 12542.95 960.67 24.02 2.09 2.08 0.21 12542.95 4.31 40 11 22

Test 3 hat die gleichen besten Optionen wie Test 2 ausgewählt. Der Parameter für die Optimierung des gehandelten Volumens, der gleich 'true' ist, hat keine Korrekturen vorgenommen.

Fazit: Die Optimierung durch den Parameter "Custom max" in beiden Tests (Test 2 und 3) schaffte es, bessere Ergebnisse als in Test 1 zu erzielen. Der Parameter für die Optimierung des gehandelten Volumens, der gleich 'true' ist, hat in Test 3 keine Korrekturen vorgenommen.

5.3. MACD Sample balance regression.mq5, EURUSD, H4, kein Vorwärts-Test

Die folgenden Parameter werden zur Optimierung ausgewählt:

Abb. 19. EA-Fenster zur Optimierung

Pic. 19. EA-Fenster zur Optimierung

Ich werde die gleichen drei Tests mit dem EA "MACD Sample balance regression" durchführen:

  • Test 1: Optimierung der Standardparameter "Balance + max Sharp Ratio"
  • Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist,
  • Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist.

Die Einstellungen des Tests (Währung, Ticks und Zeitintervall sind die gleichen wie auf dem Bild 5).

5.3.1. Test 1 (Optimierung des Standardparameters "Balance + max Sharp Ratio") wurde in der Cloud durchgeführt. In der Cloud dauert der Test 3 Minuten und 55 Sekunden (die Zeit ist vergleichsweise groß, da die Aufgabe nicht auf einigen langsamen Agenten ausgeführt wurde, daher wurden 10 Aufgaben auf andere Agenten verteilt). Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.04.

Test 1 Ergebnis:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

Es gibt nur sehr wenige Positionen (von 13 bis 16) zu diesem Zeitpunkt. Ich hoffe, dass es mehr Positionen mit einem niedrigeren Zeitrahmen (M15) geben wird. Diese Tests sind in einem weiteren Abschnitt unten aufgeführt. Im Moment ist das beste Ergebnis #163:

Abb. 20. Test 1, EURUSD H4, Optimierungsdurchlauf 163

Pic. 20. Test 1, EURUSD H4, Optimierungsdurchlauf 163

5.3.2. Test 2 (Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist) wird in der Cloud durchgeführt. In der Cloud dauert der Test 0 Minuten und 00 Sekunden, weil die Ergebnisse aus dem Cache abgeholt wurden, obwohl sie umgekehrt sind. Der gesamte Test wird in der MQL5 Cloud Europe 2 durchgeführt. Der Test kostet $0.00.

Test 2 Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

Test 2 erzielte die gleichen besten Ergebnisse (vergleiche alle Spalten außer Result) wie Test 1. 

5.3.3. Test 3 (Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung des gehandelten Volumens 'true' ist) wird in der Cloud durchgeführt. In der Cloud dauerte der Test 1 Minute und 5 Sekunden. Der gesamte Test wird in der MQL5 Cloud Europe 2 durchgeführt. Die Kosten betrugen $0.05.

Test 3 Ergebnisse:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 50
136 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 45
109 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 40
82 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 35
55 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 30
Test 3 erzielte die gleichen besten Ergebnisse (vergleiche alle Spalten außer Result) wie in Test 1 und 2.

Die Optimierung der Saldenkurve mit der linearen Regression funktioniert wie bei der Methode "Balance + max Sharp Ratio".


6. Optimierung mit EURUSD M15 mit Vorwärts-Test

Wir haben die gleichen drei EAs: "EA Test Balance Regression.mq5", "Moving Average Balance Regression.mq5" und "MACD Sample Balance Regression.mq5". Im Gegensatz zu den vorherigen Tests testen wir nun auf M15 mit aktiviertem Vorwärts-Test.

6.1. "EA Test Balance Regression.mq5", vorwärts Test. Ich werde drei Tests durchführen:

  • Test 1: Optimierung der Standardparameter "Balance + max Sharp Ratio"
  • Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist,
  • Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist.

6.1.1. Test 1: Optimierung der Standardparameter "Balance + max Sharp Ratio". Eingabefenster des Testers:

Abb. 21. Eingabefenster des Testers

Abb. 21. Eingabefenster des Testers

Die Parameter des EAs im Testers sind identisch mit denen der Abb. 7.

In der Cloud benötigt der Test 2 Minuten und 14 Sekunden. Der gesamte Test wird in der MQL5 Cloud Europe 2 durchgeführt. Die Kosten betrugen $0.08.

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
352 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 4 100
351 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 100
333 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 4 95
332 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 95
314 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 4 90

Abb. 22. Test 1, EURUSD M15, Optimierungsdurchlauf 352

Pic. 22. Test 1, EURUSD M15, Optimierungsdurchlauf 352

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 80
283 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 95 80
282 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 90 80
281 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 85 80
265 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 75

Jetzt ist die beste Einstellung so, dass es nur 10 Positionen im Vorwärts-Test gibt. Das ist natürlich nicht genug, aber wir müssen noch einen Test durchzuführen:

Abb. 23. Test 1, EURUSD M15, Vorwärtsdurchlauf 285

Pic. 23. Test 1, EURUSD M15, Vorwärtsdurchlauf 284

6.1.2. Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist,

Beste Ergebnisse der Optimierung (kein Vorwärts-Test):

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 80
283 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 95 80
282 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 90 80
281 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 85 80
265 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 75

Abb. 24. Test 2, EURUSD M15, Optimierungsdurchlauf 284

Pic. 24. Test 2, EURUSD M15, Optimierungsdurchlauf 352

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 80
283 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 95 80
282 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 90 80
281 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 85 80
265 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 75

In Test 2 zeigt die Vorwärtsprüfung die gleichen Ergebnisse wie in Test 1.

Durch die Optimierung der Saldenkurve mit der Methode der linearen Regression in Test 2 konnten wir Ergebnisse ermitteln, die nicht schlechter sind als in Test 1 (Methode "Balance + max Sharp Ratio").

6.1.3. Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'true' ist. In der Cloud dauert der Test 3 Minuten und 29 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.07.

Beste Ergebnisse der Optimierung (kein Vorwärts-Test):

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
208 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 4
207 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 95 4
206 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 90 4
205 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 85 4
189 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 55


Abb. 25. Test 3, EURUSD M15, Optimierungsdurchlauf 208

Pic. 25. Test 3, EURUSD M15, Optimierungsdurchlauf 208

Die Ermöglichung der "Normalisierung der gehandelten Volumina" hatte keinen wesentlichen Einfluss auf das Ergebnis. Auch wurde eines der besten Ergebnisse wurde innerhalb des optimierten Intervalls gefunden.

Die besten Ergebnisse des Vorwärts-Test:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
266 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 80
247 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 75
228 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 70
209 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 65
156 -120.35 -29.28 -8013.01 -22.76 0.63 -1.00 -0.13 -120.35 80.44 352 30 50

Der Vorwärts-Test in Test 3 (der Parameter für die Optimierung des gehandelten Volumens ist 'true') zeigt NUR NEGATIVE Ergebnisse an (siehe Spalte "Forward Result"). Dies ist ein gutes Ergebnis für die Optimierung des Saldenkurve mit der linearen Regression, da die genauesten und realistischsten Ergebnisse für den Vorwärts-Test ausgewählt wurden.

Durch die Optimierung der Saldenkurve mittels der linearen Regression (der Parameter für die Optimierung der gehandelten Volumina ist 'false') können Ergebnisse erzielt werden, die mit der Methode "Balance max + Sharp Ratio" vergleichbar sind). Wenn der Parameter für die Optimierung des gehandelten Volumens 'true' ist, zeigen die Ergebnisse des Vorwärts-Tests das tatsächliche Testbild in diesem Zeitraum an.

6.2. "MACD Sample balance regression.mq5", Vorwärts-Test

6.2.1. Test 1: Optimierung des standardmäßigen Parameters "Balance + max Sharp Ratio" in der Cloud. In der Cloud dauerte der Test 1 Minute und 3 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.06.

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
171 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 50
144 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 45
182 2078.33 489.23 8.74 1.82 2.07 0.20 -9.9625 2.29 56 120 50
155 2077.49 489.03 8.73 1.82 2.07 0.20 -9.90369 2.29 56 120 45
181 2066.17 484.13 8.65 1.81 2.05 0.20 -8.1109 2.29 56 115 50


Abb. 26. Test 1, EURUSD M15, Optimierungsdurchlauf 171

Abb. 26. Test 1, EURUSD M15, Optimierungsdurchlauf 171

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 -44.8452 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 -53.5369 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 -26.6428 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 -62.5775 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -347.982 1.70 16 65 50


Abb. 27. Test 1, EURUSD M15, Vorwärtsdurchlauf 78

Abb. 27. Test 1, EURUSD M15, Vorwärtsdurchlauf 78

6.2.2. Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist,

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 50
141 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 45
114 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 40
167 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 50
140 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 45


Abb. 28. Test 2, EURUSD M15, Optimierungsdurchlauf 168

Abb. 28. Test 2, EURUSD M15, Optimierungsdurchlauf 168

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 6462.158 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 5018.77 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 5617.275 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 3525.665 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -5131.93 1.70 16 65 50

Abb. 29. Test 2, EURUSD M15, Vorwärtsdurchlauf 78

Abb. 29. Test 2, EURUSD M15, Vorwärtsdurchlauf 78

Die Optimierung der Saldenkurve mit der Regressionsmethode in Test 2 ergab vergleichbare Ergebnisse wie die Methode "Balance + max Sharp Ratio".

6.2.3. Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina, der auf 'true' gesetzt ist, in der Cloud ausgeführt wird. In der Cloud dauert der Test 1 Minute und 44 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.08.

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 50
141 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 45
114 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 40
167 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 50
140 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 45

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 4038.85 13138.16 83.87 5.24 1.43 0.42 0.12 4038.849 1.95 16 140 30
105 3510.80 13026.26 78.17 4.89 1.40 0.39 0.11 3510,797 1.96 16 140 35
77 3136.73 13138.16 78.87 4.93 1.41 0.40 0.11 3136.731 1.95 16 135 30
132 3074.09 13598.05 73.17 4.57 1.38 0.37 0.10 3074.089 1.96 16 140 40
159 2658.84 13777.31 68.47 4.28 1.35 0.35 0.10 2658.844 1.96 16 140 45
In Test 3 entsprechen die Optimierungs- und Vorwärts-Ergebnisse voll und ganz denen von Test 2 - der Optimierungsparameter für gehandelte Volumina entspricht 'true' und hat in Test 3 keine signifikanten Auswirkungen. Dies liegt daran, dass der EA "MACD Sample Balance-Regression.mq5" eine konstante Lotgröße handelt.

Die Optimierung der Saldenkurve mit der linearen Regression hat sich als vergleichbar mit der Standard-Methode "Balance max + Sharp Ratio" erwiesen.

6.3. Der EA "Moving Average balance regression.mq5", Vorwärts-Test

6.3.1. Test 1: Optimierung der Standardparameter "Balance + max Sharp Ratio". Die Parameter des Testers sind ähnlich mit denen der Abb. 15. und die für den EA ähnlich denen der Abb. 23.

In der Cloud dauert der Test 1 Minute und 28 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.05.

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
165 -6.17 -24.02 -0.05 0.99 -0.03 0.00 -37045.4 6.66 465 12 24
166 -26.36 -49.14 -0.11 0.99 -0.07 0.00 -38052.8 6.86 465 13 24
163 -39.47 -61.88 -0.13 0.98 -0.09 0.00 -39156.1 6.62 465 10 24


Abb. 30. Test 1, EURUSD M15, Optimierungsdurchlauf 53

Abb. 30. Test 1, EURUSD M15, Optimierungsdurchlauf 53

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 409.74 -460.18 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 364.79 -461.14 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 362.45 -460.40 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 353.14 -467.05 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 350.60 -629.53 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15


Abb. 31. Test 1, EURUSD M15, Vorwärtsdurchlauf 48

Abb. 31. Test 1, EURUSD M15, Vorwärtsdurchlauf 48

6.3.2. Test 2: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina 'false' ist. 

Ergebnisse der Optimierung: 

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
54 2465.75 -103.27 -0.20 0.96 -0.14 -0.01 2465.748 7.19 525 5 16
57 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 8 16
56 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 7 16

Vorwärts-Ergebnisse:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 42602.76 -73708.28 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 38508.36 -74600.92 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 38292.53 -74386.41 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 37460.15 -75315.40 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 32767.39 -107616.36 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15
Die Optimierung des Saldenkurve mit der linearen Regression in Test 2 ergab die gleichen Ergebnisse wie in Test 1.

6.3.3. Test 3: Optimierung des benutzerdefinierten Parameters "Custom max", während der Parameter für die Optimierung der gehandelten Volumina, der auf 'true' gesetzt ist, in der Cloud ausgeführt wird. In der Cloud benötigt der Test 0 Minuten und 42 Sekunden. Der gesamte Test lief in der MQL5 Cloud Europe 1. Die Kosten betrugen $0.04. 

Ergebnisse der Optimierung:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 4 16
52 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 3 16
54 45.69 -103.27 -0.20 0.96 -0.14 -0.01 45.68738 7.19 525 5 16
57 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 8 16
56 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 7 16

Vorwärts-Ergebnisse: 

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 1772.90 -997.81 185.78 1.06 1.16 0.80 0.04 1772.899 2.26 175 12 15
49 1591.91 -994.94 165.23 0.94 1.14 0.67 0.04 1591.912 2.41 175 13 15
50 1577.12 -987.34 164.15 0.94 1.14 0.66 0.04 1577.123 2.42 175 14 15
51 1537.14 -972.44 159.83 0.91 1.13 0.65 0.03 1537.142 2.42 175 15 15
47 1473.35 -1540.90 144.32 0.82 1.13 0.65 0.03 1473.354 2.17 175 11 15

Die Optimierung der Saldenkurve mit der linearen Regression in Test 3 wiederholt die Ergebnisse von Test 1 vollständig. Mit anderen Worten, die Optimierung der gehandelten Volumina hat keinen Einfluss auf das Ergebnis, obwohl der EA "Moving Average balance regression.mq5" die Lotgröße der Positionen dynamisch berechnet.

Die Optimierung der Saldenkurve mit der linearen Regression hat sich als vergleichbar mit der Standard-Methode "Balance max + Sharp Ratio" erwiesen.


7. Schlussfolgerung

Die Ergebnisse der Optimierung der Saldenkurve mit der linearen Regression hat sich als gleichwertig zur Optimierung nach "Balance + max Sharp Ratio" herausgestellt. Die EAs mit dynamischem Lot haben interessante Ergebnisse gezeigt: In einigen Fällen ergibt die Einstellung "traded volumes normalization" in Verbindung mit einem Vorwärts-Test ein realistischeres Bild.

Ich glaube, die beschriebene Methode hat das Recht zu existieren, und sie kann weiter verbessert werden, zum Beispiel durch die Betrachtung der Dauer von profitablen und verlustbringenden Handelsgeschäften und das Experimentieren mit den erhaltenen Werten.