Analogo a iBarShift - pagina 11

 
Nikolai Semko:

Sì, beh, in effetti è un comportamento strano per una funzione standard. Dopo tutto, abbiamo a che fare esattamente con l'adattamento dei valori al suo "benchmark".

La funzione standard iBarShift di MQL4, quando l'ora richiesta cade in un buco, restituisce il numero della barra sinistra (cioè sabato in questo caso), e iBarShift3 restituisce il numero della barra destra del buco (cioè lunedì), che ha più senso.

Se siamo nel buco, è logico restituire la barra sinistra, l'ultimo valore conosciuto, ma non il futuro.

 
Vitaly Muzichenko:

Se siamo in un buco, è logico restituire la barra sinistra, l'ultimo valore conosciuto, ma non il futuro.

Giusto, non ha senso. Ho confuso il passato con il futuro). Probabilmente perché 1 (passato) > 0 (futuro). Programmato.
 
Alain Verleyen:


Nella maggior parte dei casi questa funzione restituisce il risultato sbagliato

PS: è necessario postare la versione inglese o la traduzione russa è corretta?

Sì, la traduzione è corretta.

Eseguite questo script e vedrete che le funzioni producono esattamente lo stesso risultato.

Puoi fare un esempio di un lasso di tempo e del momento in cui i valori di queste funzioni sono diversi?

A proposito, la sua funzione è spesso sbagliata. Restituisce il valore -1

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
File:
 
Alain Verleyen:

Il requisito è di avere SOLO come versione di mql4


La tua funzione non funziona correttamente con il parametro exact=true.

Questo può essere visto in questo script.

Ed ecco un analogo funzionante della funzione iBarShift con il parametro esatto:

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

Senza questo parametro può essere semplificato in questa forma:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
File:
 
Nikolai Semko:

Sì, la traduzione è corretta.

Eseguite questo script e vedrete che le funzioni producono esattamente lo stesso risultato.

Puoi fare un esempio di un lasso di tempo e del momento in cui i valori di queste funzioni sono diversi?

A proposito, la sua funzione è spesso sbagliata. Restituisce il valore -1

Per favore, sii serio. Il mio codice è per mql5.

Restituisce -1 perché la funzione Bars() non è affidabile sotto MT4.

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

Script in esecuzione su AUDUSD, grafico M5.

Questo non succede con MT5.

 
Alain Verleyen:

Per favore, sii serio. Il mio codice è per mql5.

Restituisce -1 perché la funzione Bars() non è affidabile sotto MT4.

Script in esecuzione su AUDUSD, grafico M5.

Questo non succede con MT5.

Hai detto che dovrebbe funzionare come in MQL4.

Ma questo script può essere eseguito anche su MQL5

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

Se exact=True e tempo futuro dovete restituire -1.

Il mio script ha anche trovato uno strano errore:

Questo errore è confermato da questo controllo:

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
Quindi avevo ragione sull'esistenza di situazioni anomale nel vostro algoritmo, dopo tutto.
File:
 

Da tutta l'analisi che ho fatto, possiamo concludere che questo analogo completo dell'iBarShift:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

è di gran lunga il più corretto, e allo stesso tempo il più veloce e con l'algoritmo più semplice e breve.

Se non hai bisogno del parametro esatto, puoi usare la versione semplificata:

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

o semplicemente usare questa versione equivalente senza chiamare la funzione:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
O mi sbaglio?
 
Il silenzio è un segno di accordo.
 
Nikolai Semko:
Il silenzio è un segno di accordo.

Attraverso CTRL+SHIFT+F in ME ha fatto una ricerca per "BarShift". Si scopre che non uso una funzione simile. A quanto pare non ne avevo bisogno io.

Una volta ha scritto una variante per convertire gli EA MT4 in MT5 in una sola riga. Sembra essere l'unica ragione per scriverlo.

Non lavoro con i bar e non capisco perché tutti gli altri non facciano lo stesso.

Non è entrato nel tuo codice. Ma sono sempre contento quando si ottiene una soluzione rapida.

 
fxsaber:

Attraverso CTRL+SHIFT+F in ME ha fatto una ricerca per "BarShift". Si scopre che non uso una funzione simile. A quanto pare non ne avevo bisogno io.

Una volta ha scritto una variante per convertire gli EA MT4 in MT5 in una sola riga. Sembra essere l'unica ragione per scriverlo.

Non lavoro con i bar e non capisco perché tutti gli altri non facciano lo stesso.

Non è entrato nel tuo codice. Ma sono sempre contento quando si ottiene una soluzione rapida.

Capisco quello che vuoi dire, ma per me lavorare con le barre è ancora urgente. Forse un giorno diventerà un rudimento anche per me.