Errori, bug, domande - pagina 3032

 
Andrey Dik:

Grazie, Andrew. Lei è l'unico che ha compreso appieno la questione.


Ora tutto funziona come previsto, gli indicatori hanno calcolato completamente solo una volta durante la prima esecuzione e poi solo una volta ogni volta sulla loro nuova barra.


Si spera che il codice finale del secondo indicatore sia utile a qualcuno:

Ecco l'inizio di quello che avresti dovuto pensare

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

Bug, bug, domande

Alexey Viktorov, 2021.05.28 08:36

A cosa serve questo controllo?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

Sarebbe più facile scrivere return 0; senza alcuna condizione...

Ad ogni nuova barra la condizione sarà soddisfatta e tutte le barre saranno ricalcolate, indipendentemente dalla sincronizzazione. Avete scritto un codice sconsiderato e fate finta che sia un bug terminale...


E Igor Makanu lo ha detto anche prima...
 

Vorrei ricordarvi.

1. Per ogni simbolo, per il quale almeno un grafico è aperto, c'è un thread separato per elaborare i tick in arrivo. Diversi grafici per qualche simbolo possono essere aperti, ma ci sarà comunque un solo thread.

2. Il thread dei simboli gestisce le serie temporali, non i grafici. Cioè, gli stessi array di dati che sono sottoposti alla richiesta CopyRates.

3. è inutile chiedere al vostro simbolo in OnTick o OnCalculate, se è sincronizzato. Certo che lo è!

4. Tutte le serie temporali sono gestite in ordine, dal più basso al più alto. Prima di tutto, viene applicato il tick, e poi il calcolo di tutti gli indicatori, creati su questa serie temporale. Se si chiedono dati per lo stesso simbolo H1 all'indicatore, lavorando su M1, non si otterranno mai dati con il tick applicato. I dati saranno sempre una spunta indietro, non importa quali trucchi applichiate. Perché un thread per simbolo con un'elaborazione temporale consecutiva.

5. L'affermazione precedente non si applica agli EA e agli script, perché gli EA e gli script lavorano ognuno nei propri thread separati.

 
Slava:

Vorrei ricordarvi.

1. Per ogni simbolo, per il quale almeno un grafico è aperto, c'è un thread separato per elaborare i tick in arrivo. Diversi grafici per qualche simbolo possono essere aperti, ma ci sarà ancora un solo thread.

2. Il thread dei simboli non elabora grafici, ma serie temporali. Cioè, gli stessi array di dati che sono sottoposti alla richiesta CopyRates.

3. è inutile chiedere al vostro simbolo in OnTick o OnCalculate, se è sincronizzato. Certo che lo è!

4. Tutte le serie temporali sono gestite in ordine, dal più basso al più alto. Prima si applica il tick, poi il calcolo di tutti gli indicatori, creati in questa serie temporale. Se chiedete dati per lo stesso simbolo H1 all'indicatore, lavorando su M1, non otterrete mai dati con il tick applicato. I dati saranno sempre una spunta indietro, non importa quali trucchi applichiate. Perché un thread per simbolo con un'elaborazione temporale consecutiva.

5. L'affermazione precedente non riguarda gli Expert Advisors e gli script, perché gli Expert Advisors e gli script lavorano nei loro thread separati.

Per favore, mandami dei promemoria più dettagliati come questo! Grazie!

 
Slava:

Vorrei ricordarvi.

4. Tutte le serie temporali sono elaborate in ordine, dalla più bassa alla più alta. Prima l'applicazione del tick, poi il calcolo di tutti gli indicatori creati su questa serie temporale. Se chiedete dati per lo stesso simbolo H1 da un indicatore che lavora su M1, non otterrete mai dati con un tick applicato. I dati saranno sempre una spunta indietro, non importa quali trucchi applichiate. Perché un thread per simbolo con un'elaborazione temporale consecutiva.

5. L'affermazione precedente non si applica agli EA e agli script, perché gli EA e gli script lavorano ciascuno nel proprio thread separato.

Ho capito bene che se un EA che opera su M1 usa un indicatore su M1 (o qualsiasi altro TF?) che prende dati dal TF superiore, allora al primo tick di una nuova barra non sarà in grado di restituire il valore reale in ogni caso, perché la coda per il calcolo del TF superiore lo raggiungerà dopo n tick?

Ho semplicemente affrontato tale comportamento e stavo cercando un problema nell'indicatore, e ora si scopre che dovrebbe essere così. Ma se è così, interferisce fortemente con i test perché devo saltare alcuni tick che sono critici quando si testa in modalità OHLC.

 
Slava:

2. Symbol stream non elabora grafici, ma serie temporali. Cioè, gli stessi array di dati che sono dati alla richiesta CopyRates

....

4. Tutte le serie temporali sono elaborate in ordine, dal più basso al più alto. Prima l'applicazione del tick, poi il calcolo di tutti gli indicatori, creati su questa serie temporale. Se chiedete dati per lo stesso simbolo H1 da un indicatore che lavora su M1, non otterrete mai dati con un tick applicato. I dati saranno sempre una spunta indietro, non importa quali trucchi applichiate. Perché un thread per simbolo con un'elaborazione temporale consecutiva.

Perché ottengo schermate nere di "Aggiornamento" quando cambio TF?

aperto il grafico che stavo usando prima (H1 su EURUSD), lasciato l'indicatore, non ha fatto nulla per 2-3 minuti, poi passare a un grafico inferiore (M30...M1), schermo nero "Update" può apparire per 10 secondi

e questo schermo nero dipende dalla build - quando il terminale è senza schermo nero, e quando mi infastidisce davvero, perché si sa per certo che la storia è caricata, basta rendere un grafico al terminale, e perché si sta aspettando questo schermo nero


Cioè se l'indicatore è in esecuzione su M5 e ogni 30 minuti chiama l'indicatore su H1 - CopyBuffer() otterrà sempre i dati corretti da H1?

o non è un fatto, quindi "tira l'indicatore" su H1 ogni tick(la rottura della connessione non è ancora considerata)

 

come gestire le variabili di un ciclo/funzione in un'altra funzione?

la visibilità può essere resa più globale?

 
Igor Makanu:

perché appaiono schermate nere di "Aggiornamento" quando si cambia TF?

aperto il grafico che ho usato prima (H1 su EURUSD), lasciato l'indicatore, non ha fatto nulla per 2-3 minuti, poi passare a un grafico inferiore (M30...M1), può apparire per 10 secondi "aggiornamento schermo nero"

e questo schermo nero dipende dalla build - quando il terminale è senza schermo nero, e quando mi infastidisce davvero, perché sai esattamente quale storia è caricata, hai solo bisogno di rendere un grafico al terminale, e perché aspettare questo schermo nero


cioè se l'indicatore è in esecuzione su M5 e ogni 30 minuti chiama l'indicatore su H1 - CopyBuffer() otterrà sempre i dati corretti da H1?

o non un fatto, quindi "tirare l'indicatore" su H1 ogni tick(non consideriamo ancora le varianti di rottura della connessione)

Penso, basandomi sulle parole di Slava, che non sia un fatto.

Poiché tutti i calcoli vengono eseguiti solo sul tick, la catena di indicatori legati potrebbe non essere completata e dovremo aspettare il prossimo tick.

Ma ci sono alcuni problemi interessanti, le cui risposte non ho trovato nella documentazione.

Cosa fare quando i tick non si verificano (per esempio, nel fine settimana)? Se mettete un indicatore che funziona nel timeframe corrente, sarà disegnato senza problemi, e ciò che è interessante - non ha bisogno di un tick per essere ricevuto! Ma se l'indicatore richiede dati da un altro timeframe, non farà nulla finché non arriva un nuovo tick, e non c'è nessun tick in arrivo - fine settimana!

Se chiamiamo ChartRedraw (ChartID ()) nel timer, allora per un certo Commento (cnt); dovecnt viene incrementato di 1, vediamo che cnt funziona correttamente sullo schermo, ma l'indicatore non viene disegnato.

Quando aggiorno lo schermo con il pulsante Refresh dal menu contestuale, l'indicatore viene ridisegnato dall'inizio alla fine.

Ma appena si aggiorna lo schermo con ilpulsante Refresh, l'indicatore viene disegnato senza alcun problema.


HH Il tuo esempio del secondo indicatore funziona, ma il codice di Expert è più veloce.

 
Andrey Dik:

cosa fare quando non ci sono tick (fine settimana per esempio)? se mettete un indicatore che lavora sul TF corrente, sarà disegnato senza problemi, e ciò che è interessante - l'arrivo di un tick non è richiesto per questo!

non è necessario

quando si disegna l'indicatore sul grafico, c'è una sequenza rigorosamente definita di chiamate: OnInit() e immediatamente OnCalculated(). cioè la prima OnCalculated() è chiamata prima della ricezione del tick, ecco perché prev_calc deve essere confrontata con 0. Alla ricezione del tick o alla connessione con il server OnCalculated() sarà chiamata nuovamente eprev_calc sarà uguale a zero

Andrey Dik:

Si scopre che ChartRedraw () e Update by button non sono la stessa cosa, anche se posso pensare il contrario.

molto probabilmente dovresti usare ChartSetSymbolPeriod() con parametri NULL e periodo corrente, dovrebbe aiutare

 
Igor Makanu:

Molto probabilmente dovresti usare ChartSetSymbolPeriod() con parametri NULL e periodo corrente, dovrebbe aiutare

ChartSetSymbolPeriod

La chiamata ChartSetSymbolPeriod con lo stesso simbolo e timeframe può essere usata per aggiornare il grafico (simile al comando Refresh nel terminale). L'aggiornamento del grafico, a sua volta, innesca il ricalcolo degli indicatori collegati ad esso. Così, è possibile ricalcolare l'indicatore sul grafico anche quando non ci sono tick (ad esempio nei fine settimana).

Mi ha aiutato. Inoltre, come ricordo ora, Ac Pushkin diceva:

Oh, quante meravigliose scoperte
Preparareil nostrospirito illuminato
E l'esperienza, figlio di duri errori,
E il genio, amico dei paradossi,
E il caso, Dio inventore.

 
Andrey Dik:


Cosa fare quando i tick non arrivano (per esempio, i fine settimana)? Se l'indicatore funziona nel timeframe corrente, sarà disegnato senza problemi, e ciò che è interessante - non ha bisogno di un tick per arrivare! Ma se l'indicatore richiede i dati da un altro timeframe, non può fare nulla fino a quando un nuovo tick arriva, e non sta arrivando - fine settimana!


Dall'altro lasso di tempo si otterranno i dati che sono pronti al momento. Così, nell'output tutti i dati saranno perfettamente sincronizzati