Diskussion zum Artikel "Übersetzung von MQL4 in MQL5" - Seite 3

 

Ich schlage vor, double MarketInfo(string symbol, int type) als eine Reihe von Funktionen zu migrieren, die verschiedene Datentypen zurückgeben, je nach Spezifikation der Eingabeparameter


Zum Beispiel, diese Funktionen:

int MarketInfoInt(string symbol, int type);

string MarketInfoStr(string symbol, int type)....

Ich habe einmal mit den Entwicklern über REFERENCES und Ergebnisse von Funktionen kommuniziert, aber sie weigerten sich, dies zu tun (und das ist schade).


PS

Auf dieser Grundlage denke ich, dass die beste Lösung für diesen Moment die MarketInfo-Bibliothek sein wird, die alle erforderlichen Funktionen enthält.

Übrigens ist das genau das, was ich in meiner eigenen Bibliothek gemacht habe :)

 
Interesting:

Meiner Meinung nach sind zwei Funktionen erforderlich, um TF in einer Migrationsumgebung zu handhaben:

1. Konvertiert die Anzahl der Sekunden in TF - sagen wir ENUM_TIMEFRAMES SecondToPeriod (int Value);

2. Konvertiert den Zeitraum in Sekunden - sagen wir int PeriodToSecond(ENUM_TIMEFRAMES Value).


Das habe ich in meinem Migrationsmodul gleich zu Beginn erfolgreich getan (es gibt auch eine DLL-Option).


PS

Um die Konformität mit MQL4 zu maximieren, habe ich persönlich alle nicht standardmäßigen Perioden abgeschafft



die Funktion ist gut und nützlich, aber die Ausführung....

Ich würde es auf diese Weise machen

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void FixTF(int &tf)
  {
   switch(tf)
     {
      case 0: tf = 0;break;
      case 1: tf = PERIOD_M1;break;
      case 5: tf = PERIOD_M5;break;
      case 15: tf = PERIOD_M15;break;
      case 30: tf = PERIOD_M30;break;
      case 60: tf = PERIOD_H1;break;
      case 240: tf= PERIOD_H4;break;
      case 1440: tf=PERIOD_D1;break;
      case 10080: tf = PERIOD_W1;break;
      case 43200: tf = PERIOD_MN1;break;
      default: tf=0;break;
     }
  }
//+------------------------------------------------------------------+



in allen Funktionen müssen Sie nur die Größe der Arrays zu definieren

genau wie az buki vedi.

 
CoreWinTT:

die Funktion ist gut und nützlich, aber die Ausführung..... ist Ketzerei.

ihre arbeit??

WHERE BREAK!!!!!! trauernde Programmierer!!!!


Warum ist return schlechter als break?
 
Ich bitte um Entschuldigung.
 
CoreWinTT:

in allen Funktionen müssen Sie nur die Größe der Arrays
einfach als az'buki vedi definieren.

Nicht immer, siehe Abschnitt Zugang zu Zeitreihen und Indikatoren:

Funktionen für die Arbeit mit Zeitreihen und Indikatoren. Eine Zeitreihe unterscheidet sich von einem normalen Array dadurch, dass die Indizierung der Zeitreihenelemente vom Ende des Arrays zum Anfang erfolgt (von den jüngsten Daten zu den ältesten). Es wird empfohlen, für das Kopieren der Werte von Zeitreihen und Indikatoren nur dynamische Arrays zu verwenden, da die Kopierfunktionen die erforderliche Größe der Array-Empfänger von Werten unabhängig zuweisen.

Es gibt eine wichtige Ausnahme vondieser Regel : Wenn das Kopieren von Zeitreihen- und Indikatorwerten häufig erfolgen soll, z. B. bei jedem Aufruf von OnTick() in Expert Advisors oder bei jedem Aufruf von OnCalculate() in Indikatoren, dann ist es in diesem Fall besser, statisch verteilte Arrays zu verwenden, da die Speicherzuweisungsoperationen für dynamische Arrays zusätzliche Zeit erfordern und dies die Prüfung und Optimierung von Expert Advisors beeinträchtigt.

 
Rosh:

Nicht immer, siehe Zugang zu Zeitreihen und Indikatoren:


Wie meine Praxis zeigt, ist es besser, es zu tun als nicht.

Andernfalls erscheint ein Datenzugriffsfehler

besonders bei globalen Arrays.


Erstens, weil in einem Array mit einer bestimmten Größe die Indizierung statisch ist und es nicht diese gefährlichen Momente von Arrays von Inverts gibt.

zweitens wird der Platz für Arrays sparsamer vergeben

und drittens ist die Wahrscheinlichkeit eines Array-Zugriffsfehlers um ein Vielfaches geringer.

Deshalb glaube ich, dass diese Funktionen einfach eine Funktion zur Bestimmung der Arraygröße brauchen.

 
CoreWinTT:

die Funktion ist gut und nützlich, aber hier ist die Ausführung....

Ich würde es so machen

Der Artikel wurde geändert:

  • die Funktion TFMigrate() in ihrer ursprünglichen Form wiederhergestellt
  • Funktionen in Abschnitt 18 geändert
 
iMAOnArray(...) Funktion zum Referenzhandbuch hinzugefügt
 
Die Funktion iMAOnArray wurde korrigiert. Im Modus MODE_SMA wurde die Berechnungszeit erheblich reduziert.
 

Ich begann, an der Funktionalität dieses Entwurfs zu zweifeln. Egal wie sehr ich mich bemühte, die Logik des Blocks zu verstehen, ich konnte es nicht (und ich habe mich sehr bemüht) ....

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }