![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Per favore, date un diagramma-codice rudimentale per questa idea. A prima vista sembra un completo malinteso.
Durante l'esecuzione della funzione OnMain non c'è modo di conoscere lo stato della coda reale corrente. L'unico workaround per farlo è un programma spyware, come indicato nel link.
Nella sua forma più semplice:
Dovete solo cambiare l'approccio ai calcoli stessi (fare il ritorno intermedio tutte le volte che il compito lo richiede). Ma se è difficile, considerate al 1º passo che OnMain non esiste per voi (spostate il codice principale non in OnMain, ma in On2XX), rispettivamente, in OnMain non dovete imparare nulla
Le stampelle vengono fatte nella direzione sbagliata:
Lasciate le funzioni OnXXX solo copiando gli eventi (parametri) nella coda e chiamando la funzione principale OnMain. Spostare tutto il loro codice per duplicare le funzioni On2XX. E chiamate queste funzioni On2XX duplicate dall'OnMain nella sequenza in cui avete bisogno, passando loro a turno i dati delle code come parametri.
Poi eseguire le misurazioni e mostrare il guadagno di velocità, e poi si può suggerire di integrare MQL con funzionalità appropriate. Ma perché aggiungere, se hai già fatto tutto da solo qui e ora?
Non è di questo che stai scrivendo.
Il problema è che la funzionalità di riempimento dei campi nelle variabili di input della funzione "OntaredeTransaction" non corrisponde alla descrizione data nella Guida, in peggio:
cioè molti campi non sono riempiti nelle chiamate e anche nella chiamata finale di TRADE_TRANSACTION_HISTORY_ADD.
Di conseguenza, tutti i commercianti sono agonizzanti qui per determinare in qualche modo questi parametri mancanti al momento dell'arrivo.
Ci sono state molte discussioni qui, basta fare una ricerca sul forum - la scarsa funzionalità "OntaredeTransaction" causa spese aggiuntive sia in tempo che "carica" i commercianti con tempo extra speso per lo sviluppo di codice adeguatamente funzionante (cioè enormi perdite di tempo e colossale inefficacia a livello di comunità).
Le risposte attuali degli sviluppatori come "Se hai un simbolo di esecuzione di mercato, avrà valore di prezzo zero; dovrebbe essere così" (Link).(Link) - questo è UNNORMAL, ancora una volta -
mancanza di valori esaustivi nell'ultima chiamata di funzione porta ad un sacco di lavoro extra.
HistorySelect.
Questa è una caratteristica follemente costosa. E purtroppo, nessuna quantità di cache può rendere la sua velocità accettabile ora.
Per esempio, negli EA sul campo di battaglia è importante lavorare con dati reali. In particolare, che i tick di Market Watch e CopyTicks non siano obsoleti, se possibile.
Per fare questo, ci sono meccanismi non molto buoni, ma forzati per controllare la pertinenza dei dati sui prezzi attuali. Una parte di questo meccanismo consiste nel rilevare situazioni in cui un trade su un simbolo è passato dopo l'ultimo tick. Questo non accade raramente, quindi è importante sapere se la zecca attuale è ancora aggiornata o no.
Per questo rilevamento, è necessario essere in grado di accedere alla storia degli affari recenti. Si fa usando la HistorySelect nel seguente modo schematico.
Purtroppo, una tale chiamata di HistorySelect richiede 5-30 millisecondi (l'ho misurato io stesso in Release-EX5). Quando l'Expert Advisor fa diversi aggiornamenti di questo tipo in OnTick (dovrebbe essere fatto dopo ogni pausa, per esempio, dopo ogni OrderSend), allora tutto diventa follemente costoso/lungo. HistorySelect può consumare collettivamente diversi secondi in un singolo OnTick.
Cari sviluppatori, perché è così caro? Questa funzione può essere eseguita istantaneamente con una corretta implementazione.
Avete prove che "una tale chiamata a HistorySelect dura 5-30 millisecondi"?
Se ho capito bene la tua idea, allora il codice di test dovrebbe assomigliare a questo:
Ecco come funzionano le 100000 query:
Avete prove che "una tale chiamata a HistorySelect dura 5-30 millisecondi"?
Se ho capito bene il tuo punto, allora il codice di test dovrebbe assomigliare a questo:
Ecco come funzionano le 100.000 interrogazioni:
Avete prove che "una tale chiamata a HistorySelect dura 5-30 millisecondi"?
Se ho capito bene il tuo punto, allora il codice di test dovrebbe assomigliare a questo:
Ecco come funzionano le 100.000 interrogazioni:
Eseguire lo script.
Lancia un altro script.
Conteggio delle battaglie normali. Non HFT.
A proposito, il tuo script ha mostrato che HistorySelect ricalcola tutto ogni volta. E i parametri di input non sono cambiati, la tabella della storia non è stata aggiornata, altre funzioni HistorySelect non sono state chiamate.
Eseguire lo script.
Allora sono necessari dei dettagli.
Il mio test è stato eseguito su non il più veloce "Intel Xeon E5-2630 v4 @ 2.20GHz" con molti altri processi in background.
La storia del mio conto di prova mostra 31315 ordini più o meno uniformemente dal 2009, compresi 8 ordini per oggi.
Forse, avevi qualche script o Expert Advisor in esecuzione allo stesso tempo causando un carico drastico dei database del terminale. Provatelo su un terminale "pulito".
Test più informativo:
Tre corse:
Allora sono necessari dei dettagli.
Il mio test è stato eseguito su non il più veloce "Intel Xeon E5-2630 v4 @ 2.20GHz" con molti altri processi in background.
Il conto di prova aveva 31315 ordini nella sua storia più o meno uniformemente dal 2009, compresi 8 ordini per oggi.
Forse, avevi qualche script o Expert Advisor in esecuzione allo stesso tempo che ha caricato drasticamente i database del terminale. Provatelo su un terminale "pulito".
Terminale vuoto sullo stesso account e sulla stessa macchina.
Su altri conti e terminali la stessa immagine. Configurazione.
Chiedo ai lettori di dare i loro risultati di questo script.
Un test più informativo:
Tre partenze:
Terminale 2460 vuoto.
ZS Eseguire su un conto vuoto.
La velocità sembra essere fortemente influenzata dal numero di scambi, non dagli ordini.
Terminale vuoto sullo stesso account e sulla stessa macchina.
Su altri conti e terminali lo stesso schema. Configurazione.
Chiedo ai lettori di citare i loro risultati di questo script.
Non prova nulla, ma il fatto che ad ogni nuova corsa (su un simbolo diverso), il tempo aumenta - è allarmante...
Necessità di operare su un conto con una lunga storia di trading.