Timer - pagina 2

 
TheXpert:

Un'altra cosa... Non siete fratelli, vero?

Il che non significa che non ci sia. Abbiamo tutti compiti diversi.

Ecco qui... Possiamo leggere? Mostrami come si fa per gli induks.


  1. Non credo, non so nemmeno chi sia :D
  2. Beh, onestamente non ho incontrato un compito del genere, per i miei compiti - più velocemente conta, meglio è.
  3. Mi dispiace, ho dato un'occhiata)). Non sono davvero entrato in quali fili - cosa sta succedendo. Non lo so, non ho mai visto una cosa del genere. Dipende davvero dal compito, a meno che non esegua qualche strano script che tocchi l'indicazione.
O, come un'altra alternativa - per spingere tutti i calcoli e tutto in un thread separato in una dll - ma questo suona come una perversione.
 

Interesting:

... l'elaborazione del timer non può essere chiamata fino a quando l'elaborazione del timer precedente non è stata completata. O, in parole povere, OnTimer() non avrà il diritto di eseguire finché il thread che dovrebbe elaborare il timer non sarà occupato.

Per illustrare l'impossibilità di avviare l'elaborazione del timer da parte del secondo thread si può usare questo esempio (stupido ma chiaro):

int OnInit()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
EventSetTimer(1);
//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

void OnTimer()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
Print(TimeLocal());
Sleep(2000);
//----------------------------------------------------------------------------//
}
Quindi, risulta che gli eventiTimer possono essere ignorati così come gli eventiNewTick? E in certe condizioni, non possono essere messi nella coda degli eventi dell'Expert Advisor?
 
Yedelkin:
Così si scopre che gli eventiTimer possono essere ignorati allo stesso modo degli eventiNewTick? E, in certe condizioni, può essere escluso dalla coda di eventi dell'Expert Advisor?
L'evento NewTick è un'eccezione in questo caso. Non ci sono controlli per altri tipi di eventi. Se i gestori di eventi girano più lentamente di quanto la coda degli eventi si riempia, la coda traboccherà e alcuni eventi saranno saltati. Per quanto riguarda l'esempio precedente, conferma solo che l'EA ha un singolo thread di esecuzione e che la gestione degli eventi viene eseguita in modo sequenziale, nell'ordine in cui gli eventi sono accodati.
Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - Документация по MQL5
 
antt:
L'evento NewTick è un'eccezione in questo caso. Non ci sono controlli per altri tipi di eventi. Se i gestori di eventi sono più lenti del riempimento della coda di eventi, la coda trabocca e alcuni eventi vengono saltati. Per quanto riguarda l'esempio precedente, conferma solo che l'EA ha un singolo thread di esecuzione e che la gestione degli eventi viene eseguita in modo sequenziale, nell'ordine in cui gli eventi sono accodati.

Grande, grazie per le spiegazioni! Logico e comprensibile, non c'è bisogno di speculare

Interessante, la tua domanda sul multithreading degli eventi ha una specie di risposta. E ho anche indovinato OnTimer :)

 
Yedelkin:
Così si scopre che gli eventiTimer possono essere ignorati allo stesso modo degli eventiNewTick? E in certe condizioni, non possono essere accodati negli eventi di Expert Advisor?

Per quanto ho capito, va più o meno così:

1. tutti gli eventi sono messi nella stessa coda. Se c'è un evento NewTick nella coda o un tale evento è gestito, allora NewTick viene ignorato e non viene messo in coda.

2. Il programmatore sceglie quali eventi gestire. I gestori per OnTrade, OnTimer e OnTick sono basilari e usati frequentemente negli Expert Advisors.

3. Durante l'elaborazione di un evento gli altri non possono essere elaborati.

4. Se lo stack degli eventi è troppo pieno, i vecchi eventi vengono rimossi dalla coda senza essere elaborati.

5. Dei tre tipi di eventi di cui sopra, Trade sarà generato meno spesso, e NewTick sarà generato più spesso (ma i tick come descritto sopra possono non essere inclusi nella coda).

6. Il gestore più interessante da questo punto di vista è OnChartEvent, che gestisce tutti gli eventi del grafico + gli eventi personalizzati.

E solo un gran numero di questi eventi può facilmente traboccare la coda degli eventi (nel caso in cui ci siano molti eventi di questo tipo).

A mio parere, l'unica grazia di salvezza in questa situazione è che gli eventi OnChartEvent sono generati in modo casuale e asincrono.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 

Yedelkin:

Interessante, la tua domanda sulla gestione degli eventi multi-thread sembra avere una risposta. E ho anche indovinato OnTimer :)

In linea di principio, non avevo dubbi su un singolo thread, tanto più che il codice dell'Expert Advisor stesso viene eseguito in un singolo thread.

E quello che ho descritto è una specie di sogno sul futuro (diciamo, su MT6), quando ci sarà il multi-threading in MT (almeno finché il flusso di eventi non sarà separato per qualche motivo).

All'inizio avrei almeno separato tutti gli eventi ChartEvent in un thread separato, ma gli sviluppatori sanno meglio di me...

 

C'è un modo per far sì che l'EA generi eventi Timer in un momento specifico? Per esempio, all'inizio dell'ultimo minuto dell'ora o del giorno.

 
Yedelkin:

C'è un modo per far sì che l'EA generi eventi Timer in un momento specifico? Per esempio, all'inizio dell'ultimo minuto dell'ora o del giorno.

Certo.
 
TheXpert:
Certo.
Com'è (il metodo), se non è un segreto?
 
Yedelkin:
Che aspetto ha (il metodo), se non un segreto?

Usare il timer manager. Volevo scrivere un articolo, ma poi sono stato in qualche modo sviato. Anche se non sembra un articolo.

Un tempo specifico non funzionerà a causa della natura single-threaded del codice e della coda di eventi, ma con un errore medio di meno di un secondo (il massimo è limitato dal tempo massimo di esecuzione dell'evento da parte del codice).

Inoltre, c'è solo un timer.

Devo?

Motivazione: