MetaTrader 5 herunterladen

Ein Beispiel für die Entwicklung einer Spread-Strategie basierend auf Futures der Moskauer Börse

29 Dezember 2016, 10:19
MetaQuotes Software Corp.
0
300


Negative Korrelation der Symbole Si und RTS

An der Moskauer Börse werden Futures vom Typ Si-M.Y und RTS-M.Y gehandelt, die relativ eng miteinander verbunden sind. Hier bezeichnen M.Y das Ablaufdatum des Kontrakts:

  • M — Nummer des Monats
  • Y — zwei letzte Ziffern des Jahres

Si ist ein Terminkontrakt auf dem Kurs US-Dollar/Russischer Rubel, RTS ist ein Terminkontrakt auf den RTS-Index in US-Dollar. Da der RTS-Index Aktien russischer Unternehmen beinhaltet, deren Preise in Rubel sind, wirken sich die Schwankungen des USD/RUR Kurses auch auf die Schwankungen des Index in US-Dollar aus. Auf den Charts dieser Symbole sieht man: während ein Vermögenswert steigt, fällt der andere.


Für eine bessere Vorstellung haben wir auf beiden Charts den Kanal der Standardabweichung angezeigt.


Berechnen wir die lineare Regression zwischen Si und RTS

Die Abhängigkeit zwischen diesen zwei Vermögenswerten kann anhand der Gleichung der linearen Regression Y(X)=A(X)+B dargestellt werden. Für die Überprüfung schreiben wir das Skript CalcShowRegression_script.mq5, das mit zwei Arrays der Schlusskurse arbeitet, Koeffizienten berechnet und ein Verteilungsdiagramm mit der Regressionslinie direkt auf dem Chart anzeigt.

Für die Berechnung der Koeffizienten der Regression wird eine Funktion aus der ALGLIB Bibliothek verwendet, und das Zeichnen erfolgt mithilfe grafischer Klassen der Standardbibliothek.



Zeichnen wir den Spread-Indikator zwischen Si und RTS

Wir haben die Koeffizienten der linearen Regression erhalten, nun können wir eine synthetische Grafik vom Typ Y(RTS) = A*RTS+B zeichnen. Bezeichnen wir die Differenz zwischen dem originellen Vermögenswert und der synthetischen Reihe als Spread. Diese Differenz wird sich auf jedem Balken ändern, von positiven bis negativen Werten.

Für die visuelle Darstellung des Spreads schreiben wir den Indikator TwoSymbolsSpread_Ind.mql5, der den Spread auf den Daten der letzten 500 Balken als Histogramm ausgibt. Positive Werte werden blau, negative - gelb dargestellt.


Der Indikator aktualisiert die Koeffizienten der linearen Regression beim Eröffnen jedes neuen Balkens und schreibt sie ins Experten-Journal. Dabei wartet er, bis sich eine neue Kerze auf beiden Symbolen, Si und RTS, öffnet. Auf diese weise lässt der Indiaktor die Korrektheit und die Genauigkeit der Berechnungen kontrollieren.


Zeichnen wir die Grafik der linearen Regression auf dem Spread-Chart für die letzten 100 Balken

Der Srpead-Indikator zeigt, dass sich die Differenz zwischen dem Future Si und dem synthetischen Symbol regelmäßig ändert. Um die aktuelle Tendenz einzuschätzen, schreiben wir den Indikator SpreadRegression_Ind.mq5 (Spread und lineare Regression), der die Trendlinie auf dem Spread-Chart zeichnet. Die Parameter der Linie berechnen wir wieder nach der Methode der linearen Regression. Zeigen wir beide Indikatoren auf dem Chart für Debugging an.

Die rote Trendlinie ändert die Steigung je nach dem Spread-Wert auf den letzten 100 Balken. Im Grunde genommen haben wir das Minimum benötigter Daten, um zu versuchen ein Handelssystem zu erstellen.


Strategie 1 — Änderung der Steigung der linearen Regression auf dem Spread-Chart

Die Spread-Werte werden im Indikator TwoSymbolsSpread_Ind.mql5 als Differenz zwischen Si und Y(RTS)=A*RTS + B berechnet. Sie können das ganz einfach prüfen, indem Sie den Indikator im Debugging-Modus (F5) starten.


Erstellen wir einen einfachen Expert Advisor, der die Änderung des Steigungswinkels der an den Spread-Chart angewandten linearen Regression verfolgt. Der Steigungswinkel der Linie ist nichts anderes als der Koeffizient A in der Gleichung Y=A*X+B. Bei einem positiven Trend auf dem Spread-Chart: A>0, bei einem negativen A<0. Die lineare Regression wird auf den letzten 100 Werten des Spread-Charts berechnet. Hier ist ein Codeteil aus dem Expert Advisor Strategy1_AngleChange_EA.mq5.

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Typ der Spread-Strategie                                            |
//+------------------------------------------------------------------+
enum SPREAD_STRATEGY
  {
   BUY_AND_SELL_ON_UP,  // Buy 1-st, Sell 2-nd
   SELL_AND_BUY_ON_UP,  // Sell 1-st, Buy 2-nd
  };
//---
input int       LR_length=100;                     // Anzahl der Balken für die Regression auf dem Spread
input int       Spread_length=500;                 // Anzahl der Balken für die Berechnung des Spreads
input ENUM_TIMEFRAMES  period=PERIOD_M5;           // Timeframe
input string    symbol1="Si-12.16";                // das erste Symbol des Paars
input string    symbol2="RTS-12.16";               // das zweite Symbol des Paars
input double    profit_percent=10;                 // wie viele Prozente des Profits werden festgeschrieben
input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // Typ der Spread-Strategie
//--- Handles der Indikatoren
int ind_spreadLR,ind,ind_2_symbols;
//--- Klasse für Handelsoperationen
CTrade trade;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- der Koeffizient A der Steigung der linearen Regression auf dem Spread-Chart Y(X)=A*X+B
   static double Spread_A_prev=0;
   if(isNewBar())
      PrintFormat("Neuer Balken %s hat sich %s eröffnet",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- warten wir, bis die Daten des Indikators aktualisiert werden, wenn er auf zwei Symbolen arbeitet
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- erhalten wir den Wert der linearen Regression auf dem Spread-Chart für Balken mit dem Index 1 und 2 ("gestern" und "vorgestern")
      double LRvalues[];
      double Spread_A_curr;
      int copied=CopyBuffer(ind_spreadLR,1,1,2,LRvalues);
      if(copied!=-1)
        {
         //--- Koeffizient der linearen Regression auf dem letzten vollständigen ("gestrigen") Balken
         Spread_A_curr=LRvalues[1]-LRvalues[0];
         //--- wenn sich die Steigung der Regression geändert hat, dann ist das Produkt der aktuellen und der vorherigen kleiner als Null
         if(Spread_A_curr*Spread_A_prev<0)
           {
            PrintFormat("Die LR Linie hat die Steigung geändert, Spread_A_curr=%.2f, Spread_A_prev=%.2f: %s",
                        Spread_A_curr,Spread_A_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- wenn keine offenen Positionen vorhanden sind, steigen wir mit zwei Symbolen in den Markt ein
            if(PositionsTotal()==0)
               DoTrades(Spread_A_curr-Spread_A_prev>0,strategy,symbol1,1,symbol2,1);
            //--- offene Positionen sind vorhanden, umkehren
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- der Steigungsswinkel hat sich nicht geändert, prüfen wir die den nicht realisierten Gewinn - vielleicht ist es höchste Zeit, Positionen zu schließen?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- wenn der benötigte Level des nicht realisierten Gewinns erreicht ist - festschreiben
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- speichern wir die Richtung des Trends für einen Vergleich beim Eröffnen eines neuen Balkens
         Spread_A_prev=Spread_A_curr;
        }
     }
  }

Um keine Vermutungen zu machen, was bei einer Trendwende kaufen und was verkaufen, haben wir einfach einen externen Parameter in den Expert Advisor hinzugefügt, der Handelsregeln "umdrehen" kann:

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // Typ der Spread-Strategie

Nun können wir das Testen und Debuggen des Expert Advisors starten.


Testen der Handelsstrategie 1

Für das Debuggen einer neuen Strategie ist am besten der Visualisierungsmodus zu verwenden. Geben Sie dafür alle benötigten Daten über das Menü Extras-Optionen Debugging an:

  1. Symbol
  2. Timeframe
  3. Testintervall
  4. Handelsmodus
  5. Einlage
  6. Modus der Tickgenerierung

Für börsengehandelte Produkte ist der Modus "Jeder Tick anhand realer Ticks" zu empfehlen. In diesem Fall wird das Testen an den historischen Daten durchgeführt, und Sie erhalten Ergebnisse, die maximal nah an echten Handelsbedingungen sind.

Der MetaTrader 5 Handelsserver speichert automatisch alle von der Börse eingetroffenen Ticks und lädt die ganze Tick-Historie ins Terminal hoch.


In diesem Debugging Modus können Sie den ganzen Test visuell verfolgen und die Werte jeder Variablen an den benötigten Stellen im Code mithilfe von Break Points überprüfen. Die im Handeslsroboter verwendeten Indikatoren werden auf die Charts automatisch hochgeladen, man muss manuell nichts machen.


Nachdem der Code des Expert Advisors debuggt wurde, können wir die Parameter optimieren.


Optimierung der Handelsstrategie 1

Im Expert Advisor Strategy1_AngleChange_EA.mq5 gibt es mehrere externe Parameter, die man anhand der Optimierung anpassen kann (gelb hervorgehoben):

input int       LR_length=100;                     // Anzahl der Balken für die Regression auf dem Spread
input int       Spread_length=500;                 // Anzahl der Balken für die Berechnung des Spreads
input double    profit_percent=10;                 // wie viele Prozente des Gewinns werden festgeschrieben

input SPREAD_STRATEGY strategy=SELL_AND_BUY_ON_UP; // Typ der Spread-Strategie

Wir werden aber nur den Parameter profit_percent für zwei Varianten der Strategie optimieren, um zu verstehen, ob sie sich voneinander unterscheiden. Mit anderen Worten: Wir schreiben den Wert des Parameters strategy fest und optimieren den Parameter profit_percent von 0.2 auf 3.0%, um das Gesamtbild für zwei Trading Strategien auf Basis der Änderung der Steigung der Linie zu sehen.

Für die Regel BUY_AND_SELL_ON_UP (ersten Vermögenswert kaufen, zweiten - verkaufen), bei der sich die Steigung der Linie von einem negativen Wert in einen positiven ändert, sind die Ergebnisse der Optimierung nicht besonders gut. Im Allgemeinen bietet ein solcher Einstieg in den Markt keine attraktive Perspektive, häufiger erzielen wir Verluste beim Testen in einem zweimonatigen Zeitraum.


Bei der Verwendung der Regel SELL_AND_BUY_ON_UP (ersten Vermögenswert verkaufen, zweiten kaufen) sind die Optimierungsergebnisse besser — 5 aus 15 Durchläufe der Optimierung zeigen Profite.


Die Optimierung wurde anhand der Historie vom 1. August bis zum 30. September 2016 (zwei Monate) durchgeführt. Im Großen und Ganzen sehen die beiden Varianten der Strategie nicht besonders viel versprechend aus. Wahrscheinlich liegt es daran, dass wir einen relativ verzögerten Indikator verwendet haben — Steigung der Trendlinie für die letzten 100 Balken. Versuchen wir, eine zweite Variante der Strategie zu entwickeln.


Strategie 2 — Vorzeichenwechsel des Spreads auf einem vollständigen Balken

In der zweiten Strategie werden wir den Vorzeichenwechsel des Spreads verfolgen. Wir werden die Werte nur auf vollständigen Balken prüfen, d.h. beim Eröffnen eines neuen "heutigen" Balkens. Wenn der Spread auf dem "vorgestrigen" Balken negativ war, und auf dem "gestrigen" positiv geworden ist, gehen wir davon aus, dass sich der Spread nach oben (UP) umgedreht hat. Der Code bietet die Möglichkeit, bei der Änderung des Spreads in jede Richtung zu handeln: wir können die Richtung des Einstiegs mithilfe des strategy Parameters umkehren. Hier ist der Codeblock des Expert Advisors Strategy2_SpreadSignChange_EA.mq5:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- der vorherige Spread-Wert als Differenz von Symbol1 und Y(Symbol2)=A*Symbol2+B
   static double Spread_prev=0;
   if(isNewBar())
      PrintFormat("Neuer Balken %s öffnete sich um %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- warten wir, bis die Daten des Indikators aktualisiert werden, denn er arbeitet auf zwei Symbolen
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
S     {
      //--- erhalten wir die Spread-Werte für die Balken mit dem Index 1 und 2 ("gestern" und "vorgestern")
      double SpreadValues[];
S      int copied=CopyBuffer(ind_spreadLR,0,1,2,SpreadValues);
      double Spread_curr=SpreadValues[1];
      if(copied!=-1)
        {
         //--- wenn sich das Vorzeichen des Spreads geändert hat, ist das Produkt des aktuellen und des vorherigen Balkens kleiner als Null
         if(Spread_curr*Spread_prev<0)
           {
            PrintFormat("Der Spread hat das Vorzeichen geändert, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- wenn keine offenen Positionen vorhanden sind, steigen wir mit zwei Symbolen in den Markt ein
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- es sind offene Positionen vorhanden, umkehren
            else
               ReverseTrades(symbol1,symbol2);
           }
         //--- das Vorzeichen des Spreads hat sich nicht geändert, prüfen wir den nicht realisierten Gewinn - vielleicht ist es höchste Zeit zu schließen?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- wenn der benötigte Level des nicht realisierten Gewinns erreicht ist - festschreiben
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
              }
           }
         //--- speichern wir die Richtung des Spreads, um diese beim Eröffnen eines neuen Balkens zu vergleichen
         Spread_prev=Spread_curr;
        }
     }
  }

