Imparare e scrivere insieme in MQL5 - pagina 17

 
Yedelkin:

Domanda sulla funzione Sleep(). Ho capito bene che l'uso di questa funzione in un Expert Advisor arresta l'esecuzione solo di quell'EA e trasferisce le risorse della CPU (kernel) ai prossimi compiti nella lista dei compiti di quel kernel? In altre parole, è corretto che la funzione Sleep() non rallenta il thread stesso in cui l'Expert Advisor viene elaborato, ma funziona come uno switch tra l'attuale Expert Advisor e altri programmi raccolti da un particolare kernel?

Per quanto ho capito, se imposto Sleep(0), commuterà. Se imposto Sleep(millisecondi), l'EA sarà fermato per un numero specificato di millisecondi.

Allo stesso tempo, per quanto ho capito, ogni Expert Advisor è un thread separato e ognuno di questi thread rivendica il tempo del processore (il controllo dello stato del thread viene eseguito ogni 100 millisecondi secondo l'aiuto).

Così, se un thread è inattivo, qualunque sia la ragione, il tempo della CPU viene passato a un altro thread e lo stato del thread che ha "deciso di dormire" viene controllato dopo 100 millisecondi.

PS

Per quanto riguarda la distribuzione dei core tra i thread, spetta agli sviluppatori.

 
Yedelkin:

Domanda sulla funzione Sleep(). Ho capito bene che l'utilizzo di questa funzione in un Expert Advisor sospende l'esecuzione solo di questo EA e trasferisce le risorse della CPU (kernel) ai prossimi compiti nella lista dei compiti di questo kernel? In altre parole, è corretto che la funzione Sleep() non rallenta il thread stesso in cui l'Expert Advisor viene elaborato, ma agisce come uno switch tra l'Expert Advisor corrente e altri programmi raccolti da un particolare kernel?

Ogni esperto viene eseguito in un proprio thread. Sleep() rallenta questo thread. Non c'è legame con i nuclei (maschera di affinità).
 
Yedelkin:

Domanda sulla struttura di MqlTradeResult. Non ho trovato il campo del tempo in esso - il tempo del controllo di successo della richiesta di base (o qualcosa del genere). Qualcuno ricorda se c'era una domanda sull'introduzione di un campo di tempo aggiuntivo nella struttura MqlTradeResult? Necessario per tirare fuori un ordine pendente se improvvisamente va in cronologia.

La richiesta non è chiara. Se l'ordine è stato aperto, memorizza l'ora di apertura. Perché avete bisogno del tempo di risposta del server?
 
sergeev:
La richiesta non è chiara. Se l'ordine è stato aperto, allora memorizza l'ora di apertura. Perché avete bisogno del tempo di risposta del server?

Il destino dell'ordine è tracciato dal biglietto, giusto? Tuttavia, la restituzione del ticket da parte della funzione OrderSend() non garantisce il successo dell'esecuzione dell'operazione di compravendita. Secondo la logica del programma, è sufficiente controllare se il mio biglietto è apparso tra gli ordini storici e quali accordi sono stati fatti dopo il suo inserimento. Per questo vorrei caricare la quantità minima di storia nella cache della storia - cioè dal momento della risposta del server alla richiesta iniziale, e non di più. Non abbiamo bisogno di lavorare con le proprietà di un ordine aperto - sarebbe un pezzo di codice ridondante. L'ordine potrebbe anche non aprirsi. Così, il tempo di risposta del server è necessario per scaricare la dimensione ottimale (quantità) di una storia fresca, utilizzando la funzione HistorySelect(). Allora, è chiaro che si tratta di "togliere un ordine dalla storia"?

Per quanto ho capito, la questione dell'introduzione di un campo di tempo addizionale nella struttura MqlTradeResult non è stata ancora sollevata.

 

A proposito di Sleep() ho capito che il ritardo del thread di Expert Advisor non influisce sull'esecuzione di altri programmi. Grazie.

 

Un'altra domanda su Sleep(). Il commento dice: "Non puoi chiamare la funzione Sleep() dagli indicatori personalizzati, poichégli indicatori vengono eseguiti nel thread dell'interfaccia e non dovrebbero rallentarlo". Ho letto il forum, ma ancora non capisco quanto segue: la frase "non si può chiamare dagli indicatori" - è un divieto preimpostato o una raccomandazione al programmatore?

 
Yedelkin:

Il destino dell'ordine è tracciato dal biglietto, giusto? Tuttavia, il ritorno del ticket OrderSend() non garantisce il successo dell'esecuzione del trade.

ahem.... dovresti dare un'occhiata a un libro di testo sull'invio di un ordine.
 
Yedelkin:

Un'altra domanda su Sleep(). Il commento dice: "Non puoi chiamare la funzione Sleep() dagli indicatori personalizzati, poichégli indicatori vengono eseguiti nel thread dell'interfaccia e non dovrebbero rallentarlo". Ho letto il forum, ma ancora non capisco quanto segue: la frase "non si può chiamare dagli indicatori" - è un divieto preimpostato o una raccomandazione al programmatore?

ban
 
sergeev:
xxm.... dovresti dare un'occhiata a un libro di testo sull'invio di un ordine.

Beh, avete capito bene. Te lo dico meticolosamente, puoi controllare: la funzione OrderSend() restituisce un valore booleano. In questo caso, se la richiesta viene controllata con successo, il biglietto d'ordine viene scritto nella variabile della struttura MqlResult. Io lo chiamo "ritorno della funzione del biglietto d'ordine" per me. Ecco il link alla fonte:"Quando si invia una richiesta di acquisto utilizzando la funzione OrderSend(), è possibile vedere immediatamente il ticket dell'ordine che è stato creato se la richiesta viene controllata con successo.

Per la risposta sul "divieto" - grazie, ho capito.

 
Yedelkin:

Beh, avete capito bene.

Sfortunatamente, continuo a non capirlo.

è necessario avere un campo "tempo" nella struttura di ritorno per qualche motivo. utilizzare il tempo nell'ordine in cui appare. Questo è sufficiente per controllare un po' di storia.