Programmazione asincrona e multithread in MQL - pagina 26

 
Vladimir Simakov:
La sincronizzazione è compito del programmatore, se non si sa come, non si usa il multithreading. Il compito dei creatori di dare uno strumento, e lì ognuno è un Pinocchio malvagio a se stesso. Lo stesso a la mutex non è un problema da implementare da soli.

Purtroppo questo non è il caso, il pubblico di destinazione di MQL - chi? (imho, programmatori di applicazioni che conoscono le basi della programmazione)

E questo sarà ancora MQL5 (gli sviluppatori hanno ripetutamente detto che non ci saranno più aggiornamenti in MQL4).

Lo stesso MQL5 funziona inizialmente in modalità asincrona - una richiesta di dati storici (per esempio, restituirà i dati o inizierà la paginazione in background e restituirà un errore). In questo modo tutto funziona per quanto riguarda lo scambio di dati tra il terminale e il programma MQL,

e questi momenti sono già perplessi, perché invece di restituire valori è necessario controllare costantemente la prontezza dei dati e così via.... quando si converte da MQL4 non è davvero conveniente


ed ecco un altro argomento, prendiamo una semplice struttura di programma MQL e inseriamo diversi eventi in modo asincrono.... a chi sarà destinato? - chi sarà l'utente finale di queste caratteristiche necessarie?

;)

 
Andrey Barinov:

La GUI dovrebbe girare nell'EA principale e tutto il resto in un EA separato. Questo slave EA separato è posto su OBJ_CHART invisibile e interagisce con il percorso principale EventSendCustom().

Non so come sia ora. Sembra che prima, solo gli script fossero in esecuzione su OBJ_CHART. C'era qualche altra particolarità con i parametri di input.

Ho provato a richiedere le barre di tutti i simboli da Market Watch. La storia per tutti è caricata. Passano decine di secondi di un ciclo! Non sono contento di MT5, per usare un eufemismo.
 
fxsaber:

Non so come sia ora. In precedenza, sembrava che solo gli script funzionassero su OBJ_CHART. C'era qualche altra particolarità con i parametri di input.

Ho provato a richiedere le barre di tutti i simboli da Market Watch. Storia su tutti i caricati. Passano decine di secondi di un ciclo! Non sono contento di MT5, per usare un eufemismo.

Gli Expert Advisors vengono eseguiti, ma non funzionano né i tick né il timer. L'unico modo per eseguire tutto è attraverso OnChartEvent (i tick e il timer possono essere passati lì dall'EA principale).

Non ho notato altre limitazioni. Tutto funziona.

Ma si può fare lo stesso su un grafico regolare secondo lo stesso principio. (In MT4 ce l'ho così, dato che non c'èOBJ_CHART )
 
Andrey Barinov:

Gli advisor sono avviati, ma non funzionano né i tick né il timer. Solo OnChartEvent può essere utilizzato per avviare tutto (e i tick e il timer possono essere inviati lì dall'EA principale).

Non ho notato altre limitazioni. Tutto funziona.

Questo è forte. Non sapevo di questa possibilità. Perché non mettete la gui nell'indicatore e interagite tramite le risorse? Io ce l'ho così. EventChartCustom() invia fino a 128 simboli, un doppio e un lungo alla volta e arriva alla coda OnChartEvent(). Nelle risorse, potete mettere qualsiasi carattere e valore di qualsiasi tipo tramite unità. E non fa la fila. Lo ottieni quando ne hai bisogno.
 
Реter Konow:
Questo è forte. Non sapevo di questa possibilità. Perché non mettete la gui nell'indicatore e usate le risorse per la comunicazione? Io ce l'ho così. EventChartCustom() invia fino a 128 simboli, un doppio e un lungo alla volta e arriva alla coda OnChartEvent(). Nelle risorse, potete mettere qualsiasi carattere e valore di qualsiasi tipo tramite unità. E non fa la fila. Lo ottieni quando ne hai bisogno.

Grazie, non sapevo di OnChartEvent. Fate la sincronizzazione attraverso eventi personalizzati? Scambio di dati?

 
Реter Konow:
Questo è forte. Non sapevo di questa caratteristica. Perché non mettere la gui in indicatore e usare le risorse? Io ce l'ho così. EventChartCustom() invia fino a 128 simboli, un doppio e un lungo alla volta e arriva alla coda OnChartEvent(). Nelle risorse, potete mettere qualsiasi carattere e valore di qualsiasi tipo tramite unità. E non fa la fila. Lo ottieni quando ne hai bisogno.

Non passo dati da OnChartEvent. Solo eventi. Altrimenti non ci sono eventi nell'agente EA, e in questo modo riceve ONTIMER_BEAT e ONTICK_BEAT.

I dati possono essere scambiati tramite un file o tramite risorse, a seconda del compito. Io uso più spesso i file, perché servono anche a ripristinare la GUI e tutto il resto dopo il riavvio del terminale.

La vostra GUI è in grado di ricordare e ripristinare il suo aspetto dopo il riavvio del terminale?

 
fxsaber:

Grazie, non sapevo di OnChartEvent. Fate la sincronizzazione attraverso eventi personalizzati? Scambio di dati?

Ogni messaggio di ogni lato ha un numero di sequenza. Quando la parte A invia un messaggio alla parte B, prima cerca di vedere se il messaggio precedente è stato letto. In caso contrario, non ne invia uno nuovo. Quando la parte B invia un messaggio alla parte A, cerca anche di vedere se il messaggio precedente è stato letto.
 
Andrey Barinov:

Non passo dati da OnChartEvent. Solo eventi. Altrimenti non ci sono eventi nell'agente EA, e in questo modo riceve ONTIMER_BEAT e ONTICK_BEAT.

I dati possono essere scambiati tramite un file o tramite risorse, a seconda del compito. Io uso più spesso i file, perché servono anche a ripristinare la GUI e tutto il resto dopo il riavvio del terminale.

La vostra GUI è in grado di ricordare e ripristinare la sua immagine dopo il riavvio del terminale?

Suggerirei di eliminare completamente EventChartCustom(), proprio a causa della coda, che a volte può causare degli stalli. Interagire attraverso le risorse facendo richieste bidirezionali alla frequenza del timer. Per esempio, se il lato A è pesantemente caricato con OnChartEvent() e il lato B invia un evento pulsante Annulla, allora il lato A potrebbe ricevere questo evento in ritardo a causa di qualche sciocchezza che lo sta caricando.

Sì, salvo il kernel in un file e lo carico da un file. In questo caso, tutte le impostazioni e l'aspetto sono ripristinati all'ultima vista dopo il riavvio. Ma, di solito dopo il riavvio ho bisogno di impostazioni di avvio, quindi non uso questa funzione.

 
Реter Konow:

Suggerirei di eliminare completamente EventChartCustom(), proprio a causa della coda, che a volte può causare rallentamenti. Interagire attraverso le risorse facendo richieste bidirezionali alla frequenza del timer . Per esempio, se il lato A è pesantemente caricato con OnChartEvent() e il lato B invia un evento pulsante Annulla, allora il lato A potrebbe ricevere questo evento in ritardo a causa di qualche sciocchezza che lo carica.

Il timer non funziona in EA che è su OBJ_CHART. Non ci sono EVENTI (tranne OnChartEvent). Pertanto, dobbiamo inviare tutti glieventi (OnTick, OnTimer ecc.) lì dall'EA principale.

Inoltre, non invio pressioni di tasti lì. Non ce n'è bisogno.
 
Andrey Barinov:

Il timer non funziona nell'EA che è su OBJ_CHART. Non ci sono EVENTI (tranne OnChartEvent). Pertanto, tutti gli eventi (OnTick, OnTimer ecc.) devono essere inviati lì dall'EA principale.

Inoltre, non mando avanti e indietro la pressione dei tasti. Non ce n'è bisogno.

Propongo di utilizzare l'indicatore come portatore di GUI, e le risorse come collegamento all'EA. Inoltre, in MT4, sarete in grado di controllare il tester Expert Advisor da un grafico standard utilizzando il pannello. Tutti i controlli funzioneranno, non solo i pulsanti. Sarete in grado di inviare testi e qualsiasi altra cosa all'EA in prova. L'ho già testato. Tutto funziona.

ZS. E l'EA in fase di test invierà dati diversi al grafico regolare.

Motivazione: