Diskussion zum Artikel "Fertige Expert Advisors von MQL5 Wizard laufen auf MetaTrader 4"

 

Neuer Artikel Fertige Expert Advisors von MQL5 Wizard laufen auf MetaTrader 4 :

Im Artikel wird ein einfacher Emulator der MetaTrader 5 Handelsumgebung für den MetaTrader 4 vorgestellt. Mithilfe des Emulators werden Handelsklassen der Standardbibliothek übertragen und angepasst. Dementsprechend können die Expert Advisors, die MetaTrader 5 Wizard erzeugt, in MetaTrader 4 kompiliert und unverändert gestartet werden.

Wenn man will, kann man sich vergewissern, dass es keine Verarbeitungsfehler der Orders im Journal gibt.‌

Auf dem Chart EURUSD M15 sieht der Handel des Expert Advisors normal aus, inklusive das Setzen der Stop Loss und Take Profit Levels.

Ein Fenster mit dem Chart, dass die Arbeit eines Expert Advisors, der im MetaTrader 5 Wizard generiert wurde, in MetaTrader 4 veranschaulicht

Fenster mit dem Chart, der die Arbeit des Expert Advisors von dem MetaTrader 5 Wizard in MetaTrader 4

Autor: Stanislav Korotky

 

An den Autor Danke!

MT4-Nutzer werden MT5 zumindest um des Assistenten willen installieren - cleveres Marketing? Nur teilweise.

Jetzt befriedigt der Artikel die Neugier der Programmierer - wie ist er implementiert? Aber nicht die der Anwender.

Das Marketing erfordert einen weiteren Artikel auf einer anderen Ebene, in dem Schritt für Schritt beschrieben wird, was man drücken muss, damit der Wizard in MT4 funktioniert.

Dann werden die Benutzer anfangen, ihre Erfahrungen in diesem Geschäft mit anderen wie ihnen zu teilen. Oder ich verstehe nichts vom Marketing.

 
fxsaber:

An den Autor Danke!

MT4-Nutzer werden MT5 zumindest um des Assistenten willen installieren - cleveres Marketing? Nur teilweise.

Jetzt befriedigt der Artikel die Neugier der Programmierer - wie ist er implementiert? Aber nicht die der Anwender.

Das Marketing erfordert einen weiteren Artikel auf einer anderen Ebene, in dem Schritt für Schritt beschrieben wird, was man drücken muss, damit der Wizard in MT4 funktioniert.

Dann werden die Benutzer anfangen, ihre Erfahrungen in diesem Geschäft mit anderen wie ihnen zu teilen. Oder ich verstehe nichts vom Marketing.

Schreiben ist kein Problem. Aber es ist unwahrscheinlich, dass es ein Artikel sein wird. Diese Informationen sind bereits im Artikel enthalten und nehmen nur ein paar Absätze ein.

Um der Genauigkeit willen möchte ich darauf hinweisen, dass der Assistent NICHT im MT4 funktioniert, ein solcher Assistent ist nur im MT5 verfügbar. Generierte Expert Advisors sollten funktionieren, aber wahrscheinlich nicht alle.

 

Zum Vergleich empfehle ich eine Testversion von Tick Data Suite (Kompatibel: MT4 build 940 - 1052).

Wählen Sie im MT5-Tester den Modus "nach echten Ticks". Speichern Sie sie und füttern Sie sie über TDS in den MT4-Tester.

Dann werden die Kurse in beiden Testern zu 100% übereinstimmen, was es ermöglicht, sie nicht nur nach Trades, sondern auch nach Geschwindigkeit zu vergleichen.

Wir könnten dann die Umsetzung/Erstellung von EAs in beide Richtungen vergleichen.

 

Es gibt so ein Phänomen wie die Veröffentlichung von EAs in kodobase als Ergebnis einer MT4 -> MT5 Konvertierung über SB.

Es scheint, dass der Artikel von solchen Autoren zur Selbstüberprüfung genutzt werden kann. Wenn die Konvertierung korrekt ist, dann sollte die umgekehrte Konvertierung über MT5Bridge ein identisches Ergebnis wie das MT4-Original liefern.

 
fxsaber:

Es gibt so ein Phänomen wie die Veröffentlichung von EAs in kodobase als Ergebnis einer MT4 -> MT5 Konvertierung über SB.

Es scheint, dass der Artikel von solchen Autoren zur Selbstüberprüfung genutzt werden kann. Wenn die Konvertierung korrekt ist, dann sollte eine umgekehrte Konvertierung über MT5Bridge ein identisches Ergebnis wie das MT4-Original liefern.

Forum zum Thema Trading, automatisierte Handelssysteme und Testen von Handelsstrategien

MT4-Tester VS MT5-Tester

fxsaber, 2017.05.08 15:12

Habe deinen Code über die MT5Bridge in MT4 konvertiert. MT4build1072

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)


Original-Code

EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)


Die Ergebnisse nach der Konvertierung sind identisch! Die Geschwindigkeit ist um die Hälfte gesunken.

 

Meine MT5 EA (generiert, aber mit seiner eigenen Implementierung von CExpertSignal anstelle von Standard-Indikatoren) mit Ihrem umfasst kompiliert und getestet auf MT4 ohne Probleme, danke!

Aber jetzt schickte ich den Expert Advisor zu real, und es stellte sich heraus, dass es nicht den Handel überhaupt. Keine Fehler, nichts wird angezeigt. Er handelt einfach nicht. Ich habe lange im Code gewühlt und den Grund gefunden - die Funktion bool CTrade::FillingCheck(const string symbol) in Trade.mqh.

Diese Prüfung wird für Marktaufträge ausgelöst.

// Ermitteln der möglichen Füllungstypen nach Symbol
  uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
  // Ausführungsmodus erneut prüfen
  if(exec == SYMBOL_TRADE_EXECUTION_MARKET)
  {
    // für den Ausführungsmodus MARKET
    // Auftrag analysieren
    if(m_request.action != TRADE_ACTION_PENDING)
    {
      // im Falle eines Sofortausführungsauftrags
      // wenn die erforderliche Ausfüllrichtlinie unterstützt wird, fügen Sie sie der Anfrage hinzu
      if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0)
      {
        m_request.type_filling = m_type_filling;
        return(true);
      }
      // falsche Befüllungsrichtlinie, Fehlercode setzen
      m_result.retcode = TRADE_RETCODE_INVALID_FILL;
      return(false);
    }
    return(true);
  }

In meinem Fall sind sowohl m_type_filling als auch filling gleich Null, so dass die Funktion false zurückgibt.
filling sollte nach der Logik des Codes nicht gleich Null sein, aber laut der Hilfe ist SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) für MT4 nicht unterstützt. Deshalb funktioniert die Prüfung im Testprogramm aus irgendeinem Grund, und vielleicht auch bei einigen Brokern im realen Handel. Aber es hat bei mir nicht funktioniert, bisher habe ich die Funktion nur so geändert, dass der ganze Code übersprungen wird und die Funktion true zurückgibt.

 
Dr. Trader:

Diese Prüfung funktioniert für Market Orders.

In meinem Fall sind sowohl m_type_filling als auch filling gleich Null, so dass die Funktion false zurückgibt.
filling sollte nach der Logik des Codes nicht gleich Null sein, aber laut der Hilfe wird SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) für MT4 nicht unterstützt. Deshalb funktioniert die Prüfung im Testprogramm aus irgendeinem Grund, und vielleicht auch bei einigen Brokern im realen Handel. Aber bei mir hat es nicht funktioniert, bisher habe ich die Funktion nur so geändert, dass der ganze Code übersprungen wird und die Funktion true zurückgibt.

Vielen Dank für die Nachricht. Darauf war ich noch nicht gestoßen. Diese Methode wird unverändert gelassen. Anscheinend ist es notwendig, alle Füllvariablen auf bestimmte Konstanten zu setzen, je nach Art der Order und/oder des Instruments (wahrscheinlich kann dies nicht auf irgendeine Weise über die API herausgezogen werden, und der Tester verwendet einige Standardwerte). Wenn jemand weiß, wie MT4 die Füllung intern auswählt, bitte mitteilen.

 
Stanislav Korotky:

Wenn jemand weiß, wie MT4 intern die Füllung auswählt - bitte mitteilen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Besonderheiten der mql5 Sprache, Feinheiten und Techniken der Arbeit

fxsaber, 2017.02.25 16:12

// Gibt die Auftragsausführungsart gleich Type zurück, wenn sie auf Symb verfügbar ist, ansonsten ist sie korrekt.
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
Anwendung
Request.type_filling = GetFilling(Request.symbol);
Habe noch nicht überprüft, ob der Fehler mit den Stop-Orders behoben wurde.
 
fxsaber:

Danke, kann dieser Code leicht geändert werden, um ein Analogon von SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) für MT4 zu erhalten. Die Funktion sollte nicht ENUM_ORDER_TYPE_FILLING zurückgeben, sondern (SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC).

ORDER_FILLING_FOK = 0, ORDER_FILLING_IOC = 1, während SYMBOL_FILLING_FOK = 1 und SYMBOL_FILLING_IOC = 2 ist, so dass Sie das Ergebnis einfach um 1 inkrementieren können.

//funtion liefert den Symbolfüllmodus, auch bekannt als SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) für MT4.
//Parametertyp - Art der Auftragsbefüllung
uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
  const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
  const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);

  return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
         (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type) + 1;
}

Und dann rufen Sie den Code in der Funktion bool CTrade::FillingCheck(const string symbol)

uint filling = GetSymbolFilling(symbol, m_type_filling);
//anstelle von
//uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);


Aber eigentlich ist es nur eine Code-Anpassung, damit es funktioniert. Es ist besser, dies nicht zu tun und eine korrekte Lösung zu finden.

 

Guten Tag Herr Stanislav Korotky, ich hoffe, Sie sind gut tun.

Ich finde Ihren Artikel sehr interessant und ich habe versucht, Ihren Anweisungen zu folgen, wie man einen vorgefertigten MT5 EA kompatibel zu MT4 macht.

Aber ich bekomme die folgende Fehlermeldung, könnten Sie mir bitte sagen, wie ich den Fehler beheben kann?

Was ich tat, nachdem ich Ihrer Anleitung gefolgt war: Ich habe einfach die MQL5-Quelldatei und das MQL5-Programm kopiert und sie dann in das Hauptverzeichnis des Expert-Ordners eingefügt

und ich bekam so viele Fehler.

Könnten Sie mir sagen, wie ich vorgehen kann, um die generierte EA von MQL5 Arbeit in MT4?

Unten sind die angehängten Fehler Bilder.

Dateien:
Capture_1.PNG  52 kb
Capture_2.PNG  53 kb
Capture_3.PNG  56 kb
Capture_4.PNG  51 kb
Capture_5.PNG  59 kb
Capture_6.PNG  22 kb