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

 
Interesting :

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) ....

Woher kommen die Zweifel? Er zählt korrekt.

//+------------------------------------------------------------------+
//|test.mq5 |
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
DC2008 :

Wo liegt das Problem? Er rechnet richtig.

Und jetzt kommt der Hokuspokus


1. Im MT4 schreiben wir diese Zeile und führen den Code auf H4 aus

Print(iBarShift(Symbol(),Period(),1274356800,false)); //Datum 20.05.2010 12:00 Uhr

Dann machen wir das Gleiche mit MT5 und dem String.

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

Als Ergebnis erhalten wir 8.


2. Danach machen wir genau die gleiche Operation, aber mit D1.

Das Ergebnis ist, dass MT4 - 1 und MT5 0 zurückgibt.

Wer kann mir nun sagen, inwieweit diese Implementierung von iBarShiftMQL4 den notwendigen...

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);
  }
 

Versuchen Sie dies:

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)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

Noch einmal: Haben Sie die Funktion, über die Sie schreiben, gelesen?

Auf mcl4 ist sie genau so geschrieben

double iClose( string symbol, int timeframe, int shift)
Gibt den Wert des Schlusskurses des Balkens aus dem entsprechenden Chart(Symbol, Zeitrahmen) zurück, der durch den Parameter shift angegeben wurde. Im Falle eines Fehlers gibt die Funktion 0 zurück. Um weitere Informationen über den Fehler zu erhalten, rufen Sie die Funktion GetLastError() auf.
Für den aktuellen Chart befinden sich die Informationen über die Schlusskurse im vordefinierten Close[]-Array.

und Sie haben....

return(-1);

was sehen die Moderatoren...

 

Danke, CoreWinTT.

Korrigierte Funktionen: iClose, iLow, iHigh, iOpen, iTime, iVolume. Sie geben im Falle eines Fehlers 0 statt -1 zurück.

 

und wann werden sie in der Bibliothek sein???

so dass sie zumindest

Denn wenn man sie öffnet, stellt sich die Frage, und die Bedeutung der oben geschriebenen????.

und auch mindestens die Funktionen zu sammeln, für die alle Fragen gelöst sind und fahren Sie fort, Fehler in den Rest zu studieren.

 
bool  SetIndexBuffer(
   int                    index,         // Pufferindex
   double                 buffer[],      // array
   ENUM_INDEXBUFFER_TYPE  data_type      // was wir speichern werden
   );

Neulich schlug jemand eine clevere Methode zur Schaffung einer μl4-Umgebung vor

durch die Verwendung von Arrays von

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

aber es wird schwierig sein, sie zu verwenden, weil sie einen konstanten Zustand haben.

Man kann keine globalen Puffer erstellen

erstellen, da sie mit Hilfe von deklariert werden müssen.

SetIndexBuffer

Assoziiert den angegebenen Indikatorpuffer mit einem eindimensionalen dynamischen Array vom Typ double, das global deklariert ist.

aber nur vom Typ double, und Volumen und Arrays vom Typ date-time werden nicht akzeptiert.

Das Einzige, was bleibt, ist, diese Arrays innerhalb des mql4-Moduls zu initiieren.

was praktisch gleichbedeutend mit dem Neuschreiben des Indikators.... ist.

 
CoreWinTT:

und wann werden sie in der Bibliothek sein???

Das sind sie bereits.
 
es ist leer und war leer und nur eine Reihe von Definitionen und nichts mehr....
 
CoreWinTT:

und wann werden sie in der Bibliothek sein???

so dass sie zumindest

Denn wenn man sie öffnet, stellt sich die Frage, und die Bedeutung der oben geschriebenen????.

und auch zumindest die Funktionen sammeln, für die alle Fragen gelöst sind, und mit den Fehlern im Rest fortfahren.

In privaten Bibliotheken gibt es seit langem viele Lösungen zu diesem Thema.

Ich z.B. benutze IsTesting() und ähnliche Dinge von Anfang an, auch alles mit Datum und Zeit ist schon lange gelöst (natürlich gibt es auch andere Lösungen)....

Eine andere Sache ist das Vorhandensein solcher "veralteter Lösungen" in MT5 selbst...