Programmazione asincrona e multithread in MQL

 
C'è la necessità di scrivere il codice mql in modalità asincrona o multithreaded.
Ho familiarità con la scrittura di codice asincrono e multi-threaded dal modulo asyncio di Python.

Come sapete, tutti gli EA e gli script in mql vengono eseguiti in un unico thread.
Pertanto, c'è un po' di confusione al riguardo.
La libreria WinAPI portata su mql ha funzioni per lavorare con i thread tramite WinAPI.
Se uso queste funzioni multi-threading nel mio codice mql, allora anche le funzioni passate da mql saranno multi-threaded?
E l'Expert Advisor/Script è single threaded per default, non ostacolerà l'uso del multi-threading in WinAPI?

Se è possibile utilizzare il multithreading WinAPI nei programmi mql, per favore suggeritemi una guida o articoli su come gestire questi thread WinAPI in mql.
Capisco il principio di base di asyncio, ma mi mancano gli esempi illustrativi per mql.
Sono a conoscenza dell'aiuto di Microsoft, ma non l'ho studiato, perché non ho ancora capito bene la logica di utilizzo del flusso WinAPI in mql, e cosa si trova esattamente nell'aiuto.
Indicami la direzione giusta, se ci sono esempi o articoli per mql, sarebbe fantastico.
 

Provate, è inutile tirare a indovinare. Se i puntatori alle funzioni sono validi, forse qualcosa funzionerà. Hai pensato a un'altra domanda: come inizializzare la libreria µl standard per un nuovo thread?

Gli esempi sono facili da cercare su Google - "winapi multithreading". Dovreste capire (forse lo sapete senza di me) che la programmazione multithread è un altro livello, potreste perdere le gambe. Dubito che Python (anche se sono 0 in Python) possa rivelare tutti i lati di questa attività. È improbabile ottenere un non-codice multi-thread decente a caso.

 
Vict:

Avete pensato a un'altra domanda: come inizializzare la libreria µl standard per un nuovo thread?

Sì, la libreria standard WinAPI, portata da Windows API, che interagisce tramite dll standard.
Di conseguenza, la dll standard deve essere inizializzata, e per questo in WinAPI ci sono anche delle funzioni portate.
Gli esempi in C++ per l'inizializzazione della dll dovrebbero poter funzionare anche in mql.
Dato che le funzioni di inizializzazione sono le stesse dell'API di Windows, la cosa principale è trovare gli esempi giusti che non siano superati, questo è il problema. Una ricerca su Google non è sempre il risultato giusto.
Ci sono molti programmatori professionisti su questo forum, possono mostrarvi un pezzo di codice, come farlo bene: inizializzazione, allocazione della memoria, deinizializzazione, ecc.
E poi bisogna lavorare con i fili. È molto strano che non ci sia nessun articolo su questo argomento nella sezione "Articoli" finora.

Vittoria:

In generale, dovete capire (forse lo sapete senza di me) - la programmazione multithread è un altro livello, si può rimanere senza gambe.
Dubito che Python (anche se sono 0 in Python) possa rivelare tutti i lati di questa attività. È improbabile ottenere un non-codice multi-thread decente a caso.

Cosa intende per "rimasto senza gambe"?
Se si lavora correttamente con i flussi o l'asincronia, non dovrebbero esserci disabilità.
Questa è la sfida, imparare a usare correttamente i thread API di Windows in mql, o async.
In Python ho lavorato soprattutto con async, tutto vola bene, con i thread in Python a causa di GIL ci sono problemi. Per questo motivo è meglio non usare i thread in Python.

 
Roman:
C'è la necessità di scrivere il codice mql in modalità asincrona o multithreaded.
Ho familiarità con la scrittura di codice asincrono e multi-threaded dal modulo asyncio di Python.

Come sapete, tutti gli EA e gli script in mql vengono eseguiti in un unico thread.
Pertanto, c'è un po' di confusione al riguardo.
La libreria WinAPI portata su mql ha funzioni per lavorare con i thread tramite WinAPI.
Se uso queste funzioni multi-threading nel mio codice mql, allora anche le funzioni passate da mql saranno multi-threaded?
E l'Expert Advisor/Script è single threaded per default, non ostacolerà l'uso del multi-threading in WinAPI?

Se è possibile utilizzare il multithreading WinAPI nei programmi mql, per favore suggeritemi una guida o articoli su come gestire questi thread WinAPI in mql.
Capisco il principio di base di asyncio, ma mi mancano gli esempi illustrativi per mql.
Sono a conoscenza dell'aiuto di Microsoft, ma non l'ho studiato, perché non ho ancora capito bene la logica di utilizzo del flusso WinAPI in mql, e cosa si trova esattamente nell'aiuto.
Indicami la direzione giusta, se ci sono esempi o articoli per mql, sarebbe fantastico.
mt5 ha un openCL per il multithreading. Cercate gli articoli su questo argomento qui.
 

Non potete chiamare funzioni MQL da una DLL.

Ma è possibile eseguire più thread attraverso chiamate DLL, in modo che possano lavorare indipendentemente da MQL5 nel loro ambiente.

Per esempio, si preparano i dati da MQL e si mettono da qualche parte o si passano alla DLL, che a sua volta lavorerà con più thread e restituirà il risultato attraverso una funzione aggiuntiva.

 
Roman:

Sì, l'ho fatto, la libreria standard WinAPI, portata da Windows API, che interagisce tramite dll standard.
Corrispondentemente, le dll standard devono essere inizializzate, e ci sono anche funzioni portate in WinAPI per questo scopo.

No, stavo parlando specificamente della libreria µl standard (sai, le funzioni di trading lì, per esempio, e tutte le altre). Ci devono essere dati globali lì, e ogni thread deve avere la propria copia, il vostro nuovo thread tramite CriatTrade() rimarrà non inizializzato correttamente.

Cosa intende per "lasciato senza gambe"?

Ci sono molti rastrelli là fuori. Ma se non avete problemi con una lettura come questa https://en.cppreference.com/w/cpp/atomic/memory_order, siete pronti.
 
MetaQuotes Software Corp.:

Ma è possibile eseguire più thread tramite chiamate DLL, in modo che lavorino indipendentemente da MQL5 nel loro ambiente.

Questo è ciò di cui stiamo parlando, usare la libreria WinAPI standard ported, implica semplicemente lavorare attraverso le dll standard di Windows.

Vittoria:

No, stavo parlando esattamente della libreria standard MQL5 (ad esempio le funzioni di trading e tutto il resto). Ci devono essere dati globali lì e ogni thread deve avere la propria copia, il vostro nuovo thread tramite CREATTrade() rimarrà non inizializzato correttamente.

Ci sono molti rastrelli lì dentro. Ma se non avete problemi con una lettura come questa https://en.cppreference.com/w/cpp/atomic/memory_order, siete a posto.

Per quanto ne so, quando inizializzi la dll, puoi anche inizializzare le funzioni esportate che saranno chiamate dalla dll al programma mql.
Quindi questo non è il problema principale, il problema è come farlo? Come ho scritto sopra, forse gli esempi C++ funzioneranno anche in mql, ma ho pensato che gli esempi di codice mql potessero aiutare qui.
Così per dire, per non scervellarmi sulla portabilità, forse qualcuno che ha già lavorato con WinAPI potrà darmi un suggerimento.

p.s.
Ah, ho capito cosa intendi, ma si tratta del porting di WinAPI, non delle funzioni mql,
forse le funzioni mql potrebbero essere inizializzate tramite oggetti, o messe nella loro dll e inizializzate come descritto sopra.

 

Qualcosa che non ci capiamo.

Ma non preoccupatevi - non creerete un thread tramite CREATTrade() all'interno di µl, è necessario passare un puntatore a una funzione (dove il thread inizierà), ma come notato sopra - kukush.

 

Traduco quello che vi è già stato detto da un rappresentante della società di sviluppo MT:

Non si possono creare thread da MQL. Nemmeno con WinAPI.

Potete farlo solo scrivendo la vostra DLL.


 
Roman:
C'è la necessità di scrivere il codice mql in modalità asincrona o multithreaded.

Non è la cosa giusta da fare, ma è bene imparare

Многопоточный асинхронный WebRequest на MQL5 своими руками
Многопоточный асинхронный WebRequest на MQL5 своими руками
  • www.mql5.com
Реализация торговых алгоритмов часто требует анализа информации из различных внешних источников, в частности из Internet. MQL5 предоставляет функцию WebRequest для отправки HTTP-запросов во "внешний мир", но она, к сожалению, обладает одним заметным недостатком. Эта функция является синхронной, а потому блокирует работу эксперта на все время...
 
Vict:

Qualcosa che non capiamo l'uno dell'altro.

Ma non impantanatevi - non creerete un thread tramite CREATTrade() all'interno di µl, dovete passare un puntatore a una funzione (con cui il thread inizierà), ma come notato sopra - kukish.

E questa risposta allora?

Forum sul trading, sistemi di trading automatico e test di strategia

Programmazione asincrona e multithread in MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Ma è possibile eseguire più thread tramite chiamate DLL, in modo che lavorino indipendentemente da MQL5 nel loro ambiente.

Vict, forse come hai descritto c'è un problema con i thread che lavorano all'interno di mql, ma da quanto ho capito chiamare funzioni da WinAPI usando CriatTrade() non dovrebbe essere un problema.
Ho bisogno del multithreading con funzioni WinAPI, non con funzioni mql.

Motivazione: