Diskussion zum Artikel "Übersetzung von MQL4 in MQL5"

 

Neuer Artikel Wechsel von MQL4 auf MQL5 :

Die Mehrheit der Entwickler von Handelsstrategien haben ganze Sammlungen mit in MQL4 geschriebenen Indikatoren und automatischen Handelssystemen angehäuft. Der Wechsel auf die neue Plattform Metatrader 5 ohne sie macht keinen Sinn. Alles neu zu programmieren, ist sehr mühselig. Wenn es doch bloß ein Wörterbuch zur Übersetzung aus einer in die andere Sprache gäbe, am besten noch mit Beispielen.

Dieser Beitrag bietet eine Kurzanleitung zu den Funktionen der Programmiersprache MQL4 und hilft bei der Umstellung Ihrer Programme von MQL4 auf MQL5. Für jede MQL4-Funktion (mit Ausnahme der Handelsfunktionen) werden die entsprechende Beschreibung und die Bereitstellung in MQL5 vorgestellt, was den Zeitaufwand für den Wechsel erheblich verkürzt. Der Einfachheit halber wurden die MQL4-Funktionen ähnlich wie in der MQL4-Hilfe in Gruppen aufgeteilt.

Autor: Sergey Pavlov

 

Sind Sie sicher, dass es funktioniert????

Eine einfache Kompilierung wirft bereits die Frage auf

und zweitens, was wird diese Funktion zurückgeben!

     CopyClose(symbol,timeframe,start,count,Close);
      return(ArrayMaximum(Close,start,count));

kopiert die Schlusskurse in das Klose-Array, kopiert ab der Position "start" und die Anzahl der "Counts" richtig.

und gibt den Index des maximalen Elements des Kl ose-Arrays zurück, ausgehend von der Position "start" und nur die "count"-Elemente betrachtend......

was ist Ihre Ketzerei sorry für die Offenheit.....

 
 
In den Zellen der Tabellen, in denen "Kein Analogon" steht, sollten Sie eine kurze Beschreibung geben, wie diese Dinge in mql5 gelöst sind, mit Verweisen auf einen bestimmten Abschnitt der Dokumentation (etwas wie z.B. dies: "macht keinen Sinn, weil in mql5 dies und das").
 
CoreWinTT:

Sind Sie sicher, dass es funktioniert????

Ja, es funktioniert.

//+------------------------------------------------------------------+
//|test.mq5 |
//|Copyright DC2008 |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- Zeitreihen-Arrays
double            Close[];
double            Open[];
double            High[];
double            Low[];
long              Volume[];
datetime          Time[];
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(Open,true);
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Volume,true);
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Low,true);

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Comment(
           "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,0),"   Open",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,0),"   Low",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,0),"   High",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,0),"   Close",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,0),"   Volume",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,0),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,0),"   Time",
           "\n",""
           );

  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
            int tf,
            int type,
            int count=WHOLE_ARRAY,
            int start=0)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   if(type<=0)
     {
      CopyOpen(symbol,timeframe,start,count,Open);
      return(ArrayMinimum(Open,start,count));
     }
   if(type==1)
     {
      CopyLow(symbol,timeframe,start,count,Low);
      return(ArrayMinimum(Low,start,count));
     }
   if(type==2)
     {
      CopyHigh(symbol,timeframe,start,count,High);
      return(ArrayMinimum(High,start,count));
     }
   if(type==3)
     {
      CopyClose(symbol,timeframe,start,count,Close);
      return(ArrayMinimum(Close,start,count));
     }
   if(type==4)
     {
      CopyTickVolume(symbol,timeframe,start,count,Volume);
      return(ArrayMinimum(Volume,start,count));
     }
   if(type>=5)
     {
      CopyTime(symbol,timeframe,start,count,Time);
      return(ArrayMinimum(Time,start,count));
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
             int tf,
             int type,
             int count=WHOLE_ARRAY,
             int start=0)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   if(type<=0)
     {
      CopyOpen(symbol,timeframe,start,count,Open);
      return(ArrayMaximum(Open,start,count));
     }
   if(type==1)
     {
      CopyLow(symbol,timeframe,start,count,Low);
      return(ArrayMaximum(Low,start,count));
     }
   if(type==2)
     {
      CopyHigh(symbol,timeframe,start,count,High);
      return(ArrayMaximum(High,start,count));
     }
   if(type==3)
     {
      CopyClose(symbol,timeframe,start,count,Close);
      return(ArrayMaximum(Close,start,count));
     }
   if(type==4)
     {
      CopyTickVolume(symbol,timeframe,start,count,Volume);
      return(ArrayMaximum(Volume,start,count));
     }
   if(type>=5)
     {
      CopyTime(symbol,timeframe,start,count,Time);
      return(ArrayMaximum(Time,start,count));
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
   switch(tf)
   {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
   }
}
 
marketeer:
In den Zellen der Tabellen, in denen "Kein Analogon" steht, sollten Sie eine kurze Beschreibung geben, wie diese Dinge in mql5 gelöst sind, mit Verweisen auf einen bestimmten Abschnitt der Dokumentation (etwas wie z.B. dies: "macht keinen Sinn, weil in mql5 dies und das").

Das ist so zu verstehen, dass die Implementierung zu kompliziert ist und nicht gerechtfertigt ist. Schließlich ist es das Ziel, die MQL4-Funktionen komplett aufzugeben.

Aber ich werde versuchen, es zu berücksichtigen, wenn ich Links zu den MQL5-Funktionen bereitstellen könnte, mit denen man etwas Ähnliches machen kann.

 

Wir nehmen das von der TF m2. Richtig, ich verstehe.

aber es ist nur eine Art Staub in unsere Augen zu werfen. Die TF migrate gibt uns

  default: return(PERIOD_CURRENT);

von 0 bar. Das ist seltsam.

Aber wenn wir es mit 20 versuchen, zum Beispiel.

Du versuchst uns wieder zu verwirren.

und so einen Blödsinn in jeder Funktion.

Und warum sollte man TF migrieren?

wenn mql5 alle TFs hat, die mql4 noch mehr hat......

komplette Ketzerei =))))

Wie konnten eure Moderatoren so etwas übersehen?

Lieber Eugene, ich hoffe, du warst nicht derjenige, der diesen Artikel überprüft hat.

 
CoreWinTT:

komplette Ketzerei =))))

Wie konnten Ihre Moderatoren dies übersehen?

Lieber Eugene, ich hoffe, du hast diesen Artikel nicht gelesen.

Lieber Vasily!

Vielen Dank für Ihren Kommentar, die Funktionen von Abschnitt 18 wurden aktualisiert. Bitte prüfen Sie die aktuelle Version.

Der Autor hat viel Arbeit geleistet, es kann Fehler geben, wir werden sie gemeinsam beheben.

Die Funktion TFMigrate(int tf) wird benötigt, um korrekte Werte von MQL5-Zeitrahmen zu ersetzen. Zum Beispiel ist in MQL4 der numerische Wert der Konstante PERIOD_H1 60, und in MQL5 ist der numerische Wert von PERIOD_H1=16385, d.h. TFMigrate(60)=16385.

 

Ich glaube, es gibt viel mehr Fehler.

weil sie selbst in so einfachen Momenten auftreten, ich würde sogar sagen, in den einfachsten.


In einigen Abschnitten werden Funktionen miteinander verglichen.

in anderen wird eine Analogie geschrieben.


es gibt kein einziges gelungenes Beispiel, wie der Artikel umgesetzt werden kann,

soweit ich das verstanden habe, ist dieser Artikel ein Versuch, etwas von µl4..... zu übernehmen.


Ihre Einstellung zur Überprüfung ist immer bewundernswert.

Ich denke, es ist der unbändige Wunsch des Autors, Ihnen Staub in die Augen zu streuen.

Und das ist ihm sicherlich gelungen.

da ich Ihre Sensibilität für das zu prüfende Material kenne.

 
CoreWinTT:


Was ist, wenn Sie es zum Beispiel mit 20 versuchen?

Sie versuchen schon wieder, mich zu verwirren.

und solchen Unsinn in jeder Funktion.

Und warum sollte man TF migrieren????

wenn mql5 alle TFs hat, die mql4 noch mehr hat......

komplette Ketzerei =)))))


Danke für den Hinweis auf den Fehler. Ich hatte übersehen, dass die Suche auch von anderen Stellen als der Nullleiste aus gestartet werden kann. Hier sind die korrigierten Funktionen:

//+------------------------------------------------------------------+
//|test.mq5 |
//|Copyright DC2008 |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- Zeitreihen-Arrays
double            Close[];
double            Open[];
double            High[];
double            Low[];
long              Volume[];
datetime          Time[];
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(Open,true);
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Volume,true);
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Low,true);

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Comment(Open[0],Close[0],Open[1],Close[1],
           "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,20),"   Open",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,20),"   Low",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,20),"   High",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,20),"   Close",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,20),"   Volume",
           "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,20),
           " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,20),"   Time",
           "\n",""
           );

  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
            int tf,
            int type,
            int count=WHOLE_ARRAY,
            int start=0)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   if(type<=0)
     {
      CopyOpen(symbol,timeframe,start,count,Open);
      return(ArrayMinimum(Open,0,count));
     }
   if(type==1)
     {
      CopyLow(symbol,timeframe,start,count,Low);
      return(ArrayMinimum(Low,0,count));
     }
   if(type==2)
     {
      CopyHigh(symbol,timeframe,start,count,High);
      return(ArrayMinimum(High,0,count));
     }
   if(type==3)
     {
      CopyClose(symbol,timeframe,start,count,Close);
      return(ArrayMinimum(Close,0,count));
     }
   if(type==4)
     {
      CopyTickVolume(symbol,timeframe,start,count,Volume);
      return(ArrayMinimum(Volume,0,count));
     }
   if(type>=5)
     {
      CopyTime(symbol,timeframe,start,count,Time);
      return(ArrayMinimum(Time,0,count));
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
             int tf,
             int type,
             int count=WHOLE_ARRAY,
             int start=0)
  {
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   if(type<=0)
     {
      CopyOpen(symbol,timeframe,start,count,Open);
      return(ArrayMaximum(Open,0,count));
     }
   if(type==1)
     {
      CopyLow(symbol,timeframe,start,count,Low);
      return(ArrayMaximum(Low,0,count));
     }
   if(type==2)
     {
      CopyHigh(symbol,timeframe,start,count,High);
      return(ArrayMaximum(High,0,count));
     }
   if(type==3)
     {
      CopyClose(symbol,timeframe,start,count,Close);
      return(ArrayMaximum(Close,0,count));
     }
   if(type==4)
     {
      CopyTickVolume(symbol,timeframe,start,count,Volume);
      return(ArrayMaximum(Volume,0,count));
     }
   if(type>=5)
     {
      CopyTime(symbol,timeframe,start,count,Time);
      return(ArrayMaximum(Time,0,count));
     }
//---
   return(0);
  }
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
   switch(tf)
   {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
   }
}
 
CoreWinTT:

Ich glaube, es gibt viel mehr Fehler.

weil sie selbst in so einfachen Momenten auftreten, ich würde sogar sagen, in den einfachsten.


In einigen Abschnitten werden Funktionen miteinander verglichen.

in anderen wird eine Analogie geschrieben.


es gibt kein einziges gelungenes Beispiel, wie der Artikel umgesetzt werden kann,

soweit ich das verstanden habe, ist dieser Artikel ein Versuch, etwas von µl4..... zu übernehmen.


Ihre Einstellung zur Überprüfung ist immer bewundernswert.

Ich denke, es ist der unbändige Wunsch des Autors, Ihnen Staub in die Augen zu streuen.

Und das ist ihm sicherlich gelungen.

Ich weiß, wie sensibel Sie mit dem zu prüfenden Material umgehen.


Es mag Fehler geben, das Material ist recht umfangreich.

Das Thema der Portierung (genauer gesagt, das Thema des Schreibens einer Emulatorklasse mit MQL4-Methoden) wurde in einem anderen Artikel aufgegriffen (wir hoffen, dass er fertiggestellt wird). Im Laufe der Lektüre des Materials haben wir den Autor gebeten, einen Artikel in Form eines Nachschlagewerks zu schreiben, um alle Funktionen von MQL4 (mit Ausnahme des Handels - Sie werden bald eine der Lösungen dafür sehen) abzudecken, für jede von ihnen ein Analogon in MQL5 bereitzustellen, im Allgemeinen alles zusammenzustellen, damit diejenigen, die MQL4-Programme neu schreiben, schnell ein Analogon finden können. Was den unbändigen Wunsch angeht, wenn wir über die Anzahl der betrachteten Abschnitte sprechen - wir haben darauf bestanden, alle Funktionen abzudecken (es waren mehr als 250).

Was den Vergleich der Funktionen in einigen Abschnitten betrifft, so handelte es sich nicht wirklich um einen Vergleich. Es war notwendig, ein Analogon anzugeben, auch wenn es dasselbe ist. Für alle Funktionen. Es sieht also so aus, als ob es einen Vergleich gibt, aber man kann aus dem Vergleich erkennen, dass z. B. die Mathefunktionen gleich sind. Übrigens wäre es wahrscheinlich sinnvoll, dies am Anfang eines jeden Abschnitts zu erwähnen, worauf man achten sollte.

Aus diesem Grund (Architektur der Emulator-Funktionen) hatte der Autor einige nicht offensichtliche Dinge in der Implementierung (z.B. für iLowest/iHighest globale Open[]...High[]..., die zuvor global deklariert und in OnInit zu AsSeries gemacht wurden), die wie im Emulator impliziert wurden, natürlich ist es für die Universalität in Funktionen besser, lokale Arrays zu verwenden.

Was die Arbeit mit technischen Indikatoren betrifft, so kann es viele Fragen geben, die Arbeit mit ihnen sollte nicht wie in MQL4 sein - es ist besser, sie manuell in OnInit zu erstellen und auf Deskriptoren zu verweisen, anstatt sie jedes Mal in lokalen Funktionen zu erstellen. Aber der vom Autor vorgeschlagene Ansatz funktioniert auch, weil das Terminal die Indikatoren nicht sofort zerstört. Es gibt also eine Reihe von Feinheiten.

Das Wichtigste ist, dass es jetzt etwas zu diskutieren gibt, wenn Sie Fehler finden (einschließlich derer, die durch die vorgeschlagene Struktur der Funktionen verursacht werden) - bieten Sie Ihre Varianten an.