Analog zu iBarShift - Seite 11

 
Nikolai Semko:

Ja, das ist wirklich ein seltsames Verhalten für eine Standardfunktion. Schließlich geht es genau um die Anpassung von Werten an den "Benchmark".

Die Standardfunktion iBarShift von MQL4 gibt, wenn die angefragte Zeit in ein Loch fällt, die linke Taktnummer zurück (d.h. in diesem Fall Samstag), und iBarShift3 gibt die rechte Taktnummer des Lochs zurück (d.h. Montag), was mehr Sinn macht.

Wenn wir im Loch sind, ist es logisch, den linken Balken, den letzten bekannten Wert, zurückzugeben, aber nicht die Zukunft.

 
Vitaly Muzichenko:

Wenn wir uns in einem Loch befinden, ist es logisch, den linken Balken, also den letzten bekannten Wert, zurückzugeben, nicht aber die Zukunft.

Richtig, ich rede Unsinn. Ich habe die Vergangenheit mit der Zukunft verwechselt.) Wahrscheinlich, weil 1 (Vergangenheit) > 0 (Zukunft). Programmiert.
 
Alain Verleyen:


In den meisten Fällen liefert diese Funktion das falsche Ergebnis

PS: Ist es notwendig, die englische Version zu posten oder ist die russische Übersetzung korrekt?

Ja, die Übersetzung ist korrekt.

Führen Sie dieses Skript aus und Sie werden sehen, dass die Funktionen genau das gleiche Ergebnis liefern.

Können Sie ein Beispiel für einen Zeitrahmen und den Zeitpunkt nennen, zu dem die Werte dieser Funktionen unterschiedlich sind?

Übrigens wird Ihre Funktion oft falsch eingeschätzt. Gibt den Wert -1 zurück

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
Dateien:
 
Alain Verleyen:

Die Anforderung ist, NUR eine Version von mql4 zu haben.


Ihre Funktion arbeitet nicht korrekt mit dem Parameter exact=true.

Dies ist in diesem Skript zu sehen.

Und hier ist ein voll funktionsfähiges Analogon der iBarShift-Funktion mit genauen Parametern:

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

Ohne diesen Parameter kann sie auf diese Form vereinfacht werden:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Dateien:
 
Nikolai Semko:

Ja, die Übersetzung ist korrekt.

Führen Sie dieses Skript aus und Sie werden sehen, dass die Funktionen genau das gleiche Ergebnis liefern.

Können Sie ein Beispiel für einen Zeitrahmen und den Zeitpunkt nennen, zu dem die Werte dieser Funktionen unterschiedlich sind?

Übrigens, Ihre Funktion wird oft falsch verstanden. Gibt den Wert -1 zurück

Bitte seien Sie ernsthaft. Mein Code ist für mql5.

Sie gibt -1 zurück, da die Funktion Bars() unter MT4 unzuverlässig ist.

...   
   int shift=Bars(symbol,timeframe,time,LastBAR);

   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
...

Das Skript läuft auf dem AUDUSD, M5-Chart.

Dies ist bei MT5 nicht der Fall.

 
Alain Verleyen:

Bitte seien Sie ernsthaft. Mein Code ist für mql5.

Sie gibt -1 zurück, da die Funktion Bars() unter MT4 unzuverlässig ist.

Das Skript läuft auf dem AUDUSD, M5-Chart.

Dies ist bei MT5 nicht der Fall.

Sie sagten, es sollte wie in MQL4 funktionieren.

Aber dieses Skript kann auch auf MQL5 ausgeführt werden

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

Bei exact=True und zukünftiger Zeit muss -1 zurückgegeben werden.

Mein Skript hat auch einen seltsamen Fehler gefunden:

Dieser Fehler wird durch diese Prüfung bestätigt:

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
Ich hatte also doch Recht, dasses in Ihrem Algorithmus anormale Situationen gibt.
Dateien:
 

Aus all den Analysen, die ich durchgeführt habe, können wir schließen, dass dieses vollständige Analogon des iBarShift:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

ist bei weitem die korrekteste, gleichzeitig die schnellste und mit dem einfachsten und kürzesten Algorithmus.

Wenn Sie die genauen Parameter nicht benötigen, können Sie die vereinfachte Version verwenden:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

oder verwenden Sie einfach diese äquivalente Version ohne Aufruf der Funktion:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Oder liege ich da falsch?
 
Schweigen ist ein Zeichen der Zustimmung.
 
Nikolai Semko:
Schweigen ist ein Zeichen der Zustimmung.

Durch CTRL+SHIFT+F in ME eine Suche nach "BarShift" durchgeführt. Es hat sich herausgestellt, dass ich eine ähnliche Funktion nicht verwende. Ich selbst habe es offensichtlich nicht gebraucht.

Ich habe einmal eine Variante geschrieben, um MT4 EAs in einer Zeile nach MT5 zu konvertieren. Das scheint der einzige Grund zu sein, ihn zu schreiben.

Ich arbeite nicht mit Bars und verstehe nicht, warum alle anderen das nicht auch tun.

Ich bin nicht in Ihren Code eingedrungen. Aber man ist immer froh, wenn man eine schnelle Lösung bekommt.

 
fxsaber:

Durch CTRL+SHIFT+F in ME eine Suche nach "BarShift" durchgeführt. Es hat sich herausgestellt, dass ich eine ähnliche Funktion nicht verwende. Ich selbst habe es offensichtlich nicht gebraucht.

Ich habe einmal eine Variante geschrieben, um MT4 EAs in einer Zeile nach MT5 zu konvertieren. Das scheint der einzige Grund zu sein, ihn zu schreiben.

Ich arbeite nicht mit Bars und verstehe nicht, warum alle anderen das nicht auch tun.

Ich bin nicht in Ihren Code eingedrungen. Aber man ist immer froh, wenn man eine schnelle Lösung bekommt.

Ich verstehe, was Sie meinen, aber die Arbeit mit Stäben ist für mich immer noch dringend. Vielleicht wird es eines Tages auch für mich zu einem Rudiment.