Analog zu iBarShift - Seite 7

 

Hier ist die schnellste, korrekt funktionierende Version für alle TFs:

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

Verlangsamung der Geschwindigkeit für TF D1, W1 und MN1

Und hier ist ein Testindikator, der die Reaktion der verschiedenen Versionen sowie ihre Geschwindigkeit deutlich zeigt (die zweite Zahl. Je kleiner die Zahl, desto schneller die Funktion)


Sowohl die Version 3 als auch die Version 4 funktionieren korrekt. Aber der 3. ist schneller.

Die Varianten mit CopyTime sind am langsamsten.

Dies kann in MQL4 überprüft werden (siehe Indikator im Anhang).

Ich gebe die Urheberschaft der verschiedenen Varianten nicht an, weil ich bereits durcheinander gekommen bin.
Aber der dritte, nützlichste Weg ist 80% von@fxsaber. Ich habe nur ein wenig daran herumgeschraubt.

Dateien:
 
Nikolai Semko:

Die beiden Optionen 3 und 4 funktionieren korrekt. Aber 3 ist die schnellste. Die CopyTime-Varianten sind am langsamsten.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Diskussion über "LifeHack für Trader: ForEach auf Defines (#define) mischen"

fxsaber, 2018.02.14 11:58

ZZY Function Geschwindigkeitsmessungen sollten in einer Umgebung gemessen werden, in der Leistung wichtig ist - Tester.

 
fxsaber:

Die Maße sind hier nicht wirklich von Bedeutung. Sie können sehen, dass die Logik am schnellsten ist.

 
Nikolai Semko:

Hier ist die schnellste, korrekt funktionierende Version für alle TFs:

Verlangsamung der Geschwindigkeit für TF D1, W1 und MN1

Und hier ist ein Testindikator, der die Reaktion der verschiedenen Versionen sowie ihre Geschwindigkeit deutlich zeigt (die zweite Zahl. Je kleiner die Zahl, desto schneller die Funktion)


Beide Versionen 3 und 4 funktionieren korrekt. Aber der 3. ist schneller.

Die Varianten mit CopyTime sind am langsamsten.

Sie kann in MQL4 überprüft werden (siehe Indikator im Anhang).

Ich gebe keine Hinweise auf die Urheberschaft der verschiedenen Varianten, weil ich bereits verwirrt bin.
Aber die dritte, am besten funktionierende Variante ist 80% von@fxsaber. Ich habe sie nur ein wenig verändert.

Ich habe TF zu Ihrem Indikator hinzugefügt - die ersten beiden Algorithmen sind überhaupt nicht nützlich.

In den Zahlen ist die aktuelle TF H1, und die Berechnung basiert auf Tagessätzen.



 
Renat Akhtyamov:
Ja (hervorgehoben)

-1 ist eine Eins minus (zur Verdeutlichung), die von der Fehlerfunktion zurückgegeben wird und besagt, dass es keinen solchen Balken gibt.

Also meine Funktion

muss ebenfalls verfeinert werden

Obwohl...

Dokumentation:

"Hinweis.

Wenn die Daten für die Zeitreihe mit den angegebenen Parametern beim Aufruf der Funktion Bars() noch nicht im Terminal generiert wurden oder die Daten der Zeitreihe zum Zeitpunkt des Funktionsaufrufs nicht mit dem Handelsserver synchronisiert sind, dann wird die Funktion den Wert Null zurückgeben. "

====

Wenn res==0, dann fangen wir -1 von der Funktion, wie sie ist.

===

Es funktioniert also alles, nutzen Sie es zu Ihrem Vorteil!

Anhand des obigen Indikators können Sie deutlich sehen, wie falsch diese Methode ist.

 
Nikolai Semko:

Hier ist die schnellste, korrekt funktionierende Version für alle TFs:

Verlangsamung der Geschwindigkeit für TF D1, W1 und MN1

Und hier ist ein Testindikator, der die Reaktion der verschiedenen Versionen sowie ihre Geschwindigkeit deutlich zeigt (die zweite Zahl. Je kleiner die Zahl, desto schneller die Funktion)


Sowohl die Version 3 als auch die Version 4 funktionieren korrekt. Aber der 3. ist schneller.

Die Varianten mit CopyTime sind am langsamsten.

Sie kann mit MQL4 überprüft werden (siehe beigefügten Indikator).

Ich gebe die Urheberschaft der verschiedenen Varianten nicht an, weil ich bereits durcheinander gekommen bin.
Aber die dritte, am besten funktionierende Variante ist 80% von@fxsaber. Ich habe nur ein wenig daran herumgeschraubt.

DieiBarShift3-Variante funktioniert nicht korrekt.

 

Hier ist meine Version. Scheint sowohl mit Junior- als auch mit Senior-Rahmen zu funktionieren. Die Geschwindigkeit ist ein wenig höher als bei iBarshift3.


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

datetime t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

double div = Zeit/(double)ps;

double mant = div - MathFloor(div);

int ret = Bars(symbol, timeframe, (datetime)(time-(ps*mant)), t1)-1;

return(ret);

}

 
Vitaly Muzichenko:

Die OptioniBarShift3 funktioniert nicht korrekt.

Kann ich ein Beispiel dafür haben, dass es nicht richtig funktioniert?

Bleibt also nur noch Option vier?

 
Vitaly Muzichenko:

Die OptioniBarShift3 funktioniert nicht richtig.

Wortgewandtheit ist unser Ein und Alles.

 
Nikolai Semko:

Der Wortschatz ist unser Ein und Alles.

Ich habe eine schnelle Überprüfung: es gibt eine Funktion, die für mehr als einen Tag gearbeitet hat, ersetzte ichiBarShift3 statt und bekam die EA falsch zu arbeiten. So bin ich zu meinem Schluss gekommen.

Hier ist die von mir verwendete Version

int iBarShift(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false) {
 datetime LastBAR;
  if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR)) {
   datetime opentimelastbar[1];
    if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
      LastBAR=opentimelastbar[0];
    else
      return(-1);
  }
//--- if time > LastBar we always return 0
  if(time>LastBAR)
    return(0);
//---
 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);
  }
  return(-1);
 }
Grund der Beschwerde: