Errori, bug, domande - pagina 1805

 
Alexey Kozitsyn:
@Slawa, per favore chiarisci, ci sono delle restrizioni sulla scrittura dei buffer degli indicatori al di fuori della funzione OnCalculate()? In caso di scrittura di buffer nelle funzioni OnTimer(), OnBookEvent(), OnChartEvent(), tutto sarà sempre scritto correttamente?

Non ci sono restrizioni esplicite. Si può provare.

Ma si può incorrere nella ridistribuzione del buffer al momento di aggiungere una nuova barra (la ridistribuzione viene eseguita con una riserva, quindi non su ogni nuova barra).

PS anche se no. tutta l'elaborazione è in un thread, quindi non ci dovrebbero essere collisioni. Prova
 
Slawa:
Non ci sono limitazioni evidenti. Provate.

Ma si può incorrere nella ridistribuzione del buffer al momento di aggiungere una nuova barra (la ridistribuzione viene eseguita con una certa riserva, quindi non su ogni nuova barra)

Qui, più dettagli, per favore. Qual è l'assegnazione, come affrontarla?

Ho solo scritto la domanda perché ho notato "singhiozzi" su una nuova barra. E questi valori null buffer a singhiozzo = 0 (con il valore vuoto impostato esplicitamente da me - EMPTY_VALUE). Finora non sono riuscito a cogliere questo momento. A volte l'indicatore "salta" e ritorna immediatamente alla normalità, a volte si "blocca". Quando è bloccato, i valori non vengono scritti nel file e i buffer non vengono disegnati. I buffer sono scritti in OnBookEvent().

Lo stesso codice funziona bene in OnCalculate(), ma OnCalculate() non permette di raccogliere tutti i valori di Open Interest e altri parametri di scambio.

Può essere risolto solo con la commutazione TF. Sì, 5-7 stessi indicatori in esecuzione allo stesso tempo, scrivendo dati diversi.

Aggiunto:

Sì, ho anche notato la stessa cosa oggi quando si accende il terminale. Tutto si è semplicemente bloccato, tutti i buffer, tutti i valori hanno degli zeri, nessuna storia (scritta su file) è stata data dall'indicatore. In altre parole, tutto si è bloccato. Il mercato era ancora chiuso. Ho cambiato TF - la storia è tornata, ma di nuovo, alla domanda sulla necessità di una marca temporale ai valori di SESSION: l'ultimo valore conosciuto al momento della chiusura del terminale è stato registrato! La sincronizzazione della storia ha avuto successo, nessun errore. Ma TimeCurrent() restituisce un valore errato (circa 21:03). Il tempo reale di questo valore è 23:49:59. Tutto sommato, una specie di tristezza.

 
Alexey Kozitsyn:

Qui, più dettagli, per favore. Qual è l'assegnazione, come deve essere gestita?

Ho solo scritto la domanda perché ho notato "singhiozzi" su una nuova barra. E questi valori null buffer a singhiozzo = 0 (e il valore vuoto impostato esplicitamente da me - EMPTY_VALUE). Finora non sono riuscito a cogliere questo momento. A volte l'indicatore "salta" e ritorna immediatamente alla normalità, a volte si "blocca". Quando è bloccato, i valori non vengono scritti nel file e i buffer non vengono disegnati. I buffer sono scritti in OnBookEvent().

Lo stesso codice funziona bene in OnCalculate(), ma OnCalculate() non permette di raccogliere tutti i valori di Open Interest e altri parametri di scambio.

Può essere risolto solo con la commutazione TF. Sì, 5-7 stessi indicatori sono in esecuzione simultaneamente, scrivendo dati diversi.

È facile. Arriva il primo tick di una nuova barra. Il buffer è allocato per 1000 barre ed è completamente pieno.

Riallocchiamo il buffer a 1250 barre e copiamo 1000 barre dal buffer precedente al nuovo buffer. Mettere il nuovo buffer al posto del vecchio buffer, cancellare il vecchio buffer. Aggiungiamo la 1001esima barra.

Cosa intende per "cosa farne"?

Tenete presente che tutti gli indicatori di un simbolo sono contati in modo sequenziale uno dopo l'altro in un thread. Se un indicatore rallenta, anche l'intero thread di elaborazione dei simboli rallenterà
 
Slawa:
Facile. Arriva il primo tick della nuova barra. Il buffer è allocato per 1000 barre ed è completamente pieno.

Riallocchiamo il buffer a 1250 barre e copiamo 1000 barre dal vecchio buffer al nuovo buffer. Mettere il nuovo buffer al posto del vecchio buffer, cancellare il vecchio buffer. Aggiungiamo la 1001esima barra.

Cosa intende per "cosa farne"?

Tenete presente che tutti gli indicatori di un simbolo sono contati in modo sequenziale uno dopo l'altro in un thread. Se un indicatore rallenta, anche l'intero thread di elaborazione dei simboli rallenterà
So di un thread. E la ridistribuzione, per quanto ho capito, colpisce OnBookEvent() più forte di OnCalculate()?
 
Alexey Kozitsyn:
Sono consapevole della cosa del filo singolo. E la ridistribuzione, da quanto ho capito, influenza OnBookEvent() più di OnCalculate()?
La ridistribuzione viene eseguita quando arriva un nuovo tick. Subito dopo l'arrivo di un nuovo tick, OnCalculate viene chiamato a sua volta. E solo dopo si continua l'elaborazione degli eventi che sono stati ricevuti dall'indicatore

Ma, finché l'indicatore (qualsiasi indicatore su questo simbolo!) non finisce i suoi calcoli (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), il nuovo tick non arriva per essere elaborato.
 
Slawa:
La ridistribuzione viene eseguita all'arrivo di un nuovo tick. Immediatamente dopo l'arrivo di un nuovo tick dalla coda , viene chiamato OnCalculate. E solo dopo si continua l'elaborazione degli eventi ricevuti dall'indicatore

Tuttavia, finché l'indicatore (qualsiasi indicatore su questo simbolo!) non finisce i suoi calcoli (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), un nuovo tick non arriverà per essere elaborato.

Inoltre, per quanto ho capito, gli indicatori su un simbolo sono calcolati in modo sequenziale, cioè se ho lanciato i1, i2, i3 indicatori in una riga, allora saranno calcolati nello stesso ordine?

Ora ho aggiunto un MAKD standard per il test; è l'ultimo della lista. Vedrò se rallenta quando si forma una nuova barra.

 
Alexey Kozitsyn:

Inoltre, per quanto ho capito, gli indicatori su un simbolo sono calcolati in modo sequenziale, cioè se ho lanciato i1, i2, i3 indicatori in una riga, allora saranno calcolati nello stesso ordine?

Ora ho aggiunto un MAKD standard per il test, è l'ultimo nella lista. Vedrò se si blocca su di esso quando si forma una nuova barra.

All'inizio, sì, il calcolo sarà nello stesso ordine.

Ma se cancellate-aggiungete diversi indicatori, la sequenza di ricalcolo potrebbe sorprendervi. Pertanto, non fate affidamento sulla sequenza
 
Slawa:
All'inizio, sì, il calcolo sarà nella stessa sequenza.

Ma se cancellate-aggiungete diversi indicatori, la sequenza di ricalcolo potrebbe sorprendervi. Quindi non fate affidamento sulla sequenza.
Questo è necessario per controllare, se i miei indicatori si bloccano, se l'ultimo, il MAKD standard, sarà calcolato. Tutti i miei vanno prima del MACD.
 
Slawa:

Questo è quello di cui parlavo:

Una nuova barra si è formata su GOLD-3.17, tutti i miei indicatori calcolati in OnBookEvent() da questo simbolo tutti i valori attuali sono stati azzerati. Secondo la logica dell'indicatore, al momento di formare una nuova barra, i buffer non vengono azzerati, e il valore attuale viene scritto in essi immediatamente. Il MACD non è azzerato. Il registro è vuoto, significa che non c'è stata alcuna insincronizzazione, tutti i valori dovrebbero essere corretti. In questo caso il glitch è durato circa 5 secondi. Ieri ho beccato dei glitch per diversi minuti alla volta.

Tutti gli altri personaggi andavano bene. Di nuovo, la logica dell'indicatore non azzera i valori a 0! Quindi la domanda è: quando si ridistribuiscono oggetti nuovi, in teoria, dovrebbero contenere spazzatura. Ma qui 0.0 e si blocca...

Sì, un'altra cosa: se un indicatore è stato appeso, gli altri avrebbero dovuto mantenere i loro valori! Ma tutti, tutti insieme, si sono azzerati. Ci sono situazioni in cui questo potrebbe accadere?
 

Un blocco simile si è verificato su BR-3.17:

@Slawa qualche idea su come scavare? Forse c'è un modo migliore per raccogliere i dati di scambio e visualizzarli?