Analog zu iBarShift - Seite 9

 
Alain Verleyen:

Welches Problem haben Sie gefunden?

Hier ein Beispiel dafür, wie Ihre Funktion unter dem Namen "BarShift1" fälschlicherweise funktioniert


 
Aleksey Vyazmikin :

Hier ist ein Beispiel dafür, dass Ihre Funktion falsch funktioniert - sie funktioniert unter dem Namen "BarShift1".


Eigentlich zeigt es nur das Gegenteil, meine Version ist die einzige, die korrekt ist. (Und das ursprüngliche iBarShift1 aus diesem Code ist korrekt).

Meine Version wurde als eigenständige Funktion konzipiert, genau wie mql4 iBarShift.

Sie ist nicht für Mehrfachabfragen optimiert, so dass der Zeitvergleich irrelevant ist. @nicholishen hat eine gute Bibliothek veröffentlicht, die für Massenaufrufe optimiert ist.


Eigentlich ist es genau umgekehrt, nur meine Version ist korrekt. (Auch das ursprüngliche iBarShift1 aus diesem Code ist korrekt).

Meine Version war als eigenständige Funktion konzipiert, genau wie mql4 iBarShift.

Sie ist nicht für Mehrfachanfragen optimiert, so dass der Zeitvergleich irrelevant ist. @nicholishen hat eine gute Bibliothek veröffentlicht, die für Massenaufrufe optimiert ist.

iBarShift
iBarShift
  • Stimmen: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

In Wirklichkeit zeigt es nur das Gegenteil, meine Version ist die einzige, die korrekt ist. (Und das ursprüngliche iBarShift1 aus diesem Code ist korrekt).

Meine Version wurde als eigenständige Funktion konzipiert, genau wie mql4 iBarShift.

Sie ist nicht für Mehrfachabfragen optimiert, so dass der Zeitvergleich irrelevant ist. @nicholishen hat eine gute Bibliothek veröffentlicht, die für Massenaufrufe optimiert ist.


Eigentlich ist es genau umgekehrt, nur meine Version ist korrekt. (Auch das ursprüngliche iBarShift1 aus diesem Code ist korrekt).

Meine Version war als eigenständige Funktion konzipiert, genau wie mql4 iBarShift.

Sie ist nicht für Mehrfachanfragen optimiert, so dass der Zeitvergleich irrelevant ist. @nicholishen hat eine gute Bibliothek veröffentlicht, die für Massenaufrufe optimiert ist.

Ich spreche nicht von der Bearbeitungszeit, ich spreche von der Taktzahl.

In der Abbildung sehen Sie, dass der Code um 8:37 Uhr denkt, dass der nächstgelegene Balken der Balken des Vortages um 23:00 Uhr ist, aber in Wirklichkeit ist der nächstgelegene Balken 10:00 Uhr. Sie ist sowohl mathematisch als auch logisch näher.

 
Aleksey Vyazmikin:

Ich spreche nicht von der Bearbeitungszeit, sondern von der Taktzahl.

Die Abbildung zeigt, dass der Code um 8:37 Uhr davon ausgeht, dass der nächstgelegene Balken der Balken des Vortages um 23:00 Uhr ist, der nächstgelegene Balken ist jedoch 10:00 Uhr. Er ist sowohl in der Mathematik als auch in der Logik näher dran.

Vereinfachen wir es.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Analog zu iBarShift

Alain Verleyen, 2018.04.05 00:18

Eigentlich zeigt es nur das Gegenteil, meine Version ist die einzige, die korrekt ist. (Und das ursprüngliche iBarShift1 aus diesem Code ist korrekt).

Meine Version wurde als eigenständige Funktion konzipiert, genau wie mql4 iBarShift.

Versuchen Sie mql4, vergleichen Sie, dasselbe Ergebnis.
 
Alain Verleyen:
Vereinfachen wir es.
Versuchen Sie mql4, vergleichen Sie, dasselbe Ergebnis.

Ich verstehe Ihr Argument. Ich werde es nicht überprüfen. Offenbar ist es meine Aufgabe, die von der akzeptierten Logik abweicht.

 
Alain Verleyen:

Welches Problem haben Sie entdeckt?

Das habe ich schon vor langer Zeit geschrieben. Ich erinnere mich nicht mehr, aber irgendetwas hat mich verwirrt.
Jedenfalls habe ich jetzt nur eine abnormale Situation gefunden.
Wenn noch keine Symboldaten geladen sind, kann -1 zurückgegeben werden und sollte 0 zurückgeben.

Dies kann mit dem Skript für MQL4 überprüft werden, das ich anhänge.

Dieses Skript nimmt eine zufällige Zeit und einen zufälligen Zeitrahmen. Wenn der iBarShiftX-Wert nicht mit der regulären iBarShift-Funktion übereinstimmt, erfolgt eine Meldung über Print.

Wenn Sie dieses Skript bei einem neu geöffneten Symbol ausführen, werden Sie Fehler sehen. Wenn Sie das Skript für dasselbe Symbol erneut ausführen, treten keine Fehler auf.

Aber das ist eine Kleinigkeit. In meiner Version gibt es das gleiche Problem.

Ich habe nur eine Beschwerde über Ihre Version: Sie ist sehr kompliziert und langsam.

Hier ist Ihre Variante:

int iBarShift2(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)
      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);
  }

Und hier ist meine Funktion, die das Gleiche tut, aber mit einem einfachen Algorithmus und viel schneller:

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

Sie können eine noch kürzere Version ohne die Funktion verwenden:

Bars(Symb,TimeFrame,time+1,UINT_MAX);

Versuchen Sie, das Gegenteil zu beweisen. Finden Sie eine einzige Kombination von Parametern, bei der Ihre und meine Funktion unterschiedliche Werte anzeigen.

Nur habe ich den letzten Parameter nicht genau darin implementiert, weil ich nicht verstehe, warum er überhaupt benötigt wird. Ich persönlich habe es nie gebraucht.

Aber wenn jemand es wirklich braucht, kann es umgesetzt werden.

Ich habe die iBarShift3-Variante verlassen, weil sie Geschichtslöcher nicht korrekt behandelt. Das kann behoben werden, aber ich sehe keinen Sinn darin, da die obige Option ausreicht.

Dateien:
 
Nikolai Semko:


Ich habe die Option iBarShift3 belassen, weil sie Löcher in der Historie nicht korrekt behandelt. Das kann behoben werden, aber ich sehe keinen Sinn darin, denn die oben genannte Option ist ausreichend.

Sind die Löcher auf das Fehlen von Pro-Handel in der Bar zurückzuführen oder auf andere Gründe? Und wie äußert sich die Ungenauigkeit?

 
Aleksey Vyazmikin:

Sind die Löcher auf einen Mangel an Pro-Handel in der Bar zurückzuführen oder auf etwas anderes? Und worin besteht die Ungenauigkeit?

Nehmen wir einen beliebigen Sonntag, an dem kein Handel stattfindet:

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

Nehmen wir an, der Sonntag ist ein Zeitpunkt, an dem kein Handel stattfindet:

Es zeigt also Montag? Das ist es, was ich will... :)

 
Warum probieren Sie nicht meine Funktion aus? Es gibt eine Lösung, die den Beginn und das Ende von Takten zeitlich neutralisiert. Es scheint alles richtig zu berechnen. Und sie ist schneller als Ihre schnellste Version 3. Oder ist die Branche wichtiger?) Oder liegt auch hier ein Fehler vor?) Ich benutze es schon seit langem....
Grund der Beschwerde: