Analog zu iBarShift - Seite 14

 
fxsaber:

Dann verstehe ich nicht, warum Bars meint, dass 18:00:01 zu M1-Takt 18:01 und nicht 18:00 gehört.

Und die Logik hier ist die gleiche wie die Tatsache, dass meine Tochter jetzt ihren zweiten Geburtstag hat, obwohl sie erst vor einer Woche ein Jahr alt geworden ist. Oder heute ist der 09.04.2018, obwohl der 01.01.00 vor 2017 Jahren, 3 Monaten und 8 Tagen war.

Übrigens: TimeCurrent muss durch SYMBOL_TIME ersetzt werden.

Danke! Ich wusste wirklich nicht, dass es eine solche Kennung gibt.

 

Übrigens, als ich die Korrektheit des iBars-Algorithmus durch Vergleich mit der Bars-Referenz in MQL4 getestet habe, indem ich zufällig verschiedene Varianten ausprobiert habe, habe ich einen Fehler in Bars gefunden:

Print(Bars(_Symbol,PERIOD_MN1,D'2005.08.31 00:00:00',D'2005.08.31 23:00:00')); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print(Bars(_Symbol,PERIOD_MN1,D'2006.08.31 00:00:00',D'2006.08.31 23:00:00')); // 0

Es gibt keinen solchen Fehler in MQL5.

Natürlich ist es nicht signifikant, da es nur in TF = MN1, an den Daten 30 und 31, stop_time = 23 und nur vor 2005 erscheint :)))

Hier ist das Skript für MQL4, die es fängt, und iBars stellte sich heraus, mehr Referenz als native Bars sein.

Dateien:
TestiBars.mq4  10 kb
 
fxsaber:


Übrigens: TimeCurrent sollte durch SYMBOL_TIME ersetzt werden.

Nein, das müssen Sie nicht.
Es wird nicht zur Korrektheit beitragen, denn TimeCurrent() ist universell für alle Symbole, weil es die letzte Ankunftszeit des Kurses für alle Symbole zurückgibt, nicht die aktuelle.

Gleichzeitig ist SymbolInfoInteger(symbol_name,SYMBOL_TIME) sehr langsam im Vergleich zu TimeCurrent(), und diese Zeit wird bei jedem Aufruf von iBars benötigt

 

Für diejenigen, die es interessiert.

Bearbeitete Version von iBars (ähnlich den eingebauten Bars, nur ohne Pannen und schneller).

Einige Bugs wurden behoben.

Wenn Sie bemerkt haben, dass Ihr MQL5-Code plötzlich für 10-20 Sekunden hängt und die Funktion Bars hat, die 0 zurückgeben kann, dann empfehle ich dringend, ihn durch diese Version zu ersetzen.
Es wird schneller und ohne Hänger funktionieren.

int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }
 
Nikolai Semko:

Bearbeitete Version von iBars(ähnlich den eingebauten Bars, nur ohne Pannen und schneller).

Einige Bugs wurden behoben.

Die eingebaute Funktion Bars() ist überladen:

1. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe)
2. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time)

Sie haben nur ein Anrufformular.

 
Artyom Trishkin:

Die eingebaute Funktion Bars() wird überladen:

Sie haben nur ein Formular aufzurufen.

Wenn Sie ein kurzes Formular benötigen, können Sie das integrierte Formular verwenden. Dort gibt es kaum Störungen.

 
Nikolai Semko:

Nein, das ist nicht notwendig.
Es wird nicht zur Korrektheit beitragen, da TimeCurrent() universell für alle Symbole ist, da es die letzte Ankunftszeit des Angebots für alle Symbole zurückgibt, nicht die aktuelle.

SymbolInfoInteger(symbol_name,SYMBOL_TIME) ist sehr langsam im Vergleich zu TimeCurrent(), und diese Zeit wird jedes Mal benötigt, wenn iBars aufgerufen wird

Cotypes können für alle Charaktere gelten, außer für den, der von Interesse ist.

Ok, ich habe mir die neue Quelle angesehen. Ich habe gesehen, dass die besprochenen Änderungen nicht vorgenommen wurden. Ich bin raus.

 
Warum machen das die Entwickler nicht selbst?
 
Es wäre viel bequemer für die Benutzer, eine Funktion aufzurufen und ein synchronisiertes (zeitlich abgestimmtes) Array von Zeilen über mehrere Instrumente zu erhalten
 
Übrigens, zur Funktion Bars(). Dies könnte die Ursache für den Durchbruch sein.