Errori, bug, domande - pagina 2180

 
Nikolai Semko:

Chiaramente, zero.

Va bene impiegare 22 secondi per decidere che ci sono zero barre in un dato lasso di tempo?

Chiaramente un bug algoritmico nell'implementazione interna di Bars.

E non capisco come si fa a distinguere tra zero barre in un determinato lasso di tempo e questo zero:

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

In altre parole, come posso distinguere tra un risultato nullo e un errore nullo?
 
A100:

E non capisco come fai a distinguere tra zero barre in un dato timeframe e questo zero:

Dalla documentazione: Se i dati per una serie temporale con i parametri specificati quando viene chiamata la funzione Bars() non sono ancora stati generati nel terminale, o i dati della serie temporale non sono sincronizzati con il server commerciale nel momento in cui viene chiamata la funzione, la funzione restituirà zero.

L'origine dello zero non è importante in questa questione, ciò che è importante è che questo zero è nato dalla funzione Bars per sempre sotto forma di una coppia di decine di secondi.

 
A100:

Quello che non capisco è come si fa a distinguere tra zero barre in un determinato lasso di tempo e questo zero:

Dalla documentazione: Se i dati per una 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 al momento della chiamata della funzione non sono sincronizzati con il server commerciale, la funzione restituirà zero.

In altre parole, come posso distinguere tra un risultato nullo e un errore nullo?

Pensateci. Se aveste il compito di creare un analogo della funzione Bars e vi fosse dato un array datetime, i valori dei cui elementi diminuiscono con un numero crescente, in altre parole, l'array è ordinato.

Pensi che sarebbe difficile implementare un algoritmo che cerchi il numero di elementi di un tale array ordinato in un dato intervallo di tempo? E se non c'è una sola barra nell'intervallo dato o l'array non è stato ancora inizializzato, dovremmo restituire zero.

No - l'algoritmo è abbastanza semplice. Cosa può funzionare per 22 secondi?

 
Nikolai Semko:

In questa domanda, l'origine dello zero non è importante, ciò che è importante è che questo zero è nato dalla funzione Bars per secoli, sotto forma di un paio di decine di secondi.

Proprio l'origine è importante, perché se ::Bars() restituisse -1 invece di 0 (come ora) in caso di errore della storia, non ci sarebbe alcun ritardo. Ma ora 0 è interpretato come un errore e il ritardo è dovuto alle ripetizioni interne https://www.mql5.com/ru/forum/1111/page2200#comment_6955559

Inoltre, supponiamo di introdurre un controllo aggiuntivo e il ritardo scompare. Poi cosa è successo? Hai zero. È un risultato o un errore?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.03.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Vitaly Muzichenko:

Questo è molto probabilmente dovuto al caricamento della storia

La cosa divertente è che la prima stampa viene elaborata senza ritardo, cioè la storia da H4 è già caricata.

E se cambiate CopyTime H4 in W1, non ci sarà alcun ritardo. Significa che anche la storia per W1 è già caricata.

È solo che Bars viene inibito dall'intervallo di tempo tra CurrentTime() e il tempo di apertura della barra zero.

 
A100:

È l'origine che conta, perché se ::Bars() restituisse -1 invece di 0 (come fa ora) in caso di errore della storia, non ci sarebbe alcun ritardo. Ma ora 0 viene interpretato come un errore e il ritardo si verifica a causa delle ripetizioni interne https://www.mql5.com/ru/forum/1111/page2200#comment_6955559.

Inoltre, supponiamo che venga introdotto un controllo aggiuntivo e che il ritardo sia sparito. Poi cosa è successo? Tu hai zero. È un risultato o un errore?

Non importa in tutti i miei algoritmi se il risultato di zero è una barra che non colpisce nell'intervallo dato o l'assenza di array come tale.

Lei sta conducendo lontano dal problema.

 
Nikolai Semko:

Stai allontanando il problema.

Io sto esponendo l'essenza del problema, voi siete fissati sul vostro caso particolare. A giudicare dal tuo post precedente, non hai ancora capito quando si verifica un ritardo (oltre alla causa), anche se la pagina precedente spiega tutto in dettaglio.

Forse questo script può aiutarti a capire

void OnStart()
{
        Print( "begin" );
        ::Bars( _Symbol, PERIOD_W1, D'2018.03.20', D'2018.03.23' );
        Print( "end" );
}
 
A100:
Io sto esponendo l'essenza del problema, mentre voi vi concentrate sul vostro caso particolare. A giudicare dal tuo messaggio precedente, non hai ancora capito quando si verifica un ritardo (questo è oltre alla ragione), anche se la pagina precedente lo spiega in dettaglio.

Ho già formulato sopra la mia opinione su quando si verifica il ritardo.

Ancora una volta:
Bars si blocca se start_time è nell'intervallo dal tempo di apertura della barra zero del TF richiesto a TimeCurrent(). (Solo un'ipotesi, ma verificata con la pratica)
Sì, l'errore si verifica in un caso speciale. Ma i casi privati non dovrebbero essere nelle funzioni standard incorporate del linguaggio di programmazione.

E il tuo "punto" non è il punto, perché stai semplicemente citando il riferimento al comando Bars, che conosco perfettamente. Non c'è un codice di errore nella funzione Bars perché non è necessario.

Tanto più che in questo caso abbiamo a che fare con array di serie temporali completamente formati.

Questo può essere visto chiaramente nel codice leggermente modificato del mio script:

void OnStart()
  {
   datetime Arr[];
   if(CopyTime(_Symbol,PERIOD_W1,0,1,Arr)<0) Print("Ошибка");
   Print("Время открытия нулевого бара W1 = "+TimeToString(Arr[0]));
   ArraySetAsSeries(Arr,true);
   if(CopyTime(_Symbol,PERIOD_H4,0,100,Arr)<0) Print("Ошибка");
   Print("1 "+"CurrentTime = "+TimeToString(TimeCurrent()));
   int Res=Bars(_Symbol,PERIOD_W1,Arr[99],TimeCurrent());  // выполняется быстро   
   Print("2 Время открытия 99 бара H4 = "+TimeToString(Arr[99])+"  Номер бара W1= " +IntegerToString(Res)); 
   Res=Bars(_Symbol,PERIOD_W1,Arr[0],TimeCurrent());       // выполнение происходит более 10 секунд!!!   
   Print("3 Время нулевого бара H4 = "+TimeToString(Arr[0])+"  Номер бара W1= " +IntegerToString(Res));
  }

Risultato:

2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     Время открытия нулевого бара W1 = 2018.03.25 00:00
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     1 CurrentTime = 2018.03.30 23:54
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     2 Время открытия 99 бара H4 = 2018.03.08 20:00  Номер бара W1= 3
2018.03.30 23:39:47.176 BagBars (EURUSD,H4)     3 Время нулевого бара H4 = 2018.03.30 20:00  Номер бара W1= 0
 
A100:

Forse questo script aiuterà a capire

Il tuo script dimostra questo problema: l'impiccagione.

perché l'intervallo di tempo start_time - stop_time è all'interno della barra settimanale.

Se si va al di fuori della barra settimanale, allora non c'è nessun blocco:

Bars( _Symbol, PERIOD_W1, D'2018.03.12', D'2018.03.23' );

Grazie per l'esempio più chiaro

 

In MT4 le funzioni CopyHigh, CopyLow (non ho guardato le altre) hanno causato un errore critico quando non c'era storia nel tester. EA è stato testato su H1 e la richiesta era da M1

1 15:14:35.410 2017.01.04 19:54:24  Access violation read to 0x0A971FE8 in 'C:\Users\Halyna\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Experts\____________.ex4'

3 15:14:35.465 2017.01.04 19:54:24 Il passaggio dei test si è fermato a causa di un errore critico nell'EA