English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
Kopieren des Handels aus MetaTrader 5 nach MetaTrader 4

Kopieren des Handels aus MetaTrader 5 nach MetaTrader 4

MetaTrader 5Handel | 5 Mai 2016, 11:00
1 153 0
Mykola Demko
Mykola Demko

Einleitung

Vor gar nicht so langer Zeit dachten viele Händler, MetaTrader 5 sei eine rohe Plattform, die für den realen Handel nicht geeignet ist. Doch jetzt, nach kurzer Zeit, fragt man sich, wann der reale Handel möglich sein wird. Viele Händler wissen bereits die Vorteile von MetaTrader 5 zu schätzen. Zudem verstärkte die von MetaQuotes Software Corp. durchgeführte Meisterschaft das Interesse der Entwickler an MQL5. Und nun soll dieses Interesse in Form von Gewinnen aus dem Handel in der Praxis umgesetzt werden. Die Frage "Wann wird der reale Handel möglich sein?" ist falsch adressiert. Die Antwort darauf hängt vom jeweiligen Broker ab. Die Broker sind es, die die endgültige Entscheidung über den Zeitpunkt für den Übergang zur neuen Plattform treffen.

Was kann ein einsamer Händler in einer solchen Situation tun? Die Antwort liegt auf der Hand: Man soll die Möglichkeiten für den realen Handel von MetaTrader 4 als Übergang zu MetaTrader 5 nutzen, d. h. eine Kopie schreiben. Die Verbindung zwischen zwei MetaTrader 4 Terminals ist im Internet keine Neuheit. Nun ist es an der Zeit, eine solche Verbindung mit MetaTrader 5 zu schreiben.


Vorbemerkung

Für die Umsetzung der hier behandelten Ideen müssen folgende Fragen geklärt werden: "Woher kommt der Gewinn?" und "Wie kann ein Händler das Wachstum von Gewinnen steuern?". Die Antworten scheinen auf den ersten Blick offensichtlich. Billig kaufen, teuer verkaufen. Doch sehen wir uns die Bestandteile der Gewinne an. Gewinn ist die Differenz zwischen Kauf und Verkauf, multipliziert mit dem Einsatz. Das heißt, der Gewinn besteht aus zwei Teilen: Gebote und das Volumen einer Handelsposition.

Was kann der Händler verwalten? Welche dieser beiden Komponenten steuert den Handel? Natürlich ist es das Volumen einer Handelsposition. Gebote werden vom Broker empfangen und können durch den Händler nicht verändert werden. Hier ist die erste Schlussfolgerung: Um eine Kopie des Handels zu erstellen, muss das Volumen von Handelspositionen synchron gehalten werden.


1. Vergleich der zwei Plattformen

1.1 Unterschiede im Buchhaltungssystem

Die verglichenen Plattformen haben verschiedene Buchhaltungssysteme für den Handel, was das Kopieren erschweren kann. Doch wir dürfen nicht vergessen, dass MetaTrader 5 die führende Rolle in dieser Verbindung übernimmt. Das bedeutet, dass wir das gleiche Buchhaltungssystem in MetaTrader 4 virtuell replizieren müssen.

Eine Handelsposition in MetaTrader 5 ergibt sich aus einzelnen Handelsordern, was der Order-Buchhaltung in MetaTrader 4 nicht widerspricht. Der gemeinsame Stop Loss und Take Profit einer Position lässt sich durch die Platzierung der gleichen Stop Loss und Take Profit für jede offene Order umsetzen. Wesentliche Unterschiede zwischen den Plattformen treten nur bei der Frage auf, welche Order in MetaTrader 4 geschlossen werden soll. Da MetaTrader 5 über keine separate Buchhaltung über Order in einer Handelsposition verfügt, kann diese Frage zum Stolperstein werden.

1.2 Volumina von Handelspositionen

Sehen wir uns näher an, ob es irgendeinen Unterschied macht, welche Order geschlossen wird. Wird es sich auf den Gewinn auswirken? Zum Beispiel: Wir haben zwei Order, die zu verschiedenen Zeiten geöffnet und ebenso zu verschiedenen Zeiten geschlossen wurden, aber für eine gewisse Zeit nebeneinander bestanden haben. Das bedeutet, wir versuchen, eine Handelsposition im Order-Buchhaltungssystem zu emulieren.

Berechnen wir verschiedene Varianten, was mit dem Gewinn passiert, wenn wir die Höhe der Schließungsniveaus der Order ändern:

Art 
Umfang
Öffnungsniveau
 Schließungsniveau
Verkauf0,11,393881,38438
Verkauf0,11,38868
1,38149

Schreiben wir einen Code für einen Rechner:

void OnStart()
  {
   double open1=1.39388,close1=1.38438,
         open2=1.38868,close2=1.38149;
   Print("total  ",n1(profit((open1-close1),0.1)+profit((open2-close2),0.1)));
   Print("order2  pp=",ns(open2-close2),"  profit=",n1(profit((open2-close2),0.1)));
   Print("order1  pp=",ns(open1-close1),"  profit=",n1(profit((open1-close1),0.1)));
  }
string ns(double v){return(DoubleToString(v,_Digits));}
string n1(double v){return(DoubleToString(v,1));}
double profit(double v,double lot){return(v/_Point*lot);}
Hier ist die Berechnung:
order1  pp=0.00950  profit=95.0
order2  pp=0.00719  profit=71.9
total  166.9

Jetzt wechseln wir die Werte von close1 und close2 aus.

order1  pp=0.01239  profit=123.9
order2  pp=0.00430  profit=43.0
total  166.9


Abbildung 1. Varianten der Order-Schließung

Abbildung 1 zeigt, dass die Bereiche AB und CD in beiden Versionen Volumina gleich 0,1 haben, während BC ein Volumen von 0,2 hat. Das hängt nicht davon ab, von welchen Ordern das Volumen geschlossen ist.

Bei den Gewinnen einzelner Order gibt es Unterschiede, doch der Gesamtgewinn der Positionen ist gleich. Beachten Sie, dass dieses Beispiel für gleiche Volumina von Ordern berechnet wurde. Das bedeutet, auf den gleichen Niveaus wurde nicht die Schließung einer Order, sondern des gleichen Umfangs umgesetzt. Und wenn wir uns strikt an das Prinzip der Schließung des Volumens halten, kommt es auch nicht darauf an, wie hoch das Volumen einer Order ist. Wenn das Schließungsvolumen höher ist als das Order-Volumen, erfolgt eine Teilschließung.

Hier ist also die wichtigste Schlussfolgerung: Für die Gesamtposition ist es unerheblich, welche Order geschlossen wird, Wichtig ist, dass die geschlossenen Volumina auf einem bestimmten Niveau gleich sein müssen.

1.3 Kopieren von Abschlüssen

Anhand der obigen Beispiele sehen Sie, dass es nicht erforderlich ist, vom in MQL5 geschriebenen Expert Advisor erzeugte Signale zu übertragen, um den gleichen Gewinn zu erzielen. Sie müssen nur die Volumina von Handelspositionen replizieren, obwohl es sich aus Gründen, die später besprochen werden, nicht um einen genau identischen Handel handelt. Allerdings können diese Gründe kein Hindernis für realen Gewinn mithilfe eines rentablen in MQL5 geschriebenen EAs sein.

Der erste Grund für den Rückgang des Gewinns ist der Unterschied der Gebote. Bei einigen Brokern kann er über dem Spread liegen. Das liegt daran, dass die Übertragung in Echtzeit stattfindet. Und wenn ein EA in MetaTrader 5 entscheidet, eine Position zu öffnen, kann der Broker, mit dem MetaTrader 4 verbunden ist, schlicht und einfach einen anderen Preis haben. Und der Preis kann in diesem Fall besser oder schlechter sein.

Der zweite Grund für den Rückgang des Gewinns ist der Zeitfaktor. Eine Position wird kopiert, nachdem sie bereits in MetaTrader 5 erschienen ist. Somit ist die Verzögerung unvermeidlich.

Diese zwei Gründe überschatten alle Scalping-Strategien. Deshalb lassen sich solche Strategien nicht anwenden, bis der reale Handel in MetaTrader 5 möglich ist. 

Ein System, das auf einen Gewinn (aus einem Abschluss) hindeutet, der den Spread bei Weitem übersteigt und nicht auf die Gebote eines bestimmten Brokers reagiert, kann zum Verdienen von echtem Geld mithilfe der Positionskopie genutzt werden.


2. Umsetzung der Aufgabe

  1. Anbindung der Übergabe von Signalen zwischen MetaTrader 5 und MetaTrader 4
  2. Übertragung von Positionen aus MetaTrader 5
  3. Erhalten von Signalen in MetaTrader 4
  4. Replizieren der Handelspositionen in MetaTrader 4

2,1. Anbindung der Übergabe von Signalen zwischen MetaTrader 5 und MetaTrader 4

Die erste Variante ist die Übertragung von Signalen über eine gemeinsam genutzte Datei. Die Frage lautet: Würde das häufige Erfassen in der Datei nicht die Hardware beschädigen? Wenn Sie neue Daten nur dann schreiben, wenn sich eine Position verändert hat, treten solche Aufzeichnungen nicht sehr häufig auf. Nicht häufiger, als die Windows-Entwickler Änderungen an der Auslagerungsdatei vornehmen. Das ist wiederum ein bewährter Vorgang, der die Hardware nicht beschädigt. Das Schreiben in eine gemeinsame Datei ist eine akzeptable Umsetzungsmöglichkeit für nicht sehr häufig vorkommende Anfragen. Das ist eine weitere Beschränkung für Scalping-Strategien, auch wenn ihre Tragweite viel geringer ist als die der vorherigen Beschränkung.

