Flusso di eventi. Come controllare e rendere l'evento inattivo? (+ risolto) - pagina 3

 

Yedelkin:

Allo stesso modo, se c'è già un evento ChartEventnella coda di mql5-program o tale evento è gestito, allora un nuovo evento di tale tipo non viene accodato".

Hmm. Questo è davvero brutto. Teoricamente significa che se, per esempio, un indicatore e un Expert Advisor usano gli eventi in modo indipendente, allora ci possono essere dei salti in entrambi i casi.

Allora non ha senso usare l'evento come un modo affidabile di trasferire dati.

Peccato.

 
sergeev:

La tua domanda "a quale frequenza approssimativa dovrebbero essere inviati gli eventi personalizzati in modo da non farli traboccare dalla coda"

La mia risposta nella prima pagina è "con la frequenza delle chiamate OnChartEvent".

Cioè, un evento è un OnChartEvent. Non ci dovrebbero essere più di due eventi in mezzo.

Questa è tutta la matematica.

Ancora una volta, leggete la prima pagina. Ho mostrato come evitare l'accumulo di eventi utente quando l'evento terminale viene processato al posto dell'evento utente. È così semplice.

Ancora una volta, educatamente :) Tu hai risolto il tuo problema, io sto cercando di risolvere il mio, di un piano diverso. Leggendo la discussione, non ho trovato una risposta alle mie domande. Non hai ancora risposto alla mia domanda principale (sull'uso della memoria) (se scegli di farlo).

Lasciatemi spiegare. Non ho il compito di "aggiornare qualche funzione, ma più velocemente di quanto MQL suggerisca di usare un timer". Tanto più in un modo così intelligente che è stato suggerito alla fine. Gli eventi personalizzati da diversi grafici con frequenza variabile bombardano un grafico separato contenente Expert Advisor e la funzione di gestione degli eventi. Di conseguenza, il risultato del tuo compito strettamente focalizzato(EventChartCustom dentro OnChartEvent) non si adatta affatto al mio schema di lavoro con eventi personalizzati.

 

Yedelkin:

Per chiarire. Non ho il compito di "fare in modo che qualche funzione si aggiorni più velocemente di quanto MQL suggerisca il timer". Soprattutto non in un modo così intelligente, come suggerito alla fine. Gli eventi personalizzati da diversi grafici con frequenza variabile bombardano un grafico separato contenente Expert Advisor e una funzione di gestione degli eventi. Di conseguenza, il risultato del tuo compito strettamente focalizzato(EventChartCustom dentro OnChartEvent) non si adatta affatto al mio schema di lavoro con eventi personalizzati.

Non è contorto, è semplice. Se non riesci a capirlo, non è un mio problema.

Non è dentro OnChartEvent, è sparso per tutto il codice. Ti stai inventando i tuoi stretti vincoli sul suo funzionamento. Sono due.

Allo stesso modo, se c'è già un evento ChartEvent nella coda di mql5-program o un tale evento è in corso di gestione, un nuovo evento di questo tipo non sarà messo in coda.

Questo è un bug o un errore di documentazione o condizioni mancanti.

Gli eventi sono tutti accodati con successo e nessun evento viene scartato. Altrimenti il mio argomento non sarebbe apparso.

Sto cercando di risolvere l'altro mio problema
che effetto ha l'overflow della coda degli eventi sulla dimensione della RAM? Se la coda degli eventi è risultata traboccante, dove vanno a finire gli eventi che hanno fatto traboccare la coda?

Renat e Rosh hanno già risposto a questa domanda?
 
Rosh:

Se un evento viene scartato, allora semplicemente non viene accodato. La memoria non cresce.

Uff! Questa è la cosa principale che volevo capire. E poiché TheXpert ha detto che solo pochi MB sono spesi per la coda stessa, è probabile che la perdita di memoria sia altrove... Andiamo con questa affermazione fino a prova contraria.

Rosh:

Se si verifica questo tipo di problema, allora le cose vanno molto male. Penso che la coda degli eventi troppo piena sia l'ultimo posto dove cercare problemi di memoria.

Sì, cercando di guardare ovunque possibile.

Ma si noti che dei tre esperti squalificati, almeno due stavano lavorando con un flusso di eventi personalizzato (l'autore del terzo non risponde alla richiesta). Anche Lizar (che lavora con eventi personalizzati) ha un alto utilizzo di memoria. E tol64 ha un consumo di memoria estremamente basso perché gli eventi utente sono usati meno frequentemente di una volta al minuto, se ho capito bene. Quindi, si scopre che dovrete dubitare dell'efficienza dell'implementazione del concetto di eventi personalizzati volente o nolente. Finché non otterrete una risposta esauriente.

 
Yedelkin:

Ma si noti che dei tre EA squalificati, almeno due stavano lavorando con un flusso di eventi personalizzati (l'autore del terzo non risponde alla richiesta). Anche Lizar (che lavora con eventi personalizzati) ha un alto consumo di memoria. E tol64 ha un consumo di memoria estremamente basso perché gli eventi utente sono usati meno frequentemente di una volta al minuto, se ho capito bene. Così, si scopre che dovrete dubitare dell'efficienza dell'implementazione del concetto di eventi personalizzati volenti o nolenti, fino a quando non otterrete una risposta esauriente.

E non dimentichiamo che l'EA ha ottenuto gli eventi dagli indicatori che sono stati eseguiti su molti strumenti e timeframes, circa 80 in totale, se ricordo bene. Ogni indicatore consuma risorse per i buffer degli indicatori, è lì che il cane è sepolto.
 
sergeev:

Non è complicato, è semplice. Se non riesci a capirlo, non è un mio problema.

Come ho capito, ho scritto che è complicato. Altrimenti non l'avrei toccato.

sergeev:

Non è dentro OnChartEvent, è in tutto il codice. Ti stai inventando i tuoi stretti vincoli su come funziona. Sono due.

Sì, sì, EventChartCustom non è dentro OnChartEvent, ma, tipo, fuori. Ora guardate il vostro codice:

void OnChartEvent(int iview, int id, long lparam, double dparam, string sparam)
{
    if (id==CHARTEVENT_CUSTOM+VM_IDLE)
    {
      ... 
    }
    EventChartCustom(m_chart, VM_IDLE, (long)event_idle, 0, ""); // отправили событие с указанием последнего счетчика
}

Ovviamente in questo codice EventChartCustom non è dentroOnChartEvent, e mi sbaglio di grosso :)

sergeev:

o è sbagliato o è un bug o un errore di documentazione o una condizione sottostimata.

Tutti gli eventi che vanno a buon fine rimangono nella coda e nessun evento viene scartato. Altrimenti il mio argomento non sarebbe apparso.

C'è almeno un'altra versione: nel tuo caso particolare, la coda semplicemente non trabocca (a causa dell'efficienza del codice), quindi non ci sono fatti di scarto degli eventi.

 
Yedelkin:

C'è almeno un'altra versione: nel tuo caso particolare, la coda semplicemente non trabocca (a causa dell'efficienza del codice), quindi non ci sono prove di scartare gli eventi.

Ecco il mio caso particolare che ho iniziato dimostrando di non scartare eventi identici

https://www.mql5.com/ru/forum/5091#comment_112780

Ho scritto lì perché si verifica l'overflow.

Sì, sì, EventChartCustom non è dentro OnChartEvent, ma, tipo, fuori. Ora guardate il vostro codice:

Arrivare alla radice! Ho mostrato una dimostrazione del problema e la sua soluzione. Questa chiamata EventChart potrebbe essere ovunque nel codice.

 
Rosh:
E non dimentichiamo il fatto che l'Expert Advisor riceveva gli eventi dagli indicatori che venivano eseguiti su molti strumenti e timeframes, circa 80 in totale, se ricordo bene. Ogni indicatore consuma risorse per i buffer degli indicatori, e qui sta il cane.
Sta parlando dei giapponesi? Beh, nel mio caso è più facile: ho un indicatore universale con 8 o 15 buffer di indicatori calcolati che girano su 6 strumenti in un timeframe. Cioè ci sono solo 6 indicatori. E, teoricamente, un tale schema può consumare 2 GB in una settimana?
 
Yedelkin:
Sta parlando dei giapponesi? Beh, nel mio caso è più semplice: un indicatore universale con 8 o 15 buffer di indicatori di calcolo, in esecuzione su 6 strumenti in un timeframe. Cioè ci sono solo 6 indicatori. Teoricamente, un tale schema può consumare 2 GB in una settimana?
Leggete l'articolo Ridurre il consumo di memoria per gli indicatori ausiliari, può essere utile.
 
Rosh:
Leggete l'articolo Reducing Memory Consumption of Auxiliary Indicators, può essere utile.

Grazie, ho già tutto ottimizzato lì :) Anche con questo articolo in mente, per quanto mi ricordi. Dovrò aspettare il prossimo grado di illuminazione :)

È possibile determinare l'Expert Advisor e l'indicatore separatamente, se lavorano insieme tramite eventi personalizzati?