Zuerst debuggen wir den Roboter im visuellen Testmodus, dann starten wir die Optimierung nach dem Parameter profit_percent, wie wir das auch für die erste Strategie getan haben. Die Ergebnisse:



Wie wir sehen, liefert die Regel "Ersten Vermögenswert kaufen, zweites verkaufen" für die zweite Strategie genauso schlechte Testergebnisse wie für die erste. Dabei gibt es mehr Verluste bei allen Durchläufen.

Versuchen wir, eine dritte Variante der Strategie zu entwickeln.


Strategie 3 — Vorzeichenwechsel des Spreads auf dem aktuellen Balken mit der Bestätigung auf N-Ticks

Die zwei vorherigen Strategien haben nur beim Eröffnen eines Balkens funktioniert, d.h. sie haben Änderungen nur auf vollständigen Balken analysiert. Versuchen wir nun, innerhalb des aktuellen Balkens zu arbeiten. Analysieren wir Änderung des Spreads auf jedem Tick. Wenn sich die Vorzeichen des Spreads auf dem vollständigen und dem aktuellen Balken voneinander unterscheiden, dann gehen wir davon aus, dass sich die Spread-Richtung geändert hat.

Der Vrozeichenwechsel des Spreads muss auf den letzten N Ticks stabil bleiben, auf diese Weise versuchen wir falsche Signale auszuschließen. Fügen wir den externen Parameter ticks_for_trade=10 in den Expert Advisor hinzu. Wenn das Vorzeichen des Spreads auf den letzten 10 Ticks negativ war, und auf dem vorherigen Balken - positiv, dann steigen wir in den Markt ein. Die OnTick() Funktion des Expert Advisors Strategy3_SpreadSignOnTick_EA.mq5 sieht wie folgt aus.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Neuer Balken %s öffnete sich um %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- warten wir, bis die Daten des Indikators aktualisiert werden, denn er arbeitet auf zwei Symbolen
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- erhalten wir den Spread-Wert an dem aktuellen ("heute") und dem vorherigen ("gestern") Balken
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,2,SpreadValues);
      double Spread_curr=SpreadValues[1]; // Spread auf dem aktuellen Balken
      double Spread_prev=SpreadValues[0]; // Spread auf dem vorherigen vollständigen Balken
      if(copied!=-1)
        {
         //--- wenn die Änderung des Vorzeichens auf den letzten ticks_for_trade Ticks bestehen bleibt
         if(SpreadSignChanged(Spread_curr,Spread_prev,ticks_for_trade))
           {
            PrintFormat("Der Spread hat das Vorzeichen geändert, Spread_curr=%.2f, Spread_prev=%.2f: %s",
                        Spread_curr,Spread_prev,TimeToString(TimeCurrent(),TIME_SECONDS));
            //--- zeigen wir die Werte der letzten ticks_for_trade Ticks für beide Symbole an
            ShowLastTicksComment(ticks_for_trade);
            //--- wenn keine offenen Positionen vorhanden sind, steigen wir mit zwei Symbolen in den Markt ein
            if(PositionsTotal()==0)
               DoTrades(Spread_curr>0,strategy,symbol1,1,symbol2,1);
            //--- offene Positionen sind vorhanden, umkehren
            else
               ReverseTrades(Spread_curr>0,positionstype,symbol1,symbol2);
           }
         //--- das Vorzeichen des Spreads hat sich nicht geändert, überprüfen wir den nicht realisierten Gewinn, vielleicht ist es höchste Zeit, Positionen zu schließen?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- wenn der benötigte Level des nicht realisierten Gewinns erreicht ist - festschreiben
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
   }

In diesem Expert Advisor haben wir die Funktionen ShowLastTicksComment() hinzugefügt, die beim Eintreffen eines Signals Werte der letzten N Ticks für beide Symbole auf dem Chart anzeigt. So können wir die Strategie visuell testen und die Tickänderungen genau bis auf die Millisekunde sehen.


Starten wir die gleichen Optimierungen wie in den vorherigen Strategien, und wir erhalten die folgenden Ergebnisse:

"1. Vermögenswert kaufen und 2. verkaufen"


"1. Vermögenswert verkaufen und 2. kaufen"


Die Ergebnisse haben sich bei so einer einfachen Optimierung nicht besonders verbessert.


Strategie 4 — der Spread erreicht einen vorgegebenen Wert in Prozent

Erstellen wir die vierte, die letzte Strategie. Sie wird genauso einfach wie die letzten drei sein: Ein Handelssignal wird in dem Moment generiert, wenn der Spread einen vorgegebenen Wert in Prozent vom Preis des ersten Vermögenswertes beträgt — spread_delta. Der Handler eingehender Ticks OnInit() hat sich nur leicht geändert, hier ist der Code aus dem Expert Advisor Strategy4_SpreadDeltaPercent_EA.mq5.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(isNewBar())
      PrintFormat("Neuer Balken %s öffnete sich um %s",_Symbol,TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- warten wir, bis die Daten des Indikators aktualisiert werden, denn er arbeitet auf zwei Symbolen
   if(BarsCalculated(ind_spreadLR)==Bars(_Symbol,_Period))
     {
      //--- erhalten wir den Spread-Wert auf dem aktuellen ("heute") Balken
      double SpreadValues[];
      int copied=CopyBuffer(ind_spreadLR,0,0,1,SpreadValues);
      double Spread_curr=SpreadValues[0]; // Spread auf dem aktuellen sich bildenden Balken
      if(copied!=-1)
        {
         MqlTick tick;
         SymbolInfoTick(symbol1,tick);
         double last=tick.last;
         double spread_percent=Spread_curr/last*100;
         //--- wenn der Spread in Prozent den vorgegebenen spread_delta Wert erreicht hat
         if(MathAbs(spread_percent)>=spread_delta)
           {
            PrintFormat("Der Spread hat %.1f%% (%G) %s erreicht",
                        spread_percent,TimeToString(TimeCurrent(),TIME_SECONDS),
                        Spread_curr);
            //--- wenn keine offenen Positionen vorhanden sind, steigen wir in den Markt mit zwei Symbolen ein
            if(PositionsTotal()==0)
               DoTrades(Spread_curr,strategy,symbol1,1,symbol2,1);
            //--- offene Positionen sind vorhanden, umkehren
            else
               ReverseTrades(Spread_curr,positionstype,symbol1,symbol2);
           }
         //--- der Spreadwert liegt innerhalb des zulässigen Bereichs, prüfen wir den nicht realisierten Gewinn, vielleicht ist es Zeit, zu schließen?
         else
           {
            double profit=AccountInfoDouble(ACCOUNT_PROFIT);
            double balance=AccountInfoDouble(ACCOUNT_BALANCE);
            if(profit/balance*100>=profit_percent)
              {
               //--- der benötigte Level des nicht realisierten Gewinns wurde erreicht - festschreiben
               trade.PositionClose(symbol1);
               trade.PositionClose(symbol2);
               positionstype=0;
              }
           }
        }
     }
  }

Wir werden Positionen auch beim Erreichen des vorgegebenen Prozents vom Gewinn profit_percent=2 schließen, diesmal legen wir das Prozent fest. Starten wir die Optimierung nach dem Parameter spread_delta im Bereich von 0.1 bis 1%.

"1. Vermögenswert kaufen und 2. verkaufen"


"1. Vermögenswert verkaufen und 2. kaufen"


Diesmal sieht die erste Regel "1. Vermögenswert kaufen und 2. verkaufen" viel besser als die zweite aus. Die Optimierung nach anderen Parametern können Sie selbst durchführen.


MetaTrader 5 —  Entwicklungsumgebung für Handelsstrategien

In diesem Artikel haben wir vier einfache Strategien für Spread-Handel vorgestellt. Die erhaltenen Ergebnisse des Testens und der Optimierung dürfen nicht als Anleitung zum Handeln wahrgenommen werden, denn sie wurden in einem begrenzten Zeitraum erhalten und können in gewisser Weise zufällig sein. In diesem Artikel haben wir gezeigt, wie man Trading-Ideen in MetaTrader 5 einfach testen und debuggen kann.

Für Entwickler automatischer Handeslssysteme bietet der MetaTrader 5 Strategietester die folgenden Möglichkeiten:

  • automatisches Herunterladen der Tick-Historie für alle im Expert Advisor verwendeten Symbole,
  • visuellen Debugging-Modus für Strategien und Indikatoren mit Anzeige von Trades, Handelshistorie und Experten-Journals,
  • automatisches Starten der im Expert Advisor verwendeten Indikatoren im visuellen Testmodus auf dem Chart,
  • Testen von Strategien anhand realer Tick-Daten mit der Nachbildung der echten Handelsumgebung,
  • eine Multi-Thread-Optimierung von Parametern mit der Möglichkeit, eine eigene Zielfunktion vorzugeben,
  • Verwendung von tausenden Testagenten für die Beschleunigung der Optimierung,
  • Visualisierung der Optimierungsergebnisse nach Ihren Regeln,
  • Testen von Strategien, die auf mehreren Finanzinstrumenten handeln, mit einer Synchronisierung von Ticks bis auf die Millisekunde
  • Debugging von Strategien während des Testens — man kann Break Points setzen, um Werte der benötigten Variablen anzusehen und den Programmcode schrittweise zu prüfen.

Der Strategietester wurde in diesem Artikel als Werkzeug für die Ermittlung und Suche der richtigen Richtung verwendet: Es wurde Optimierung nach einem Parameter durchgeführt, um Ergebnisse schnell zu bekommen. Sie können neue Regeln hinzufügen, die aktuellen ändern sowie eine totale Optimierung von resultierenden Expert Advisors durchführen. Um die Berechnungen zu beschleunigen, verwenden Sie das globale Rechnernetz MQL5 Cloud Network, das extra für die MetaTrader 5 Plattform erstellt wurde.


Hinweise zu Strategien

Gewöhnlich werden bei der Suche nach Symbolen nicht absolute Werte des Preises, sondern Inkremente verwendet. D.h. statt Close[i] wird Delta[i]=Close[i]-Close[i-1] berechnet.

Für einen ausgeglichenen Handel muss das Volumen für jedes Symbol des Spreads einzeln ausgewählt werden. Im Artikel wurde beim Testen die Positionsgröße von einem Lot für jedes Symbol verwendet.

Beim Testen werden aktuelle Einstellungen in den Kontraktspezifikation von Si und RTS verwendet. Es ist zu beachten, dass:

  • RTS-12.16 Futures auf dem US-Dollar basiert,
  • der Tick-Preis des RTS-12.16 Futures jeden Tag durch die Moskauer Börse vorgegeben wird
  • und dieser Wert 0.2 vom indikativen Dollar-Kurs beträgt.


Die Berechnungsmethode finden Sie auf der Webseite MOEX — http://fs.moex.com/files/3244. Man muss also beachten, dass die Optimierungsergebnisse im Strategietester vom Dollarkurs im Moment des Testens abhängig sind. Im Artikel sind Screenshots mit den Ergebnissen der Optimierung verwendet, die am 25. Oktober 2016 durchgeführt wurde.

Der Code wurde für das Arbeiten unter idealen Bedingungen geschrieben: er beinhaltet keine Verarbeitung von Ergebnissen des Sendens von Ordern, keine Verarbeitung von Fehlern, die mit Verbindungsabbrüchen verbunden sind, kein Slippage, Kommissionen wurden nicht berücksichtigt.

Die Liquidität und das Ausfüllen von Charts verbessern sich für die Futures je näher das Ablaufdatum des Terminkontrakts rückt. Im Code gibt es keine explizite Verarbeitung der Situation, wenn die Kurse auf einem Symbol eingehen, und auf dem zweiten komplette Balken fehlen (es wurde z.B. aus irgendeinem Grund an der Börse nicht gehandelt). Die im Expert Advisor verwendeten Indikatoren warten allerdings auf die Synchronisierung der Balken für beide Symbole, um den Spread-Wert zu berechnen und geben diese Events ins Journal aus.

Die Statistik der Abweichung des Spreads von Durchschnittswerten für die Erstellung verlässlicherer Handelsregeln wurde nicht analysiert.

Die Analyse der Markttiefe wird nicht verwendet, denn der Thread von Aufträgen wird nicht im MetaTrader 5 Tester emuliert.

Achtung: die in diesem Artikel verwendeten Indikatoren berechnen Koeffizienten der linearen Regression für die Erstellung der Spread-Charts und der Trendlinie dynamisch um. Aus diesem Grund werden sich Charts und Indikatorwerte nach dem Abschluss des Testens von denen während des Testens unterscheiden.

Starten Sie die angehängten Indikatoren oder Expert Advisors im Visualisierungsmodus, um zu sehen, wie dies in der Echtzeit geschieht.


Einschlägige Artikel:


Die im Artikel verwendete Programme:

#
 Name
Typ
Beschreibung
1
CalcShowRegression_script.mq5
Skript
Berechnet die Koeffizienten der linearen Regression und zeigt einen Punkt-Chart mit der Trendlinie (die СGraphic Klasse und die Funktion aus der Alglib werden verwendet) an
2
TwoSymbolsSpread_Ind.mql5
Indikator
Indikator, der das Spread-Histogramm auf zwei Symbolen zeichnet
3
SpreadRegression_Ind.mq5
Indikator Indikator, der die Spread-Grafik und die Regressionslinie zeichnet
4
Strategy1_AngleChange_EA.mq5
Expert Advisor
Strategie 1. Handel auf Basis des Vorzeichenwechsels des Koeffizienten in der Gleichung Y=A*X+B. Analyse und Einstieg nur bei der Eröffnung eines neuen Balkens
5
Strategy2_SpreadSignChange_EA.mq5 Expert Advisor Strategie 2. Handel basierend auf dem Vorzeichenwechsels des Spread-Wertes. Analyse und Einstieg nur bei der Eröffnung eines neuen Balkens
6
Strategy3_SpreadSignOnTick_EA.mq5
Expert Advisor
Strategie 3. Handel basierend auf dem Vorzeichenwechsel des Spreads. Analyse und Einstiege innerhalb des aktuellen Balkens, der Vorzeichenwechsel muss auf den letzten N Ticks bestehen bleiben
7 Strategy4_SpreadDeltaPercent_EA.mq5 
Expert Advisor
Strategie 4. Handel basierend auf dem Erreichen eines vorgegebenen Spread-Werts in Prozent. Analyse und Einstiege innerhalb des aktuellen Balkens bei dem ersten passenden Tick.

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

Beigefügte Dateien |
MQL5.zip (22.9 KB)
LifeHack für Trader: Der vergleichende Bericht über einige Tests LifeHack für Trader: Der vergleichende Bericht über einige Tests

Im Artikel wird der Test des EAs betrachtet, der zugleich auf 4 verschiedenen Symbolen gestartet wird. Der endgültige Vergleich der 4 Testberichte wird in einer Tabelle aufgeführt, genauso wie bei einer Auswahl der Waren in einem Internet-Geschäft. Als zusätzlicher Bonus kommen dazu die automatisch erstellten Grafiken der Verteilung für jedes Symbol.

Die statistische Verteilung in Form von einem Histogramm ohne Indikator-Puffer und Arrays Die statistische Verteilung in Form von einem Histogramm ohne Indikator-Puffer und Arrays

Im Artikel wird die Bildungsmöglichkeit der Histogramme der statistischen Verteilungen der Markt-Charakteristiken unter Verwendung des graphischen Gedächtnisses betrachtet, das heißt ohne Verwendung der Indikator-Puffer und Arrays. Es wurden die ausführlichen Beispiele des Aufbaus solcher Histogramme aufgeführt und wurde die sogenannte "verborgene" Funktional der graphischen Objekte der Sprache MQL5 vorgeführt.

Der universell Oszillator mit dem graphischen Interface Der universell Oszillator mit dem graphischen Interface

Im Artikel wird die Erstellung des universellen Indikators aufgrund aller Oszillators des Terminalen mit dem eigenen graphischen Interface beschrieben. Es ermöglicht schnell und bequem die Parameter jedes separaten Oszillators aus dem Chart-Fenster zu wechseln (und ohne Öffnung des Fensters der Eigenschaften), ihre Messwerte zu vergleichen und für sich die optimale Variante für eine konkrete Aufgabe zu wählen.

Die Muster, die beim Handeln der Währungskörbe erreichbar sind Die Muster, die beim Handeln der Währungskörbe erreichbar sind

In Folge des letzten Artikels über die Prinzipien des Handelns der Währungskörbe werden die Muster betrachtet, die ein Trader selbst finden kann. Es wurden positive und negative Seiten jedes Musters betrachtet und es gibt Hinweise bezüglich ihrer Verwendung. Als Mittel für die Analyse wurden die Indikatoren verwendet, die aufgrund des Indikators Williams erstellt sind.