Analogo a iBarShift - pagina 6

 
Vasiliy Pushkaryov:

TimeCurrent() è solo un caso speciale che ho raccolto.

Ora leggo più attentamente questa nota alla funzione Bars():

"Quando si richiede il numero di barre in un dato intervallo di date , vengono prese in considerazione solo le barre il cui orario di apertura cade in quell'intervallo. Per esempio, se il giorno corrente della settimana è sabato, quando si richiede il numero di barre settimanali con start_time=lastTuesday e stop_time=lastFriday, la funzione restituisce 0 perché il tempo di apertura del timeframe settimanale cade sempre di domenica e nessuna barra settimanale cade nell'intervallo specificato".

Poiché TimeCurrent() è quasi sempre più tardi dell'orario di apertura della barra corrente, la funzione Bars() restituisce 0. Quindi, se passiamo il tempo corrispondente alle 02:05 sul timeframe orario come parametro start_time , e vogliamo che la barra iniziata alle 2 sia valida, allora dobbiamo ottenere l'orario di apertura della barra (02:00:00) attraverso CopyTime() . Altrimenti, la funzione Bars() ignorerà questa barra.

Cioè, se l'ora è 3:30, capisco che l'ora 2:05 nel timeframe orario si riferisce alla barra con indice 1. Nessuna delle funzioni della 2a pagina restituirà questo indice. Con questa correzione la funzione di Renat Akhtyamov ha restituito quello che mi aspettavo.

Allego uno script, con 4 opzioni per le funzioni di ricerca degli indici, che ho usato come test.

Provato la funzione presentata, risulta che mente di una barra, se chiede una barra con un tempo che non è sul grafico. Cioè se vogliamo conoscere la prima barra del giorno, e chiediamo l'ora "28.03.2018 00:00" ma non c'è nessuna barra con quel tempo, otterremo l'indice dell'ultima barra del giorno precedente.

O era destino che fosse così?

 
Aleksey Vyazmikin:

Ho provato la funzione presentata e risulta che mente di una barra, se viene richiesta una barra con un tempo che non è sul grafico. Cioè se vogliamo conoscere la prima barra del giorno, e chiediamo l'ora "28.03.2018 00:00". ma non c'è nessuna barra con quel tempo, otterremo l'indice dell'ultima barra del giorno precedente.

O era destino che fosse così?

Come si passa il tempo, con una corda?
 
Renat Akhtyamov:
Come si passa il tempo, con la corda?

Ho provato sia con una stringa che come nel codice precedentemente postato.

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

Ho provato sia con una stringa che come nel codice precedentemente postato.

nel suo codice.

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

Ecco perché non è del tutto chiaro se c'è un falso

e se è così:

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

Finora ho deciso di usare questo codice, sembra funzionare rapidamente:

//+------------------------------------------------------------------+ 
//| Получим 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);
  }  

Qualcuno ha identificato qualche svantaggio in questo codice, o c'è un'opzione più veloce?

Ah, bene, l'unico inconveniente è se si fa una richiesta per una barra che non è ancora sul grafico, cioè con il tempo di oggi, ad esempio ..... forse c'è una soluzione anche per questo? Qui avrebbe solo senso restituire l'ultima barra conosciuta. Questo potrebbe essere rilevante per lavorare con algoritmi che lavorano sul tempo corrente.

 
Renat Akhtyamov:

ha lo stesso.

quindi la presenza di falso non è del tutto chiara

false - per la standardizzazione, non influisce su nulla :) Ad essere onesti, non so perché questo falso in alcune funzioni sia proprio necessario?

 
Aleksey Vyazmikin:

Finora ho deciso di usare questo codice, sembra funzionare rapidamente:

Qualcuno ha identificato qualche svantaggio in questo codice, o c'è un'opzione più veloce?

Ah, bene, l'unico inconveniente è se si fa una richiesta per una barra che non è ancora sul grafico, cioè con il tempo di oggi, ad esempio ..... forse c'è una soluzione anche per questo? Qui avrebbe solo senso restituire l'ultima barra conosciuta. Questo potrebbe essere rilevante per lavorare con algoritmi che lavorano sul tempo corrente.

restituire un numero di barra che non esiste non va bene

è più facile restituire -1

 
Aleksey Vyazmikin:

false - per la standardizzazione, non influisce su nulla :) Ad essere onesti, non so perché questo falso in alcune funzioni sia proprio necessario?

Mi sono perso lì e sono un seguace dei codici semplici, senza due punti
 
Renat Akhtyamov:

restituire un numero di barra che non esiste non va bene

è più facile restituire -1

No, dovrebbe solo restituire l'ultima barra conosciuta, cioè con indice 0, ma ora ci vuole molto tempo per capire cosa restituire lì.

Ecco il codice, che è sbagliato di una barra, restituisce la barra corretta - zero.

O intendete quando la storia chiede una barra per tempo che non esiste? Poi penso che il più delle volte è necessario ottenere la barra più vicina al nostro tempo di quelle che sono disponibili, e il codice restituisce in questo caso barra con offset -1 sulla storia, ma funziona correttamente, se non c'è più storia - restituisce rapidamente zero bar.

 
Aleksey Vyazmikin:

No, dovrebbe solo restituire l'ultima barra conosciuta, cioè con indice 0, ma ora ci vuole molto tempo per capire cosa restituire lì.

Ecco il codice, che è sbagliato di una barra, restituisce la barra corretta - zero.

O intendete quando la storia chiede una barra per tempo che non esiste? Poi penso che il più delle volte dovremmo ottenere la barra che è più vicina al nostro tempo, e il codice restituisce in questo caso la barra con offset -1 sulla storia, ma funziona correttamente, se non c'è più storia - restituisce rapidamente la barra zero.

Sì (evidenziato)

-1 è un meno (chiarisco) e l'errore restituito dalla funzione è che non esiste tale barra

Cioè la mia funzione.

Forum sul trading, sistemi di trading automatico e test di strategia

Analogo di iBarShift

Renat Akhtyamov, 2017.06.08 01:19

Questo è anche possibile

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);
   }

richiede anche un miglioramento

anche se...

Documentazione:

"Nota.

Se i dati per la serie temporale con i parametri specificati quando si chiama la funzione Bars() non sono ancora stati generati nel terminale, o i dati della serie temporale non sono sincronizzati con il server commerciale al momento della chiamata della funzione, allora la funzione restituirà un valore zero. "

====

Se res==0, prenderemo -1 dalla funzione così com'è.

===

Quindi tutto funziona, usatelo a vostro piacere!