Analogo a iBarShift - pagina 9

 
Alain Verleyen:

Quale problema ha trovato?

Ecco un esempio della vostra funzione che funziona falsamente con il nome "BarShift1".


 
Aleksey Vyazmikin :

Ecco un esempio della vostra funzione che funziona falsamente - funziona con il nome "BarShift1"


In realtà mostra solo il contrario, la mia versione è l'unica corretta. (E l'iBarShift1 originale di questo codice è corretto).

La mia versione è stata progettata come una funzione indipendente, proprio come mql4 iBarShift.

Non è ottimizzato per le query multiple, quindi il confronto dei tempi è irrilevante. @nicholishen ha pubblicato una buona libreria ottimizzata per le chiamate di massa.


In realtà mostra solo il contrario, la mia versione è l'unica corretta. (Anche l'iBarShift1 originale di questo codice è corretto).

Lamia versione è stata concepita per essere usata come funzione standalone, esattamente come mql4 iBarShift.

Non è ottimizzato per le richieste multiple, quindi il confronto dei tempi è irrilevante. @nicholishen ha pubblicato una buona libreria ottimizzata per le chiamate in blocco.

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

Infatti mostra solo il contrario, la mia versione è l'unica corretta. (E l'iBarShift1 originale di questo codice è corretto).

La mia versione è stata progettata come una funzione indipendente, proprio come mql4 iBarShift.

Non è ottimizzato per le query multiple, quindi il confronto dei tempi è irrilevante. @nicholishen ha pubblicato una buona libreria ottimizzata per le chiamate di massa.


In realtà mostra solo il contrario, la mia versione è l'unica corretta. (Anche l'iBarShift1 originale di questo codice è corretto).

Lamia versione è stata concepita per essere usata come funzione standalone, esattamente come mql4 iBarShift.

Non è ottimizzato per le richieste multiple, quindi il confronto dei tempi è irrilevante. @nicholishen ha pubblicato una buona libreria ottimizzata per le chiamate in blocco.

Non sto parlando del tempo di elaborazione, ma del numero di barre.

Nell'immagine potete vedere che alle 8:37 il codice pensa che la barra più vicina sia quella del giorno precedente 23:00, ma in realtà la barra più vicina è quella delle 10:00. È più vicino sia matematicamente che logicamente.

 
Aleksey Vyazmikin:

Non sto parlando del tempo di elaborazione, sto parlando del numero di barra.

L'immagine mostra che alle 8:37 il codice considera che la barra più vicina sia quella del giorno precedente alle 23:00, ma in realtà la barra più vicina è quella delle 10:00. È più vicino sia in matematica che in logica.

semplifichiamo.

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

Analogo a iBarShift

Alain Verleyen, 2018.04.05 00:18

In realtà mostra solo il contrario, la mia versione è l'unica corretta. (E l'iBarShift1 originale di questo codice è corretto).

La mia versione è stata concepita come una funzione indipendente, proprio come mql4 iBarShift.

Prova mql4, confronta, stessa cosa.
 
Alain Verleyen:
Semplifichiamo.
Prova mql4, confronta, stessa cosa.

Capisco la sua argomentazione. Non lo controllerò. A quanto pare, è il mio compito che differisce dalla logica accettata.

 
Alain Verleyen:

Quale problema ha scoperto?

L'ho scritto molto tempo fa. Non ricordo più, ma qualcosa mi ha confuso.
Comunque, ora ho trovato solo una situazione anomala.
Quando i dati dei simboli non ancora caricati possono restituire -1 e dovrebbero restituire 0.

Questo può essere controllato usando lo script per MQL4 che sto allegando.

Questo script prende un tempo casuale e un lasso di tempo casuale. Se il valore di iBarShiftX non corrisponde alla regolare funzione iBarShift, allora il messaggio via Print.

Se eseguite questo script su un simbolo appena aperto, vedrete degli errori. La ripetizione dello script sullo stesso simbolo non darà errori.

Ma è un'inezia. Nella mia versione è lo stesso problema.

Ho solo una lamentela sulla vostra versione: è molto complicata e lenta.

Ecco la vostra 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);
  }

Ed ecco la mia funzione, che fa la stessa cosa, ma con un algoritmo semplice e molto più veloce:

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

Puoi usarne uno ancora più corto senza la funzione:

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

Cerca di dimostrare il contrario. Trova una singola combinazione di parametri quando la tua funzione e la mia mostrano valori diversi.

Solo che non ho implementato l'ultimo parametro esatto, perché non capisco perché sia necessario. Personalmente non ne ho mai avuto bisogno.

Ma se qualcuno ne ha davvero bisogno, può essere implementato.

Ho lasciato la variante iBarShift3, perché gestisce erroneamente i buchi della storia. Si può aggiustare, ma non ne vedo il motivo, dato che l'opzione di cui sopra è sufficiente.

File:
 
Nikolai Semko:


Ho lasciato l'opzione iBarShift3 perché non gestisce correttamente i buchi della storia. Si può aggiustare, ma non ne vedo il motivo, perché l'opzione di cui sopra è sufficiente.

I buchi sono dovuti alla mancanza di pro-trading sul bar, o ad altri? E come si manifesta l'imprecisione?

 
Aleksey Vyazmikin:

I buchi sono dovuti a una mancanza di pro-trading sul bar, o altro? E qual è l'imprecisione?

Prendiamo una domenica qualsiasi in cui non c'è commercio:

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:

Supponiamo di prendere la domenica in qualsiasi momento in cui non c'è commercio:

Quindi si vede lunedì? Questo è quello che voglio... :)

 
Perché non provi la mia funzione? C'è una soluzione che neutralizza l'inizio e la fine delle barre nel tempo. Sembra calcolare tutto correttamente. Ed è più veloce nel tempo della vostra versione 3 più veloce. O il ramo è più importante?). O c'è un errore anche lì?) Lo uso da molto tempo....