English Русский 中文 Español 日本語 Português
Atypisches Automatisiertes Trading

Atypisches Automatisiertes Trading

MetaTrader 4Handelssysteme | 19 Februar 2016, 06:53
1 149 0
Leonid Borsky
Leonid Borsky

Einführung

Erfolgreiches und komfortables Trading mit der MT4 Plattform ohne detaillierte Marktanalyse - ist das möglich? Kann solches Trading in der Praxis umgesetzt werden?

Ich meine, ja.

Insbesondere in Bezug auf automatisiertes Trading! MQL4 ermöglicht dies zu tun. Das im Weiteren beschriebene automatisierte Handelssystem zeichnet sich aus durch gute Wiederholpräzision. Und es kann einfach umgesetzt werden, sogar von Einsteigern, die gerade anfangen sich mit den Grundlagen des Schreibens von Expert Advisors vertraut zu machen.

Das System selbst ist eigentlich ein Spiegelbild der Außenwelt. Das harmonisch entwickelte Leben diktiert seine Regeln. ALs wir Kinder waren, haben wir alle die folgende Szene beobachtet: Ameisen halten einen Strohhalm von verschiedenen Seiten und ziehen ihn in einen Ameisenhaufen. Und jede Ameise zieht den Strohhalm auf seine eigene Weise. Dennoch, letztendlich wird das Stroh in Richtung des Ameisenhaufens getragen. Ein Geheimnis der Natur? Versuchen wir die Situation auf einer Handelsplattform zu simulieren.

Atypisches Automatisiertes System

Angenommen, wir haben ein automatisiertes Handelssystem einer Profitart. Das System erfüllt die folgenden Anforderungen

  1. Einstiegssignale sind praktisch zufällig.
  2. Das System ist ständig im Markt, d.h. es arbeitet mit entgegengesetzten Positionen, anstatt mit Stops - das ist wichtig.
  3. Verwendung mehrerer statische Paramater, die sich am Einstieg befinden, wir optimieren das System, um maximalen Proit zu erhalten, mit einem annehmbaren Drawdown.

Praktisch wird dieses System einen Jahresgewinn von +3000 Punkten erbringen, sogar ohne Money-Management Block. Danach aktivieren wir das System in einem Umkehrmodus. Mit anderen Worten, es wird jetzt auf die folgende Art arbeiten:

  1. Wenn wir in einem direkten Modus kaufen würden, werden wir nun verkaufen und umgekehrt. Danach werden wir das System noch einmal mit statischen Parametern optimieren. Und beim Ausstieg der Umkehr-Version erhalten wir maximalen Profit mit einem annehmbaren Drawdown. Es sollte keine Probleme verursachen, weil unser automatisiertes Handelssystem ursprünglich mit zufälligen Einstiegen erstellt wurde.
  2. Danach starten wir beide Versionen gleichzeitig - direkt und Umkehr. Die gleichzeitige Arbeit beider Versionen ist ein sehr wichtiger Schlüsselmoment des beschriebenen Handelssystems!

Sehen wir, was wir haben.

Bei einem gleichzeitigen Start beider Systeme - direkt und Umkehr, machen wir einen doppelten Gewinn. Allerdings arbeiten die Systeme in gegenteiligen Modi. d.h. gegenteilig zu dem anderen, bewusst, nicht blindlings! Außerdem haben wir die Gesamtverluste reduziert - aktueller relativer Drawdown. Und warum arbeiten Systeme bewusst, nicht blindlings?

Der Grund dafür ist, dass, wegen anderer statischer Parameter, bereits nach drei-vier Trades nach dem Start, das Umkehrsystem mit einer Verschiebung in Zeit und Kurs handeln wird, verglichen mit dem direkten System. Dennoch ist der Eingangsalgorithmus im Umkehrmodus der gleiche.

Allerdings wird der Gesamtgewinn schrittweise ansteigen! Ich denke, es ist offensichtlich, da beide Systeme - direkt und Umkehr, für einen profitablen Betrieb optimiert sind. Darüber hinaus werden aktuelle Verluste von einer Version fast immer von dem aktuellen Gewinn der anderen Version abgedeckt. Folglich machen wir den maximalen Profit, mit einem minimalen Drawdown.

Ein Nachteil ist der Anstieg der Margin-Anforderungen. Aber kann dies wirklich als Nachteil benannt werden? Tatsächlich arbeiten hier zwei unabhängige Handelssysteme - direkt und umgekehrt. Und natürlich wird die Margin-Anforderung das Doppelte sein. Und soweit Risiken berücksichtigt sind, werden diese ausreichend reduziert! Das ist der Grundgedanke - nicht den Gewinn erhöhen, sondern den Drawdown maximal zu reduzieren. Aber eine Sache verursacht eine andere. Und, noch einmal, der Gesamtgewinn in solchem Trading wird schrittweise ansteigen. Folglich können wir nun den Money-Management Block aktivieren.

Die Seite MQL4.community enthält eine breite Auswahl verschiedener Expert Advisors, inklusiver derjenigen, welche die oben aufgeführten Anforderungen erfüllen. Der Markt selbst stellt uns neue Aufgaben, verschiedene atypische Lösungen zu finden. Wir können außerdem Möglichkeiten für zur weiteren Suche finden.

Für die Umsetzung der Idee und weiterer Experimente, haben wir einen Expert Advisor von Yury Reshetov, "Artificial Intelligence", als Grundlage verwendet, beschrieben im gleichen Teil (siehe den Artikel von Y. Reshetov "How to Find a Profitable Trading System". Er wurde mit einigen Ergänzungen und Änderungen verwendet, insbesondere enthält er eine Option einen weiteren grundlegenden Indikator für den Betrieb von Perceptron aufzurufen. Außerdem hat er einige zusätzliche Bedingungen zum Öffnen und Nachverfolgen von Positionen.

Hier sind einige Ergebnisse des Experiments, erzielt während des Tests mit dem Paar GBPUSD auf den H1 Zeitrahmen. Die Starteinlage ist 10.000 Einheiten, 2,5 Jahre Historie - Von Januar 2005 bis Mai 2007.

Die direkte Version enthielt 250 Trades innerhalb dieses Zeitraums. Die umgekehrte - 360 Trades. Die Anzahl der Trades unterscheidet sich, weil die StopLoss Ebene während der Optimierung für jede Version unterschiedlich war. Der Nettogewinn in beiden Fällen ist ungefähr +10.000. Während des Betriebs mit 0,1 Lot, nicht aktiviertem Money-Management Block, sind rentable und Verlust-Trades in einem Verhältnis von 3:2 in beiden Versionen.

Hier sind die Beispiele der Kontostand/Kapital Diagramme der direkten und der umgekehrten Version auf die Historie:

Sie können sehen, dass in den meisten Fällen Verlust-Trades der direkten Version durch rentable Trades der umgekehrten Version abgesichert wurden. Und umgekehrt - Verluste der umgekehrten Version wurden von den Gewinnen der direkten Version abgesichert.

Darüber hinaus, wo ein Diagramm seitwärts verläuft, enthält das andere einen Aufwärtstrend. Letztendlich erhalten wir den maximalen Gesamtgewinn mit minimalen Risiken, d.h. mit minimalem Drawdown. Es wird keine Probleme verursachen die Historie aller Trades in Excel zu sammeln und ein resultierendes Diagramm zu zeichnen, die Idee visuell beschreibend.

Der nächste Schritt ist das Aktivieren des Money-Management Blocks. Wir können erwarten, Dass das Aktivieren dieses Blocks bei solchem Trading, die Endresultate hinsichtlich des Gewinns, des Drawdowns und des Handelskomforts deutlich verbessern wird. In die direkte und die umgekehrte Version habe ich den Aufruf der Bibliothek der Lots-Berechnung "b-lots" nach I.Kim eingefügt. Sie ist leicht in den Quellcode einzufügen und arbeitet recht gut: https://www.mql5.com/de/code/8048

Während des Tests habe ich die proportionale Methode der Lots-Berechnung verwendet (LotsWayChoice=2 ), die einen annehmbaren Drawdown mit relativ guten Gewinnen ergibt (Ryan Jones, "The Trading Game: Playing by the Numbers to Make Millions"). Die Ergebnisse waren ziemlich gut., verglichen mit anderen Methoden der Lots-Berechnung, die sehr oft große Gewinne mit großem Drawdown zeigen.

Sehen wir uns die gleiche Historie an, vom 1. Januar 2005 bis Mai 2007. Die Ergebnisse des Tests mit den gleichen Parametern wie vorher:

Umgekehrte Version:

  • Netto Profit +79864
  • Maximaler Drawdown 16969 (24%)
  • Relativer Drawdown 33% (3511)

Direkte Version:

  • Netto Profit +196520
  • Maximaler Drawdown 25801 (12.3%)
  • Relativer Drawdown 18.14% (6972)

Hier sind die Kontostand Diagramme:

Diese Diagramme zeigen auch sehr anschaulich, wie die aktuellen Verluste durch die Gewinne der umgekehrten Version abgedeckt werden. Ich denke, der Komfort eines solchen Tradings ist liegt auf der Hand.

Praktische Verwendung

Als ein Bespiel und für weitere Experimente, ist hier ein Code einer umgekehrten Version, die gegenteilig zu der direkten Version der Variante des Autors des Expert Advisors "AI" von Y. Reshetov arbeitet. Eine direkte Version und ihre Beschreibung befinden sich auf: https://www.mql5.com/de/code/10289

Daneben enthält die angehängte Datei den Indikator Perceptron (der Autor - NoName aus der Ukraine, Kremenchug), der es ermöglicht visuell zu die aktuelle Arbeit des Expert Advisors zu kontrollieren (direkt und Umkehr), und vorher zu wissen, in welche Richtung die nächste neue Position geöffnet wird. Hier setzen Sie die Werte der Gewichtung des Koeffizienten X1-X4 gleich zu den entsprechenden EA-Werten. Hier ist ein Beispiel der Umkehr-Version:

Für diejenigen, die gerade anfangen mit MQL4 zu arbeiten, habe ich versucht möglichst viele Kommentare zu den EA-Operationen zu geben. Die Perceptron Ausgaben im Betrieb dieser Umkehr-Version, werden in der linken oberen Ecke des Charts angezeigt:

//+------------------------------------------------------------------+
//|                                 ArtificialIntelligenceRevers.mq4 |
//|                               Copyright й 2006, Yury V. Reshetov |
//|                                Modifed by   Leonid553            |
//|                                  http://www.tradersforum.net.ru/        | 
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499"
#property link      "http://reshetov.xnet.uz/"
//---- input parameters
extern int    x1 = 88;
extern int    x2 = 172;
extern int    x3 = 39;
extern int    x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int    MagicNumber = 808;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
     Comment(perceptron());   
// Wait for the formation of a new candlestick
// If a new candlestick appears, check for the possibility of a trade 
   if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
//----
   if(IsTradeAllowed()) 
     {
       spread = MarketInfo(Symbol(), MODE_SPREAD);
     } 
   else 
     {
       prevtime = Time[1];
       return(0);
     }
   int ticket = -1;
   // check for opened position
   int total = OrdersTotal();   
   for(int i = 0; i < total; i++) 
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY) 
              // if a long position is opened and ...
             {
               // check profit 
               // the current profit is larger than the value of =(stoploss + spread) and ...
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point)) 
                 {               
                   if(perceptron() > 0) 
                     { 
                       // perceptron is more than zero, then turn to Sell
                       // reverse
                       ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, 
                         Ask + sl * Point, 0, "AI", MagicNumber, 
                                          0, Red); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//if perceptron is less than zero, trail the stoploss to the distance =sl 
//from the current price                 
  { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Bid - sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }
                     }
                 }  
               // short position is opened
             } 
           else 
             {
               // if a short position is opened and ...
               // check profit 
              if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) 
                 {
                  // the current profit is larger than the value of =(stoploss + spread) and ...
                   if(perceptron() < 0) 
                     { 
                       // perceptron is less than zero, then turn to Buy
                       // reverse
                       ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3, 
                           Bid - sl * Point, 0, "AI", MagicNumber,
                                          0, Blue); 
                       Sleep(30000);
                       if(ticket < 0) 
                         {
                           prevtime = Time[1];
                         } 
                       else 
                         {
                           OrderCloseBy(ticket, prevticket, Blue);   
                         }
                     } 
                   else 
//if perceptron is more than zero, trail the stoploss to the distance =sl 
//from the current price
                   { 
                       // trailing stop
                       if(!OrderModify(OrderTicket(), OrderOpenPrice(), 
                          Ask + sl * Point, 0, 0, Blue)) 
                         {
                           Sleep(30000);
                           prevtime = Time[1];
                         }  
                     }
                 }  
             }
           // exit
           return(0);
         }
     }
//********************************************************************
   // check for long or short position possibility
   // initial entrance to the market:
 
   if(perceptron() < 0) 
     { 
       // if the perceptron is less than zero, open a long position :
       // long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, 
                      "AI", MagicNumber, 0, Blue); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     } 
   else 
     // if the perceptron is more than zero, open a short position:
     { 
       // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, 
                      "AI", MagicNumber, 0, Red); 
       if(ticket < 0) 
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
//--- exit
   return(0);
  }
//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron() 
  {
   double w1 = x1 - 100.0;
   double w2 = x2 - 100.0;
   double w3 = x3 - 100.0;
   double w4 = x4 - 100.0;
   double a1 = iAC(Symbol(), 0, 0);
   double a2 = iAC(Symbol(), 0, 7);
   double a3 = iAC(Symbol(), 0, 14);
   double a4 = iAC(Symbol(), 0, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+}

Es sollte beachtet werden, dass die wichtigste Bedeutung der beschriebenen Handelstaktik nicht in diesem speziellen Expert Advisor liegt, sondern, im Gegenteil, in der Zusammenarbeit der direkten und umgekehrten Version von jedem Expert Advisor, wie am Anfang des Artikels erklärt. Und hier sind verschiedene Varianten möglich: Sie können mehrere Umkehr-Versionen haben - erstellt und optimiert nach verschiedenen Kriterien, gemäß dem ursprünglichen Algorithmus der direkten Version. Die Auswahl ist hier ziemlich breit.

Weiter an dieser Idee arbeitend, würde ich das Ziehen von Support und Resistance Linien anbieten. Oder hängen Sie den MA-Indikator oder jeden anderen geeigneten Indikator an das Kontostand-Chart. In diesem Fall, könnten wir auf den Indikator-Signalen einigermaßen das Verbot von Trades in beiden Versionen handhaben. Ich denke, es ist programmierbar.

Aber es ist in Aussicht.


Fazit

Ich setze die Einwände der Skeptiker voraus - und was ist, wenn beide Versionen mit einem Verlust anfangen zu arbeiten?

Nun, die kann in seltenen, außergewöhnlichen Fällen passieren. Aber nicht mehr als dies - "nichts ist perfekt in dieser Welt". Allerdings, bei praktisch zufälligen Einstiegen, arbeiten beide Versionen auf den Signalen von einem Indikator und in in die Gegenrichtung - einer gegen den anderen!

Mit der Kombination von beiden Versionen in einen Expert Advisor, erhalten wir ein effizientes Werkzeug für weitere Verwaltung eines Portfolio-Trading. Und für weitere Experimente.




Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/1485

Beigefügte Dateien |
AI_REVERS.mq4 (6.98 KB)
Test Visualisierung: Kontostand Charts Test Visualisierung: Kontostand Charts
Genießen Sie den Vorgang des Tests mit Charts, mit Anzeige des Kontostands - alle benötigten Angaben immer im Auge!
Einführung in die Theorie der Fuzzylogik Einführung in die Theorie der Fuzzylogik
Die Fuzzylogik geht über die üblichen Grenzen der mathematischen Logik und der Mengentheorie hinaus. Der vorliegende Artikel erläutert die Hauptprinzipien dieser Theorie und beschreibt die Inferenz-Systeme vom Typ Mamdani und Sugeno. Darüber hinaus werden im Artikel Beispiele zur Umsetzung unscharfer Modelle anhand dieser zwei Systeme durch die Mittel der FuzzyNet Bibliothek für MQL5 angeführt.
MT4TerminalSync - System für die Synchronisation von MetaTrader 4 Terminals MT4TerminalSync - System für die Synchronisation von MetaTrader 4 Terminals
Dieser Artikel widmet sich dem Thema "Erweitern der Möglichkeiten von MQL4 Programmen mit Funktionen des Betriebssystems und anderen Mitteln der Programmentwicklung". Der Artikel beschreibt ein Beispiel eines Programmsystems, das die Aufgabe der Synchronisierung mehrerer Terminal-Kopien, basierend auf einer einzelnen Quellvorlage, umsetzt.
Praktische Implementierung digitaler Filter in MQL5 für Anfänger Praktische Implementierung digitaler Filter in MQL5 für Anfänger
Der Gedanke einer Filterung digitaler Signale ist in Foren für den Aufbau von Handelssystemen umfassend diskutiert worden. Und es wäre sehr unschlau, keinen Standardcode für digitale Filter in MQL5 zu erzeugen. In diesem Beitrag beschreibt der Autor die Umwandlung des Codes eines einfachen SMA Indikators aus seinem Beitrag "Angepasste Indikatoren in MQL5 für Anfänger" in einen Code für einen komplizierteren und digitalen Filter. Daher ist dieser Beitrag die logische Fortsetzung des vorhergehenden. Außerdem wird hier auch gezeigt, wie man Text im Code ersetzen und Programmierfehler korrigieren kann.