Für die Anbindung können Sie die Funktion von MetaTrader 5 zum Schreiben von Unterverzeichnissen in jeder beliebigen Tiefe nutzen. Ich habe nicht getestet, ob es wirklich mit "jeder beliebigen" Tiefe funktioniert, aber bis zu 10 Unterverzeichnisse werden definitiv geschrieben. Und mehr brauchen wir nicht. Natürlich können Sie eine DLL nutzen, um den Zugriff zu ermöglichen, aber mein Prinzip ist, die DLL nicht zu nutzen, wenn sich das Problem ohne sie lösen lässt. Um das Problem ohne DLL zu lösen, installieren Sie einfach MetaTrader 4 in das Verzeichnis \Files\ des MetaTrader 5 Terminals (siehe Arbeiten mit Dateien).

Somit wird der Pfad zur gemeinsamen Datei so aussehen:

C:\Program Files\MetaTrader 5\MQL5\Files\MetaTrader 4\experts\files\xxx      //where xxx is the name of the shared file.

Mit diesem Ort wird die Datei sowohl in MetaTrader 4 als auch in MetaTrader 5 verfügbar sein. Die Möglichkeit der gemeinsamen Nutzung von Dateien wird durch die Funktionen von MQL5 sichergestellt.

2,2. Übertragung von Positionen aus MetaTrader 5

Zu Übertragungszwecken und für die sparsame Nutzung von Ressourcen benötigen wir eine Funktion, die die Erscheinung/Modifizierung/Schließung einer Handelsposition für alle Instrumente überwacht. Weiter oben haben wir herausgefunden, dass wir für die Übertragung eines Abschlusses nur das Volumen einer Handelsposition kennen müssen. Addieren Sie das Instrumentsymbol und die SL- und TP-Niveaus zum Volumen.

Um die Änderungen zu verfolgen, müssen wir den vorherigen Zustand einer Position kennen. Falls der vorherige und aktuelle Zustand nicht gleich sind (und die Position sich somit verändert hat), muss dies in der Datei abgebildet werden. Wir brauchen außerdem eine Funktion zum Schreiben dieser Information in die Datei. Die Datei muss so geöffnet werden, dass sie für die gleichzeitige Verwendung durch mehrere Programme verfügbar ist.

Um den Moment der Modifizierung einer Position nicht zu verpassen, muss das Tracking-System in der Funktion OnTimer() implementiert werden, da wir alle Instrumente gleichzeitig verfolgen müssen und Ticks für unterschiedliche Symbole zu verschiedenen Zeiten erscheinen. Ferner müssen wir ein Signal über die Veränderung im Inhalt der Datei senden.

2,3. Erhalten von Signalen in MetaTrader 4

Das Signal der Aktualisierung der Datei muss verfolgt werden. Dies lässt sich durch eine Variable erreichen, deren Zustand für den Eintritt in den Bereich der Veränderung der Position überwacht wird. Wir brauchen eine Funktion zum Lesen einer Datei mit dem Zustand von Positionen. Dabei handelt es sich um eine Standardfunktion.

Übergabe der Dateiinhalte an die Arrays für die Berechnung. Hier brauchen wir den Parser. Da nicht nur Zahlen, sondern auch Symbole übergeben werden, ist es empfehlenswert, bei der Übertragung aus MetaTrader 5 alles in Strings umzucodieren. Durch das Schreiben aller Dateien für ein Symbol in einen Textstring beheben wir außerdem das Risiko des Verwechselns von Daten.

2,4. Replizieren der Handelspositionen in MetaTrader 4

Das ist der größte Satz von Funktionen. Er sollte in mehrere Unterklassen aufgeteilt werden.

  1. Vergleich virtueller Funktionen;
  2. Funktion der Auswahl von Ordern;
  3. Funktion der Öffnung von Ordern;
  4. Funktion der Schließung von Ordern;
  5. Funktion der Modifizierung von Ordern.

2.4.1. Vergleich virtueller Funktionen

Der Vergleich virtueller Funktionen ist notwendig, um sicherzustellen, dass die Positionen konform sind. Die Funktion muss die Position für jedes Symbol separat berechnen und in der Lage sein, Positionen, für die der Handel verboten ist, herauszufiltern (sofern vorhanden).

In der Praxis kann es zu Situationen kommen, in denen der Broker nicht über das Symbol verfügt, für das das Signal aus MetaTrader 5 übergeben wird. Doch das sollte den Handel im Allgemeinen nicht behindern, wobei natürlich eine Warnung ausgegeben werden sollte. Der Benutzer hat das Recht, über eine solche Situation informiert zu werden.

2.4.2. Funktion der Auswahl von Ordern

Diese Funktion muss die Order abhängig vom Symbol auswählen, um weiter mit ihnen zu arbeiten. In diesem Fall müssen die Order außerdem gefiltert werden, um keine Pending Orders zu enthalten, da wir nur die offenen Positionen übertragen.

2.4.3. Funktion der Öffnung von Ordern

Sie muss die Höchstmenge an Berechnungen enthalten. Somit ist es genug, das Volumen und den Typ zu übergeben.

2.4.4. Funktion der Schließung von Ordern

Wie die vorherige muss auch diese Funktion alles berechnen, bevor sie den Befehl zum Schließen ausgibt.

2.4.5. Funktion der Modifizierung von Ordern

Diese Funktion muss eine Überprüfung auf die Nähe zum Markt beinhalten. Außerdem ist es wünschenswert, die Platzierung von Ordern und Stop-Niveaus zeitlich zu verteilen, da die Platzierung von Stop-Niveaus während der Eröffnung nicht bei allen Brokern erlaubt ist. Zusätzlich erhöht die gemeinsame Öffnung von Ordern und Festlegung von Stop-Niveaus die Wahrscheinlichkeit von neuen Geboten.

Somit wird die Position schnell wiederholt. Und das Platzieren von Stop-Niveaus ist zweitrangig, wobei es nicht weniger wichtig ist.


3. Umsetzung

Die Codes sind detailliert kommentiert, fast Zeile für Zeile. Deshalb verweile ich beim Erklären der Codes nur bei den schwierigsten Teilen.

Anbindung der Übergabe von Signalen zwischen MetaTrader 5 und MetaTrader 4

Die Anbindung wird in MetaTrader 5 durch die folgende Funktion umgesetzt:

void WriteFile(string folder="Translator positions") // by default it is the name of the shared file

Die Flags der Öffnung bedeuten:

FILE_WRITE|FILE_SHARE_READ|FILE_ANSI

Datei ist zum Schreiben geöffnet | gemeinsame Nutzung durch verschiedene Programme zum Lesen ist erlaubt | ansi-Kodierung

In MetaTrader 4 wird die Anbindung durch die folgende Funktion umgesetzt:

int READS(string files,string &s[],bool resize)

Der Parameter resize verhindert die Neuverteilung des Speichers des Arrays aus erhaltenen Daten. Im Code wird Speicher für dieses Array mit jeder Iteration zugewiesen, weil es einem Entwickler nicht möglich ist, die Menge von Zeilen zu prognostizieren. Sie hängt von der Menge der in MetaTrader 5 ausgewählten Symbole ab. Deshalb kann sie nicht im Voraus in MetaTrader 4 berechnet werden.

Deshalb muss das Array bei jedem Schritt um eins erhöht werden. Allerdings muss diese Funktion beim zweiten Aufruf der Funktion blockiert werden, da die Länge des Arrays bereits definiert ist und sich nicht ändert. Nutzen Sie zu diesem Zweck die Variable bool resize.

Übertragung von Positionen aus MetaTrader 5

Um die Übertragung in der Funktion OnTimer mit einer Frequenz von 1 Sek. zu organisieren, werden Daten aller Positionen in der folgenden Position empfangen:

void get_positions()

Anschließend erfolgt der Vergleich des vorherigen Wertes der Positionen mit dem aktuellen Wert der Funktion:

bool compare_positions()

Der Austritt mit return(true) tritt dabei auf, wenn mindestens eine Zelle nicht damit übereinstimmt. Der Austritt mit return(true) bedeutet, dass die Positionen nicht gleich sind und die Datei neu geschrieben werden muss. Beim erneuten Schreiben der Datei erhöht sich der Zähler cnt_command um eins.

Erhalten von Signalen in MetaTrader 4

Nach dem Lesen der Datei mithilfe der Funktion READS() haben wir ein ausgefülltes Array von Strings s[].

Um nützliche Informationen aus diesen Strings zu beziehen, brauchen wir einen Parser.

Die Funktion:

int parser(int Size)

ist nur ein Wrapper für den Aufruf der Funktion für die Identifizierung der Zeile:

void parser_string(int x)

Die Funktion erkennt alle Zellen mit Ausnahme von Symbolen.

Das Symbol wird in einem Zyklus erkannt, einmalig am Anfang eines Algorithmus, mithilfe der Funktion:

void parser_string_Symbols(int x)

Als Nächstes werden wir nicht den Code in MQL5 anwenden und betrachten nur den Code in MQL4, sofern dies nicht gesondert besprochen wird.

Vergleich virtueller Funktionen

Der Vergleich der Positionen ist in zwei Teile unterteilt. Der Vergleich des Volumens und des Typen der Positionen wird in der folgenden Funktion umgesetzt:

bool compare_positions()

In dieser Hülle wird der Aufruf zum Empfangen des realen Zustands von Positionen in der folgenden Funktion umgesetzt:

void real_pos_volum()

und die Vergleichsfunktionen gemäß dem oben erwähnten Prinzip "alles oder nichts". Das bedeutet, dass alle Positionen als unterschiedlich gelten, wenn mindestens eine Zelle nicht gleich ist. In real_pos_volum() ist eine Reihe von Filtern implementiert, die im Code detailliert beschrieben werden und in anderen Funktionen mehrfach verwendet werden.

Insbesondere wird sie für die Summierung der Volumina aller Order auf einem Symbol in einer virtuellen Position genutzt. Damit die Lock-Positionen (falls vorhanden) korrekt verarbeitet werden können, haben Buy-Order das Vorzeichen Minus und Sell-Order das Vorzeichen Plus.

Der zweite Teil des Vergleichs ist der Vergleich der Stop-Niveaus (Stop-Niveaus sind Stop Loss und Take Profit). Er wird in einer Funktion umgesetzt, die der oben abgebildeten ähnlich ist:

bool compare_sl_tp_levels()
Wie bei den Volumina befindet sich auch im Inneren dieser Hülle ein Aufruf zum Erhalten von Informationen über die Stop-Niveaus in der Funktion:
void real_pos_sl_tp_levels()

Funktion der Auswahl von Ordern

Order dürfen nur zum Schließen des Volumens ausgewählt werden, deshalb wird die komplizierte spezielle Auswahlfunktion nur für die Schließung umgesetzt:

void close_market_order(string symbol,double lot)

Enthält die Parameter des Symbols und das zu schließende Volumen. Um die Order so wenig wie möglich aufzubrechen, sucht die Funktion im ersten Zyklus nach der Order, deren Volumen dem zu schließenden Volumen im Parameter gleich ist.

Falls es keine solche Order gibt (was aus dem Zustand true des Schließungs-Flags FlagLot hervorgeht), wird das festgelegte Volumen in der ersten Order im Zyklus geschlossen (die Überprüfung auf den Überschuss des Order-Volumens ist in der Schließungsfunktion Closes() implementiert).

Die Auswahl der Order für die Modifizierung der Stop-Niveaus wird in der folgenden Funktion umgesetzt:

void modification_sl_tp_levels()

Order werden nur nach Symbol gefiltert, da alle Stop-Niveaus innerhalb eines Symbols gleich sind.

Funktion der Öffnung von Ordern

Die Öffnung ist in der folgenden Funktion implementiert:

int open_market_order(string symbol,int cmd,double volume,
                     int stoploss=0,int takeprofit=0,int magic=0)

Sie beinhaltet alle erforderlichen Überprüfungen für eine bequeme Öffnung einer Order mithilfe der angegebenen Daten.

Funktion der Schließung von Ordern

Die Schließung ist in der folgenden Funktion implementiert:

bool Closes(string symbol,int ticket,double lot)

Der Code enthält eine Überprüfung auf den Fall, dass der Parameter lot über dem realen Volumen der vorher gewählten Order liegt.

Funktion der Modifizierung von Ordern

Die Modifizierung ist in der folgenden Funktion implementiert:

bool OrderTradeModif(int ticket,string symbol,int cmd,double price,
                    double stoploss=0,double takeprofit=0,int magic=0)

Der Code enthält Überprüfungen auf den Fall, dass die Stop-Niveaus nicht dem Typ der Order entsprechen. Die Werte werden in diesem Fall ausgetauscht. Es wird auch geprüft, ob die Niveaus bereits den angefragten Wert haben.

4. Logikfunktionen

Der vorher erstellte Plan ist abgeschlossen, doch der Code enthält immer noch einige nicht erklärte Funktionen. Dabei handelt es sich um Logikfunktionen. Man kann sagen, es sind die Basisfunktionen hinter dem Prozess.

void processing_signals()
void processing_sl_tp_levels()

Beide Funktionen sind Endloszyklen mit Austritt beim bedingten break. Hier müssen wir festhalten, dass das Script selbst als Endlosschleife umgesetzt wird. Damit der Benutzer das Programm bequem entfernen kann, verfügt die Hauptbedingung über die eingebaute Funktion IsStopped().

Der Code wird auf die folgende Weise aus einem Expert Advisor in das in Schleife ausgeführte Script übertragen:

 // Init()
 while(!IsStopped())
    {
     // Start()
     Sleep(1000);
    }
 // Deinit()

Die gesamte Script-Logik wird in der gleichen Endlosschleife in der Standardfunktion start() beschrieben.

Der Code des in start() enthaltenen Zyklus sieht so aus:

     If the trade flow is not busy
          Read the file and save data in an array (not changing the array size);
          if there have been changes in the file
               write new comments;
               remember the time when cycles of compliance check start (located below);
               if the positions whose volumes are being compared are not equal
                    process the positions by volumes;
               if the positions whose stops are being compared are not equal
                    process the positions by stops;
               calculate the end time of checks;
          If time is not exceeded
               make a pause for the remaining time;

Die komplexesten logischen Konstruktionen befinden sich in den Funktionen processing_signals() und processing_sl_tp_levels().

Wir beginnen mit der Beschreibung der Funktionen basierend auf dem Prinzip "vom Einfachen zum Schwierigen". Dabei bildet der Aufruf im Code das Gegenteil.

//+------------------------------------------------------------------+
//| processing stop levels                                           |
//+------------------------------------------------------------------+
void processing_sl_tp_levels()
  {
//--- remember the time of entering the cycle   
   int start=GetTickCount();
   while(!IsStopped())
     {
      //--- if the trade flow is not busy
      if(Busy_and_Connected())
        {
         //--- select the order and modify stop levels           
         modification_sl_tp_levels();
        }
      //--- if the delay time is over, update information from the file  
      if(GetTickCount()-start>delay_time)READS("Translator positions",s,false);
      //--- if the update counter has changed in the file, exit the cycle      
      if(cnt_command!=StrToInteger(s[0]))break;
      //--- micro-pause      
      Sleep(50);
      //--- if real stop levels and those in the file are equal, exit the cycle     
      if(!compare_sl_tp_levels())break;
     }
   return;
  }

Wie bereits erwähnt, ist die Funktion eine Endlosschleife mit Austritt nach zwei Bedingungen:

Die erste Bedingung für den Austritt aus der Schleife tritt in dem Fall auf, wenn der Wert von cnt_command nicht gleich dem entsprechenden Wert in der Datei ist. Davor erhalten wir die aktuellen Informationen über die Datei, sofern die Ausführungszeit der Schleife über der in der globalen Variable delay_time festgelegten Verzögerung liegt.

Die Zeit kann deshalb überschritten werden, weil alle Veränderungen durch den Filter Busy_and_Connected() geschützt werden. Das heißt, man sollte nur eintreten, wenn der Handelsfluss frei ist.

An dieser Stelle sollte erklärt werden, dass es in MetaTrader 4 (im Gegensatz zu MetaTrader 5) unmöglich ist, eine Reihe von Befehlen an den Server zu senden, ohne ein erneutes Gebot zu erhalten. Der Server kann nur die erste Anfrage annehmen, der Rest geht verloren. Deshalb müssen wir vor der Erteilung eines Befehls an den Server prüfen, ob der Handel frei fließt.

Die zweite Überprüfung für den Austritt aus dem Zyklus ist die oben beschriebene Funktion für den Vergleich von Positionen nach Stop-Niveaus, compare_sl_tp_levels(): Wenn die Positionen gleich sind, verlassen Sie den Zyklus.

Nun zum komplexen Teil: Die Funktion processing_signals() wird ähnlich organisiert, doch der logische Teil unterscheidet sich in seiner Funktionalität sehr stark.

Analysieren wir diesen Teil detailliert:

//--- convert the direction of the position stored in the file to the form -1,+1            
int TF=SymPosType[i]*2-1;
//--- convert the direction of the real position to the form -1,+1
int TR=realSymPosType[i]*2-1;
//--- save the volume of the position stored in the file                     
double VF=SymPosVol[i];
//--- save the volume of the real position 
double VR=realSymPosVol[i];
double lot;
//--- if the positions for the current symbol are nor equal
if(NormalizeDouble(VF*TF,8)!=NormalizeDouble(VR*TR,8))
  {
//--- if the real volume is not equal to zero and the directions are not equal or
//--- if the directions are equal and the real volume is larger than that in the file                              
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))
     {
      //--- if the directions are equal and the real volume is larger than that in the file 
      if(TF==TR && VF<VR)lot=realSymPosVol[i]-SymPosVol[i];
      //--- if the real volume is not equal to zero and the directions are not equal
      else lot=realSymPosVol[i];
      //--- close the calculated volume and exit the cycle                  
      close_market_order(Symbols[i],lot);
      break;
     }
   else
     {
      //--- if the directions are equal and the real volume is less than that in the file 
      if(TF==TR && VF>VR)lot=SymPosVol[i]-realSymPosVol[i];
      //--- if the directions are not the same and the volume is equal to zero                  
      else lot=SymPosVol[i];
      //--- open the calculated volume and exit the cycle 
      open_market_order(Symbols[i],SymPosType[i],lot);
      break;
     }
  }

Die Variablen TF und TR speichern den Wert des Positionstypen in Form von buy=-1,sell=1. Dementsprechend ist TF der in der Datei gespeicherte Wert und TR der reale Wert der virtuellen Position. Das Gleiche gilt für die Volumina VF und VR.

Somit ist die Ungleichheit:
if(VF*TF!=VR*TR)

true, wenn die Volumina oder Typen der Position ungleich sind.

Dann erfolgt die logische Verbindung:

if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))

die bedeutet, dass Sie die gesamte Position schließen sollten, wenn das reale Volumen nicht gleich Null ist und die Typen ungleich sind.

Dazu gehört die Variante, bei der das Volumen in der Datei Null ist, und die Variante, dass die Richtung der Position umgekehrt wird. Falls die Richtung der Position umgekehrt wird, müssen Sie die Position für die Öffnung vorbereiten, d. h. das vorherige Volumen schließen. Bei der nächsten Iteration wechselt die Logik zum anderen Zweig – zur Öffnung.

Die zweite komplexe Bedingung der logischen Verbindung bedeutet, dass Sie das reale Volumen reduzieren sollten, wenn der Typ korrekt ist, aber das reale Volumen höher als das in der Datei gespeicherte ist. Zu diesem Zweck berechnen wir zuerst die Größe des Loses, um das das Volumen gesenkt werden muss.

Falls keine Schließungsbedingung für diese Situation geeignet ist und die Positionen (wie wir im ersten Filter entdeckt haben) nicht gleich sind, muss eine neue Order geöffnet werden. Hier gibt es ebenfalls zwei Varianten: eine Order für die gesamte Größe der Position in der Datei zu öffnen oder bestehende Order zu erweitern. Hier möchte ich festhalten, dass die Überprüfung auf den Überschuss des begrenzten Volumens in der Öffnungsfunktion verfügbar ist. Also wird das fehlende Volumen (falls dies durch die Überprüfung nicht möglich war) bei der nächsten Iteration des Algorithmus geöffnet. Da erst die Schließung und erst danach die Öffnung verarbeitet wird, ist die Lock-Situation fast unmöglich.

Ich möchte eine kleine Besonderheit des Codes ansprechen – die Situation der Neueröffnung einer Order, die soeben durch Stops in MetaTrader 4 geschlossen wurde. Ich habe bereits erwähnt, dass der Unterschied von Geboten sich oft innerhalb eines Bereichs von 2-3 Punkten im fünfstelligen Bereich liegt. Bei einem Spread von 15 ist der Unterschied unwesentlich. Doch falls mit diesem Unterschied Stop Loss oder Take Profit in MetaTrader 4 früher ausgelöst wurde als in MetaTrader 5, kam es zu einer Situation, in der der Algorithmus versuchte, die soeben geschlossene Position neu zu erstellen, die daraufhin durch die in MetaTrader 5 ausgelösten Stops entfernt wurde.

Das führte zwar zu keinen großen Verlusten, doch ein Spread wurde verschwendet. Deshalb wurde der Algorithmus neu konzeptioniert, sodass MetaTrader 4 nach der Entfernung einer Position diese nicht wiederherstellt, sondern wartet, bis sich der Zustand der Datei ändert. Erst dann beginnt er wieder zu arbeiten. In dieser Situation kann der Händler die Position manuell entfernen, falls sie sich als falsch erweist. Und sie wird nicht wiederhergestellt, bis MetaTrader 5 Änderungen an der Datei vornimmt.

Der einzige Schwachpunkt ist der seltene Fall, in dem Stops in MetaTrader 4 die Position entfernen und sie in MetaTrader 5 nicht geschlossen wird. In diesem Fall kann ich dazu raten, das Script Copyist positions neu auszuführen. Und noch ein letzter Hinweis: Der Code prüft nicht die Arbeit am Wochenende. Das ist nicht schlimm, denn nur der Log wird voller wertloser erneuter Gebote sein.


5. Überprüfung der Umsetzung in der Praxis

Installieren Sie MetaTrader 4 im Verzeichnis C:\Programme\MetaTrader 5\MQL5\Files\.

Führen Sie den kompilierten Expert Advisor Translator positions auf einem beliebigen Diagramm in MetaTrader 5 aus (die Arbeit des Expert Advisors hängt nicht von dem Diagramm, auf dem er ausgeführt wird, ab).

 

Abbildung 2. Translator positions in MetaTrader 5

Wir sehen einen mehrzeiligen Kommentar mit dem Zustand des Zählers in der ersten Zeile und dem Log aller Positionen Zeile für Zeile.

Führen Sie das kompilierte Script Copyist positions auf einem beliebigen Diagramm in MetaTrader 4 aus (die Arbeit des in Schleife ausgeführten Scripts hängt nicht von dem Diagramm ab, auf dem es ausgeführt wird).


Abbildung 3. Copyist positions in MetaTrader 4

Anschließend können wir jeden beliebigen Expert Advisor in MetaTrader 5 ausführen. Die Ergebnisse seiner Arbeit werden schnell nach MetaTrader 4 kopiert.


Abbildung 4. Positionen und Order in MetaTrader 4 (oben) und MetaTrader 5 (unten)

Übrigens, das Kontomanagement in MetaTrader 5 lässt sich entweder manuell durchführen oder das Konto kann mithilfe des Investor-Passworts eingeloggt werden.

Somit können Sie beispielsweise den Kopierer auf jedem beliebigen Konto der Meisterschaft ausführen.


Fazit

Dieser Beitrag soll den Übergang von Händlern zur neuen Plattform beschleunigen und zum Erlernen von MQL5 anregen.

Zum Abschluss möchte ich sagen, dass dieser Code den direkten Handel auf einem realen Konto in MetaTrader 5 nicht vollständig ersetzen kann. Er ist als allgemeingültiger Code für jedes beliebige Handelssystem geschrieben und berücksichtigt nicht die jeweilige Logik, deshalb ist er, wie alles Allgemeingültige, nicht ideal. Doch auf seiner Basis können Sie einen Signal-Translator für eine bestimmte Strategie schreiben. Für viele Händler, die mit der Programmierung nicht vertraut sind, kann er als Übergang in Erwartung der Veröffentlichung dienen.

Jenen, die in der Programmierung bewandert sind, empfehle ich, den Code zu modifizieren, damit er Order anhand ihrer magischen Nummer erkennt, und die Übertragung und Platzierung von Pending Orders zu implementieren. Die Platzierung von Pending Orders wirkt sich nicht auf den Gewinn aus, solange eine stabile Verbindung zum Server besteht. Falls die Verbindung häufig unterbrochen wird, sollte der gesamte Serverteil, einschließlich der Pending Orders, kopiert werden.

Lernen Sie die neue Sprache und nutzen Sie sie zur Entwicklung eines robusten Systems. Viel Erfolg bei Ihrem Handel.

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

Beigefügte Dateien |
MetaQuotes-ID im MetaTrader Mobil-Terminal MetaQuotes-ID im MetaTrader Mobil-Terminal
Auf Android und iOS basierende Geräte bieten uns viele verschiedene Features, die vielen von uns weitgehend unbekannt sind. Eines davon stellen die sogenannten Push Notifications dar, die dazu genutzt werden können, private Nachrichten zu empfangen - und zwar unabhängig von unserer Telefonnummer beziehungsweise unserem Mobilfunkbetreiber. MetaTrader Mobil-Terminal kann bereits heute schon derartige Nachrichten direkt seitens Ihres Trading Roboters empfangen. Sie müssen lediglich die MetaQuotes-ID Ihres Geräts kennen. Zum heutigen Zeitpunkt haben bereits mehr als 9 000 000 Mobil-Terminals eine derartige ID erhalten.
Der Algorithmus der Tick-Erzeugung im Strategietester des MetaTrader 5 Terminals Der Algorithmus der Tick-Erzeugung im Strategietester des MetaTrader 5 Terminals
MetaTrader 5 ermöglicht es uns, den automatisierten Handel innerhalb eines integrierten Strategietesters mithilfe von Expert Advisors und der MQL5-Sprache zu simulieren. Diese Art der Simulation wird als Testen von Expert Advisors bezeichnet und kann mithilfe Multithreading-fähiger Optimierung sowie simultan auf mehreren Instrumenten umgesetzt werden. Um gründlich testen zu können, muss eine Erzeugung von Ticks auf Basis der verfügbaren minütlichen Historie durchgeführt werden. Dieser Beitrag liefert eine detaillierte Beschreibung des Algorithmus, durch den Ticks für Tests auf Basis der Historie im MetaTrader 5 Client Terminal erzeugt werden.
Entdecken der Trading-Strategieklassen der Standard Library - Anpassungsstrategien Entdecken der Trading-Strategieklassen der Standard Library - Anpassungsstrategien
In diesem Artikel werden wir Ihnen zeigen, wie Sie sich mit den Trading-Strategieklassen der Standard Library vertraut machen, wie Sie angepasste Strategien, Filter und Signale hinzufügen als auch wie Sie sich der Patterns-and-Models-Logik des MQL5-Assistenten bedienen. Am Ende wird es Ihnen spielend möglich sein, eigene Strategien via der Standardindikatoren von MetaTrader 5 hinzuzufügen und mittels MQL5-Assistent einen Code für einen hochfunktionalen Expert Advisor zu schreiben.
MetaTrader AppStore - Ergebnisse für  Q3/2013 MetaTrader AppStore - Ergebnisse für Q3/2013
Ein weiteres Quartal des Jahres ist vorbei. Eine gute Gelegenheit für uns, die Ergebnisse des MetaTrader AppStore zusammenzufassen - der größte Platz für Handelsroboter und technische Indikatoren für MetaTrader Plattformen. Zum Ende des abgelaufenen Quartals haben mehr als 500 Entwickler über 1200 Produkte in Market platziert.