Errori, bug, domande - pagina 1805
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
@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?
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
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.
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.
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à
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à
Sono consapevole della cosa del filo singolo. E la ridistribuzione, da quanto ho capito, influenza OnBookEvent() più di OnCalculate()?
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.
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.
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.
Ma se cancellate-aggiungete diversi indicatori, la sequenza di ricalcolo potrebbe sorprendervi. Pertanto, non fate affidamento sulla sequenza
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 è 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?