Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Vero. Grazie. Non me lo ricordavo. Non me lo ricordavo. In realtà non risolve completamente il problema poiché ho bisogno che gli ordini siano eseguiti quasi immediatamente (e penso che con questo metodo posso controllarlo solo ogni secondo, ma almeno non ogni tick), ma in effetti posso facilmente costruire una soluzione temporanea usandolo.
Anche se l'OnTimer ha il tasso più veloce allineato con l'orologio di sistema, cioè ogni 15 ms, preferirei un looping a intervalli di 1ms (usando lo Sleep(1) nel ciclo).
Anche se l'OnTimer ha il tasso più veloce allineato al clock di sistema, cioè ogni 15 ms, preferirei un looping a intervalli di 1ms (usando lo Sleep(1) nel ciclo).
Non sarebbe un problema? Voglio dire, non ci sono processi interni in MT4 che potrebbero aver bisogno di OnTick() per essere eseguiti per evitare che qualche tipo di buffer interno finisca in overflow o sovradimensionato dopo settimane di esecuzione (dell'EA) senza fermarsi e andare solo in loop?
Lo chiedo per ignoranza, non ho idea se possa essere un problema, solo supponendo che MT4 non sia stato concepito per farlo.
Quindi pensi(/hai provato) che non sarà un problema? (Se è così, sono ottime notizie).
BTW: come fai a far eseguire OnTimer() sotto l'intervallo di 1 sec? :?
Ero solito eseguire gli EA in un ciclo iniziato in init() alcuni anni fa, per una ragione simile - leggere i dati esterni con il minimo ritardo. Funzionava per settimane senza alcun effetto collaterale. Lo Sleep(1) è soddisfacente per rendere l'impatto sulla potenza di calcolo molto leggero.
Le impostazioni del timer accettano i millis.
Ero solito eseguire gli EA in un ciclo iniziato in init() alcuni anni fa, per una ragione simile - leggere i dati esterni con il minimo ritardo. Funzionava per settimane senza alcun effetto collaterale. Lo Sleep(1) è soddisfacente per rendere l'impatto sulla potenza di calcolo molto leggero.
Le impostazioni del timer accettano i millis.
BTW: come fai a far sì che OnTimer() venga eseguito sotto l'intervallo di 1 sec? :?
EventSetMillisecondTimer
La funzione indica al terminale client che gli eventi timer devono essere generati a intervalli inferiori a un secondo per questo Expert Advisor o indicatore.
boolEventSetMillisecondTimer(
intmillisecondi// numero di millisecondi
);
Parametri
millisecondi
[Numero di millisecondi che definisce la frequenza degli eventi timer.
Valore restituito
In caso di esecuzione corretta, restituisce true, altrimenti - false. Per ricevere un codice di errore, dovrebbe essere chiamata la funzione GetLastError().
Nota
Questa funzione è progettata per i casi in cui è richiesto un timer ad alta risoluzione. In altre parole, glieventi del timer dovrebbero essere ricevuti più frequentemente di una volta al secondo. Se un timer convenzionale con un periodo di alcuni secondi è sufficiente per voi, usate EventSetTimer().
Di solito, questa funzione dovrebbe essere chiamata dalla funzione OnInit() o nel costruttore della classe. Per gestire gli eventi provenienti dal timer, un Expert Advisor o un indicatore dovrebbe avere la funzione OnTimer() .
Ogni Expert Advisor e ogni indicatore lavora con il proprio timer che riceve gli eventi solo da questo timer. Durante la chiusura dell'applicazione mql4, il timer viene forzatamente distrutto nel caso in cui sia stato creato ma non sia stato disabilitato dalla funzione EventKillTimer().
Solo un timer può essere lanciato per ogni programma. Ogni applicazione mql4 e il grafico hanno la loro coda di eventi dove tutti gli eventi appena arrivati vengono messi. Se la coda contiene già l'evento Timer o questo evento è in fase di elaborazione, allora il nuovo evento Timer non viene aggiunto alla coda dell'applicazione mql4.
EventSetMillisecondTimer
La funzione indica al terminale client che gli eventi timer devono essere generati a intervalli inferiori a un secondo per questo Expert Advisor o indicatore.
boolEventSetMillisecondTimer(
intmillisecondi// numero di millisecondi
);
Parametri
millisecondi
[Numero di millisecondi che definisce la frequenza degli eventi timer.
Valore restituito
In caso di successo dell'esecuzione, restituisce true, altrimenti - false. Per ricevere un codice di errore, dovrebbe essere chiamata la funzione GetLastError().
Nota
Questa funzione è progettata per i casi in cui è richiesto un timer ad alta risoluzione. In altre parole, glieventi del timer dovrebbero essere ricevuti più frequentemente di una volta al secondo. Se un timer convenzionale con un periodo di alcuni secondi è sufficiente per voi, usate EventSetTimer().
Di solito, questa funzione dovrebbe essere chiamata dalla funzione OnInit() o nel costruttore della classe. Per gestire gli eventi provenienti dal timer, un Expert Advisor o un indicatore dovrebbe avere la funzione OnTimer() .
Ogni Expert Advisor e ogni indicatore lavora con un proprio timer che riceve gli eventi solo da questo timer. Durante la chiusura dell'applicazione mql4, il timer viene forzatamente distrutto nel caso sia stato creato ma non sia stato disabilitato dalla funzione EventKillTimer().
Solo un timer può essere lanciato per ogni programma. Ogni applicazione e grafico mql4 ha la propria coda di eventi dove vengono messi tutti gli eventi appena arrivati. Se la coda contiene già un evento Timer o questo evento è in fase di elaborazione, allora il nuovo evento Timer non viene aggiunto alla coda di mql4application.
Grazie per la spiegazione dettagliata; colpa mia; l'ho letto troppo velocemente online. (I link hanno scambiato il dominio docs.mql4.com con forum.mql4.com. Solo nel caso che qualcun altro controlli questo thread...)
EDIT: approfitto del fatto che c'è un moderatore in giro: Sapete se esiste qualche differenza tra eseguire OnTimer() ogni N millisecondi e fare lo stesso looping ogni N millisec come descritto nei post precedenti?
Non capisco perché tutto questo trambusto con i tempi in "ms". A meno che non si tratti di una sorta di "scalper di notizie ad alta frequenza" su una connessione di broker a bassissima latenza, gli intervalli di un secondo su OnTimer() dovrebbero essere più che sufficienti come tempo di risposta.
Se si aggiungono tutti i ritardi e la latenza dell'esecuzione dell'applicazione JAVA, la comunicazione IPC (LAN e WAN), l'esecuzione della gestione degli ordini e la latenza del server del broker, non c'è alcun vantaggio reale nell'usare un tempo "ms" per le strategie normali.
Se invece si tratta di una sorta di "High Frequency News Scalper", da utilizzare su un VPS con una connessione a bassa latenza al broker, allora non si dovrebbe affatto scherzare con JAVA e IPC, e si dovrebbe codificare la strategia direttamente in MQL molto compatto per ottenere la più bassa latenza possibile.
EDIT:
EDIT: approfitto della presenza di un moderatore: Sapete se esiste qualche differenza tra eseguire OnTimer() ogni N millisecondi e fare lo stesso looping ogni N millisec come descritto nei post precedenti?
Solo perché sono un moderatore, non significa che io sia più informato di altri. Infatti, gli altri post in questo thread hanno ovviamente più conoscenza di me sull'argomento. Non so nulla di Java.
Non capisco il senso dell'uso di Sleep() in un evento timer in quanto mette l'EA in attesa e questo potrebbe significare perdere molti eventi OnTick(). Naturalmente, a seconda dell'EA, gli eventi OnTick potrebbero essere poco importanti.
Ero solito eseguire gli EA in un ciclo iniziato in init() alcuni anni fa, per una ragione simile - leggere i dati esterni con il minimo ritardo. Funzionava per settimane senza alcun effetto collaterale. Lo Sleep(1) è soddisfacente per rendere l'impatto sulla potenza di calcolo molto leggero.
Per un po' di divertimento... il seguente script accetta più connessioni TCP/IP contemporanee, e scrive i messaggi in entrata delimitati da CR nel log degli esperti. Per esempio, una volta che lo script è in esecuzione ci si può connettere via Telnet (alla porta 51234 per impostazione predefinita), e ogni linea di testo digitata verrà stampata.
Per un po' di divertimento... il seguente script accetta connessioni TCP/IP multiple simultanee e scrive i messaggi in entrata delimitati da CR nel log degli esperti.
... dicendo una cosa ovvia, se si volesse fare quanto sopra in un EA piuttosto che in uno script, allora lo si cambierebbe semplicemente come segue: