Analogo a iBarShift - pagina 7

 

Ecco la versione più veloce e corretta che funziona su tutti i TF:

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

La velocità rallenta per TF D1, W1 e MN1

Ed ecco un indicatore di test, che mostra chiaramente la risposta delle diverse versioni, così come la loro velocità (il secondo numero. Più piccolo è il numero, più veloce è la funzione)


Entrambe le versioni 3 e 4 funzionano correttamente. Ma il terzo è più veloce.

Le varianti con CopyTime sono le più lente.

Questo può essere controllato in MQL4 (vedi indicatore allegato).

Non specifico la paternità delle diverse varianti, perché mi sono già confuso.
Ma il terzo modo, il più utile, è l'80% di@fxsaber. L'ho solo modificato un po'.

File:
 
Nikolai Semko:

Entrambe le opzioni 3 e 4 funzionano correttamente. Ma il 3 è il più veloce. Le varianti CopyTime sono le più lente.

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

Discussione su "LifeHack per trader: mescolare ForEach sulle definizioni (#define)"

fxsaber, 2018.02.14 11:58

Le misure di velocità di funzione ZZY devono essere misurate in un ambiente in cui le prestazioni sono importanti - Tester.

 
fxsaber:

Le misure non hanno molta importanza qui. Potete vedere che la logica è la più veloce.

 
Nikolai Semko:

Ecco la versione più veloce e corretta che funziona su tutti i TF:

La velocità rallenta per TF D1, W1 e MN1

Ed ecco un indicatore di test, che mostra chiaramente la risposta delle diverse versioni, così come la loro velocità (il secondo numero. Più piccolo è il numero, più veloce è la funzione)


Entrambe le versioni 3 e 4 funzionano correttamente. Ma il terzo è più veloce.

Le varianti con CopyTime sono le più lente.

Può essere controllato in MQL4 (vedi indicatore allegato).

Non indico la paternità delle diverse varianti perché sono già confuso.
Ma la terza variante, la più funzionante, è l'80% di@fxsaber. L'ho solo modificato un po'.

Ho aggiunto TF al tuo indicatore - i primi due algoritmi non sono affatto utili.

Nelle cifre, l'attuale TF è H1, e il calcolo è basato su tariffe giornaliere.



 
Renat Akhtyamov:
Sì (evidenziato)

-1 è un uno meno (per chiarire), restituito dalla funzione di errore, che dice che non esiste tale barra

Quindi la mia funzione

ha anche bisogno di essere raffinato

però...

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, allora prenderemo -1 dalla funzione così com'è.

===

Quindi tutto funziona, usalo a tuo vantaggio!

Sull'indicatore qui sopra potete vedere chiaramente quanto sia falso questo metodo.

 
Nikolai Semko:

Ecco la versione più veloce e corretta che funziona su tutti i TF:

La velocità rallenta per TF D1, W1 e MN1

Ed ecco un indicatore di test, che mostra chiaramente la risposta delle diverse versioni, così come la loro velocità (il secondo numero. Più piccolo è il numero, più veloce è la funzione)


Entrambe le versioni 3 e 4 funzionano correttamente. Ma il terzo è più veloce.

Le varianti con CopyTime sono le più lente.

Può essere controllato su MQL4 (vedi indicatore allegato).

Non specifico la paternità delle diverse varianti, perché mi sono già confuso.
Ma la terza variante, la più funzionante, è l'80% di@fxsaber. L'ho solo modificato un po'.

La varianteiBarShift3 non funziona correttamente.

 

Ecco la mia versione. Sembra funzionare sia con i telai junior che senior. La velocità è un po' più veloce di iBarshift3.


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

datetime t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

doppio div = tempo/(doppio)ps;

doppio mant = div - MathFloor(div);

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

return(ret);

}

 
Vitaly Muzichenko:

L'opzioneiBarShift3 non funziona correttamente.

Posso avere un esempio in cui non funziona correttamente?

Quindi rimane solo l'opzione quattro?

 
Vitaly Muzichenko:

L'opzioneiBarShift3 non funziona bene.

Il vocabolario è il nostro tutto.

 
Nikolai Semko:

Il vocabolario è il nostro tutto.

Ho fatto un rapido controllo: c'è una funzione che funziona da più di un giorno, ho sostituitoiBarShift3 e ho ottenuto che l'EA non funzionasse correttamente. È così che sono arrivato alla mia conclusione.

Ecco quello che uso io

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