Sento che questo muro di MQ non passerà senza il sostegno dei membri del forum. Il codice è breve, i professionisti dovrebbero essere in grado di capirlo rapidamente. Non ci sono difetti. Si dimostra chiaramente che i prezzi attraverso le posizioni sono ottenuti molto più velocemente che da Market Watch. Come MQ non riesca a vedere l'ovvio - non lo capisco.
1. Il tuo test conta davvero una micro percentuale di iterazioni a causa della condizione
if (Interval##A > 100)
In sostanza si contano solo le anomalie in cui il processore è sovraccarico di compiti e rimanda l'esecuzione del dato compito sul ripiano più lontano, poiché oltre il 99% delle iterazioni viene eseguito in meno di 1 microsecondo.
E anche se si imposta la condizione >0, non c'è ancora obiettività.
2. La misurazione del tempo di tali operazioni veloci dovrebbe essere fatta solo come tempo di ciclo completo, non come singola iterazione.
3. Ma poiché il ciclo nel tuo esempio è limitato a 10 secondi (Perché! Per i tic credo che 0,1 secondi siano sufficienti. Perché può benissimo succedere che 3 tick arrivino in un secondo, e tutti e tre i tick saranno eseguiti per 10 secondi ciascuno, e in parallelo), quindi non è necessario alcun timing. È più facile calcolare quante iterazioni saranno eseguite in un dato tempo. Più, più produttività.
Ho modificato "un po'" il tuo codice. Penso che la mia variante rifletta meglio la realtà.
Il calcolo viene fatto uno alla volta, per non mischiare le due varianti. I tick pari sono perSYMBOL_BID, quelli dispari - per GetBid().
Ho aggiunto le somme e il loro output per sicurezza, come tentativo di ingannare il compilatore contro l'ottimizzazione. Il risultato dell'uscita è cumulativo.
La versione originale di fxsaber mostra il vantaggio di GetBid, o è un PC più potente/meno carico?
La sua variante ha anche mostrato il vantaggio di GetBid a pieno carico della CPU. Ma allo stesso tempo la mia variante mostra tre volte il vantaggio della funzione regolare allo stesso carico. Questo perché la mia variante prende in considerazione il tempo medio di tutte le iterazioni per ottenere il prezzo Bid e la sua solo una minuscola frazione con appese anomale. Chissà per quale motivo il processore si impantana con la funzione regolare (quando il ritardo è superiore a 100 µ) in un "minuto" difficile. Ma ancora il tempo medio è tre volte inferiore per la funzione regolare
Così, per esempio, se (Intervallo##A > 100) questo è il caso:
mentre se (Intervallo##A > 0) è già abbastanza diverso, mostrando una distribuzione casuale di ritardi anomali tra la versione regolare e quella alternativa di ottenere il prezzo Bid
allo stesso tempo il mio test con lo stesso carico di CPU mostra:
2020.10.2622:16:10.569 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882, sum2 = 38804020.203015272020.10.2622:16:12.146 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315, sum2 = 39917412.886637632020.10.2622:16:13.741 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028, sum2 = 41233865.034524552020.10.2622:16:14.740 FxSaberBidSpeed (EURUSD,M1) EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476, sum2 = 23764764.643806012020.10.2622:16:15.756 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066, sum2 = 42491447.248944042020.10.2622:16:17.646 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543, sum2 = 43721243.03412782020.10.2622:16:20.146 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583, sum2 = 44907061.114185782020.10.2622:16:21.553 FxSaberBidSpeed (EURUSD,M1) EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552, sum2 = 24913626.429609182020.10.2622:16:24.865 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389, sum2 = 46051851.711824342020.10.2622:16:27.678 FxSaberBidSpeed (USDCAD,M1) USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646, sum2 = 46862113.16739535
Pertanto, penso che la versione di fxsaber del test sia tutt'altro che obiettiva.
Non ho caricato la CPU con gli agenti, ma con questo script. Era più efficiente.
dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:
2020.10.2622:45:03.679 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253, Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 17142020.10.2622:45:05.739 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:06.006 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617, Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 20832020.10.2622:45:09.099 FxSaberBidSpeed (EURUSD,M1) Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818, Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 17112020.10.2622:45:14.803 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 37902020.10.2622:45:15.745 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:16.115 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 38792020.10.2622:45:19.834 FxSaberBidSpeed (EURUSD,M1) Alert: , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755, TimeBid2 = 1141946, Всего итераций - 19435170, из них принято во внимание, NBid1 = 4724, NBid2 = 3547
cioè circa lo 0,01%.
Ci puoi scommettere. Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, solo quelli con tempo di esecuzione superiore a 100 000 nanosecondi sono presi in considerazione.
dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:
cioè circa lo 0,01%.
Ci puoi scommettere. Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, vengono contate solo le iterazioni maggiori di 100 000 nanosecondi.
Avremmo potuto semplicemente rendere la condizione non più di 100 µs, ma più di 3 µs. Il risultato è stato apparentemente lo stesso. Il pensiero era che uno studio segmentale e in diverse condizioni di esecuzione ci può essere una differenza in diversi segmenti e in diverse sezioni. Le priorità di esecuzione sono spesso fatte in funzione di qualsiasi cosa. A un carico leggero alcune priorità, a un carico elevato altre, a quelli critici, quelli che non fanno bloccare il computer e crash, e le prestazioni passano in secondo piano.
In generale, il commercio con un carico superiore al 70% dell'hardware non è corretto. È una performance quasi critica. Il carico di ferro sugli EA da combattimento non dovrebbe essere superiore al 60%.
Non sarò al mio computer per un po', quindi la farò breve.
In algotrading, nessuno si preoccupa della temperatura media dell'ospedale quando ci sono rallentamenti regolari. Ottenere prezzi in millisecondi è un evento regolare. E questo in un ambiente di combattimento.
Se è possibile ottenere prezzi senza picchi di lag in momenti importanti del trading, allora mi batterò proprio per questa opportunità.
Ho dimostrato con il codice che tale stampella esiste. Se volete evitare i lag, usate la stampella.
Nessuno qui ha mai guardato il codice confrontando i prezzi ricevuti quando si lavora anche con un tumbler. E lì, per usare un eufemismo, ci sono domande serie.
Il fatto è che la funzione regolare è in ritardo in modo catastrofico più spesso della stampella. E non mi interessa che il tempo medio sia vicino allo zero. Sono i ritardi che causano problemi durante il trading
Vuoi HFT - dimentica anche il lento livello di millisecondi per ora.
provare a testare SymbolInfoTick quando c'è un solo simbolo nella panoramica del mercato e quando ci sono decine di simboli, ma chiedere un solo strumento - come nel tuo esempio
c'è un'alta probabilità che il server stia inviando traffico compresso e che SymbolInfoTick stia sperimentando questo rallentamento intermittente quando decomprime i dati
cioè, quando ci sono molti simboli, ci saranno cali ancora più frequenti o più profondi nel tempo di prova
Nelle ultime build, la ricezione del flusso di tick non ha alcun effetto, anche teoricamente. In pratica, SymbolInfoTick funziona già con la cache, ma alcuni cittadini continuano a cercare un gatto nero.
Non vedo il senso dei test su un processore caricato all'80%.
Non è nemmeno l'80% nel test. Ci sono 6 agenti in esecuzione su 4 core, cioè garantiti al 100%.
L'unica domanda è come il task scheduler del suo sistema sta gestendo la situazione. Allo stesso tempo, alcuni sostengono che la colpa è dell'implementazione del terminale.
Cioè, si crea artificialmente una situazione in cui un computer è sovraccarico, quando letteralmente tutto su di esso rallenta, e poi si fanno delle affermazioni sotto forma di "Oh, guarda, perché il terminale a volte lagga".
Chiudiamo gli occhi sul fatto che anche in queste condizioni è "circa lo 0,01%" - al diavolo i dettagli! Basta dire che "a nessuno interessa la temperatura media dell'ospedale", "i ritardi causano problemi nel trading" e "vogliamo l'HFT".
Inoltre, ovviamente vogliamo HFT in 20 esperti su un vecchio desktop da ufficio o una macchina virtuale morta.
PS PositionSelectByTicket() nella sua implementazione ha certamente accesso a una risorsa condivisa con sincronizzazione degli accessi. E se non selezioni la posizione su ogni chiamata, stai leggendo il vecchio prezzo. Era più facile "fotografare" tramite SymbolInfoDouble.
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
Sento che questo muro di MQ non passerà senza il sostegno dei membri del forum. Il codice è breve, i professionisti dovrebbero essere in grado di capirlo rapidamente. Non ci sono difetti. Si dimostra chiaramente che i prezzi attraverso le posizioni sono ottenuti molto più velocemente che da Market Watch. Come MQ non riesca a vedere l'ovvio - non lo capisco.
1. Il tuo test conta davvero una micro percentuale di iterazioni a causa della condizione
In sostanza si contano solo le anomalie in cui il processore è sovraccarico di compiti e rimanda l'esecuzione del dato compito sul ripiano più lontano, poiché oltre il 99% delle iterazioni viene eseguito in meno di 1 microsecondo.
E anche se si imposta la condizione >0, non c'è ancora obiettività.
2. La misurazione del tempo di tali operazioni veloci dovrebbe essere fatta solo come tempo di ciclo completo, non come singola iterazione.
3. Ma poiché il ciclo nel tuo esempio è limitato a 10 secondi (Perché! Per i tic credo che 0,1 secondi siano sufficienti. Perché può benissimo succedere che 3 tick arrivino in un secondo, e tutti e tre i tick saranno eseguiti per 10 secondi ciascuno, e in parallelo), quindi non è necessario alcun timing. È più facile calcolare quante iterazioni saranno eseguite in un dato tempo. Più, più produttività.
Ho modificato "un po'" il tuo codice. Penso che la mia variante rifletta meglio la realtà.
Il calcolo viene fatto uno alla volta, per non mischiare le due varianti. I tick pari sono perSYMBOL_BID, quelli dispari - per GetBid().
Ho aggiunto le somme e il loro output per sicurezza, come tentativo di ingannare il compilatore contro l'ottimizzazione.
Il risultato dell'uscita è cumulativo.
Il mio risultato:
Come potete vedere, la differenza di prestazioni è tre volte a favore della versione standard.
Come potete vedere la differenza di prestazioni è tre volte a favore della versione originale.La versione originale di fxsaber mostra il vantaggio di GetBid, o si tratta di un PC più potente/meno carico?
La versione originale di fxsaber mostra il vantaggio di GetBid, o è un PC più potente/meno carico?
La sua variante ha anche mostrato il vantaggio di GetBid a pieno carico della CPU. Ma allo stesso tempo la mia variante mostra tre volte il vantaggio della funzione regolare allo stesso carico.
Questo perché la mia variante prende in considerazione il tempo medio di tutte le iterazioni per ottenere il prezzo Bid e la sua solo una minuscola frazione con appese anomale.
Chissà per quale motivo il processore si impantana con la funzione regolare (quando il ritardo è superiore a 100 µ) in un "minuto" difficile. Ma ancora il tempo medio è tre volte inferiore per la funzione regolare
Così, per esempio, se (Intervallo##A > 100) questo è il caso:
mentre se (Intervallo##A > 0) è già abbastanza diverso, mostrando una distribuzione casuale di ritardi anomali tra la versione regolare e quella alternativa di ottenere il prezzo Bid
allo stesso tempo il mio test con lo stesso carico di CPU mostra:
Pertanto, penso che la versione di fxsaber del test sia tutt'altro che obiettiva.
Non ho caricato la CPU con gli agenti, ma con questo script. Era più efficiente.
dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:
cioè circa lo 0,01%.
Ci puoi scommettere.
Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, solo quelli con tempo di esecuzione superiore a 100 000 nanosecondi sono presi in considerazione.
dopo una leggera modifica del test fxsaber per dimostrare chiaramente quale percentuale di iterazioni viene considerata nei calcoli:
cioè circa lo 0,01%.
Ci puoi scommettere.
Se il tempo medio di esecuzione di SymbolInfoDouble(_Symbol, SYMBOL_BID) è di circa 50 nanosecondi, vengono contate solo le iterazioni maggiori di 100 000 nanosecondi.
Avremmo potuto semplicemente rendere la condizione non più di 100 µs, ma più di 3 µs. Il risultato è stato apparentemente lo stesso. Il pensiero era che uno studio segmentale e in diverse condizioni di esecuzione ci può essere una differenza in diversi segmenti e in diverse sezioni. Le priorità di esecuzione sono spesso fatte in funzione di qualsiasi cosa. A un carico leggero alcune priorità, a un carico elevato altre, a quelli critici, quelli che non fanno bloccare il computer e crash, e le prestazioni passano in secondo piano.
In generale, il commercio con un carico superiore al 70% dell'hardware non è corretto. È una performance quasi critica. Il carico di ferro sugli EA da combattimento non dovrebbe essere superiore al 60%.
e avete già broker HFT?).
provare a testare SymbolInfoTick quando c'è un solo simbolo nella panoramica del mercato e quando ci sono decine di simboli, ma chiedere un solo strumento - come nel tuo esempio
c'è un'alta probabilità che il server stia inviando traffico compresso e che SymbolInfoTick stia sperimentando questo rallentamento intermittente quando decomprime i dati
cioè, quando ci sono molti simboli, ci saranno cali ancora più frequenti o più profondi nel tempo di prova
Nelle ultime build, la ricezione del flusso di tick non ha alcun effetto, anche teoricamente. In pratica, SymbolInfoTick funziona già con la cache, ma alcuni cittadini continuano a cercare un gatto nero.
Non è nemmeno l'80% nel test. Ci sono 6 agenti in esecuzione su 4 core, cioè garantiti al 100%.
L'unica domanda è come il task scheduler del suo sistema sta gestendo la situazione. Allo stesso tempo, alcuni sostengono che la colpa è dell'implementazione del terminale.
Cioè, si crea artificialmente una situazione in cui un computer è sovraccarico, quando letteralmente tutto su di esso rallenta, e poi si fanno delle affermazioni sotto forma di "Oh, guarda, perché il terminale a volte lagga".
Chiudiamo gli occhi sul fatto che anche in queste condizioni è "circa lo 0,01%" - al diavolo i dettagli! Basta dire che "a nessuno interessa la temperatura media dell'ospedale", "i ritardi causano problemi nel trading" e "vogliamo l'HFT".
Inoltre, ovviamente vogliamo HFT in 20 esperti su un vecchio desktop da ufficio o una macchina virtuale morta.
PS PositionSelectByTicket() nella sua implementazione ha certamente accesso a una risorsa condivisa con sincronizzazione degli accessi. E se non selezioni la posizione su ogni chiamata, stai leggendo il vecchio prezzo. Era più facile "fotografare" tramite SymbolInfoDouble.