Analog zu iBarShift - Seite 6

 
Vasiliy Pushkaryov:

Ich habeTimeCurrent() nur als einen Spezialfall.

Ich habe diese Anmerkung zur Funktion Bars() jetzt genauer gelesen:

"Bei der Abfrage der Anzahl der Takte in einem bestimmten Datumsbereich werden nur die Takte berücksichtigt, deren Öffnungszeit in diesen Bereich fällt. Wenn der aktuelle Wochentag beispielsweise Samstag ist, gibt die Funktion bei der Abfrage der Anzahl der wöchentlichen Balken mit start_time=lastTuesday und stop_time=lastFriday den Wert 0 zurück, da die Eröffnungszeit des wöchentlichen Zeitrahmens immer auf einen Sonntag fällt und kein wöchentlicher Balken in den angegebenen Bereich fällt.

Da TimeCurrent() fast immer später als die Eröffnungszeit des aktuellen Balkens ist, gibt die Funktion Bars() den Wert 0 zurück. Wenn wir also als Parameter start_time die Zeit 02:05 auf dem stündlichen Zeitrahmen übergeben und den um 2 Uhr begonnenen Balken validieren wollen, müssen wir die Eröffnungszeit des Balkens (02:00:00) über CopyTime() ermitteln. Andernfalls wird die Funktion Balken() diesen Balken ignorieren.

D.h., wenn die Zeit 3:30 ist, verstehe ich, dass die Zeit 2:05 im stündlichen Zeitrahmen sich auf den Balken mit dem Index 1 bezieht. Keine der Funktionen auf der 2. Seite wird diesen Index zurückgeben. Mit dieser Korrektur ergab die Funktion von Renat Akhtyamov das, was ich erwartet hatte.

Ich füge ein Skript mit 4 Optionen für Indexnachschlagefunktionen bei, das ich als Test verwendet habe.

Ich habe die vorgestellte Funktion ausprobiert, es stellt sich heraus, dass sie um einen Balken lügt, wenn sie nach einem Balken mit einer Zeit fragt, die nicht im Diagramm steht. Z.B. wenn wir den ersten Takt des Tages wissen wollen und nach der Zeit "28.03.2018 00:00" fragen aber es gibt keinen Balken mit dieser Zeit, erhalten wir den Index des letzten Balkens des Vortages.

Oder war das so gewollt?

 
Aleksey Vyazmikin:

Ich habe die vorgestellte Funktion ausprobiert und es stellt sich heraus, dass sie um einen Balken lügt, wenn ein Balken mit einer Zeit angefordert wird, die nicht im Diagramm enthalten ist. Z.B. wenn wir den ersten Takt des Tages wissen wollen und nach der Uhrzeit "28.03.2018 00:00" fragen. aber es gibt keinen Balken mit dieser Zeit, erhalten wir den Index des letzten Balkens des Vortages.

Oder war das so gewollt?

Wie vertreibt man sich die Zeit: mit einer Schnur?
 
Renat Akhtyamov:
Wie vertreibt man sich die Zeit: mit Schnüren?

Ich habe es sowohl mit einer Zeichenkette als auch mit dem zuvor geposteten Code versucht.

int teset_01=iBarShift(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"),false);
Print ("teset_01=",teset_01);
 
Aleksey Vyazmikin:

Ich habe es sowohl mit einer Zeichenkette als auch mit dem zuvor geposteten Code versucht.

in seinem Code.

int iBarShift2(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)

Deshalb ist es nicht ganz klar, ob es eine falsche

und wenn ja:

int teset_01=iBarShift 2(_Symbol,PERIOD_CURRENT,StringToTime("30.03.2018 00:00"));
Print ("teset_01=",teset_01);
?
 

Bislang habe ich mich für diesen Code entschieden, der schnell zu funktionieren scheint:

//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+    
int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,const bool Exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static bool LastExact=false;
   static int PerSec=::PeriodSeconds(LastTimeFrame);
   
   if (LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   time-=time%PerSec;

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

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

   return(Res);
  }  

Hat jemand irgendwelche Nachteile in diesem Code entdeckt, oder gibt es eine schnellere Möglichkeit?

Der einzige Nachteil ist, wenn Sie einen Balken anfordern, der noch nicht im Diagramm enthalten ist, z.B. mit der heutigen Uhrzeit: ..... Vielleicht gibt es auch dafür eine Lösung? Hier wäre es nur sinnvoll, den letzten bekannten Takt zurückzugeben. Dies könnte für die Arbeit mit Algorithmen relevant sein, die mit der aktuellen Zeit arbeiten.

 
Renat Akhtyamov:

hat er dasselbe.

daher ist das Vorhandensein von falsch nicht ganz klar

false - für die Standardisierung, es hat keinen Einfluss auf irgendetwas :) Um ehrlich zu sein, weiß ich nicht, warum dieses False in einigen Funktionen überhaupt benötigt wird?

 
Aleksey Vyazmikin:

Bislang habe ich mich für diesen Code entschieden, der schnell zu funktionieren scheint:

Hat jemand irgendwelche Nachteile in diesem Code entdeckt, oder gibt es eine schnellere Möglichkeit?

Der einzige Nachteil ist, wenn Sie einen Balken anfordern, der noch nicht im Diagramm enthalten ist, z.B. mit der heutigen Uhrzeit: ..... Vielleicht gibt es auch dafür eine Lösung? Hier wäre es nur sinnvoll, den letzten bekannten Takt zurückzugeben. Dies könnte für die Arbeit mit Algorithmen relevant sein, die mit der aktuellen Zeit arbeiten.

die Rückgabe einer nicht existierenden Strichnummer ist nicht gut

es ist einfacher, -1 zurückzugeben

 
Aleksey Vyazmikin:

false - zur Vereinheitlichung, hat keine Auswirkungen :) Um ehrlich zu sein, weiß ich nicht, warum dieses False in einigen Funktionen überhaupt benötigt wird?

Ich habe mich verirrt und bin ein Anhänger einfacher Codes, ohne Doppelpunkte.
 
Renat Akhtyamov:

die Rückgabe einer nicht existierenden Strichnummer ist nicht gut

ist es einfacher, -1 zurückzugeben

Nein, es sollte nur den letzten bekannten Balken zurückgeben, d.h. mit Index 0, aber jetzt dauert es sehr lange, um herauszufinden, was dort zurückgegeben werden soll.

Hier ist der Code, der um einen Balken falsch ist und den richtigen Balken - Null - zurückgibt.

Oder meinen Sie, wenn in der Geschichte nach einer Zeitleiste gefragt wird, die es nicht gibt? Dann denke ich, dass die meisten oft Sie brauchen, um die Bar am nächsten zu unserer Zeit von denen, die verfügbar sind, und der Code gibt in diesem Fall bar mit Offset -1 auf Geschichte, aber es funktioniert richtig, wenn es keine weitere Geschichte - es gibt schnell Null bar.

 
Aleksey Vyazmikin:

Nein, es sollte nur den letzten bekannten Balken zurückgeben, d.h. mit Index 0, aber jetzt dauert es sehr lange, um herauszufinden, was dort zurückgegeben werden soll.

Der um einen Balken falsche Code liefert den richtigen Balken - Null.

Oder meinen Sie, wenn in der Geschichte nach einer Zeitleiste gefragt wird, die es nicht gibt? Dann denke ich, dass die meisten oft sollten wir die Bar, die am nächsten zu unserer Zeit von denen, die verfügbar sind, und der Code gibt in diesem Fall bar mit Offset -1 auf Geschichte, aber es funktioniert richtig, wenn es keine weitere Geschichte - es gibt Null bar schnell.

Ja (hervorgehoben)

-1 ist ein Minus (ich kläre auf), und der von der Funktion zurückgegebene Fehler ist, dass es keinen solchen Balken gibt

Das heißt, meine Funktion.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Analog von iBarShift

Renat Akhtyamov, 2017.06.08 01:19

Dies ist auch möglich

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }

muss ebenfalls verbessert 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, fangen wir -1 von der Funktion ab, so wie sie ist.

===

Es funktioniert also alles, verwenden Sie es nach Belieben!