MT5 e la velocità in azione - pagina 44

 
fxsaber:

Più di una volta ho visto situazioni in cui Terminal carica la CPU al 100% così tanto che non reagisce a nulla.

Poi ho guardato i log e ho visto che c'erano salti selvaggi di tick in OnTick. Tuttavia, se scrivo correttamente un EA, questa situazione disastrosa non influenzerà i risultati di trading. L'ho analizzato specificamente, tutto è chiaro.

Mi chiedo quanto siano diffusi i meccanismi di gestione dei ritardi nei prodotti di mercato. Non ho mai visto una volta menzionare la potenza della macchina per funzionare. Il ping minimo è un sì.

Dove li avete lanciati?

Se su VPS per 2-5 dollari, allora ritardi di decine e centinaia di millisecondi sono facilmente catturati in qualsiasi funzione WinAPI poco seria. Tutto rallenta a partire dal livello dell'hypervisor, trasformando una macchina virtuale in una proiezione di diapositive.

Spiegato sopra.

 
Renat Fatkhullin:

Non è GetMicrosecondsCount che sta rallentando, è il sistema operativo che sta quantificando le risorse della CPU per qualsiasi thread nel vostro VPS strangolato. Per qualsiasi funzione, qualsiasi azione, qualsiasi programma all'interno della vostra UPU.

Beh, nessuna shell della CPU può affettare e allocare le risorse in modo equo quando ha 20 (che è ancora rispettabile) sistemi operativi con 1500 thread di esecuzione per copia. Prendete 8-16 core e distribuiteli su 20 * 1.500 = 30.000 (trentamila tracce fisiche).

Nel mio caso (scatola virtuale con vin7 + 2 core + 16 GB di RAM su un hardware interamente mio con nient'altro in esecuzione), da dove vengono i 2-3 µs periodici?

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

MT5 e velocità in combattimento

Andrey Khatimlianskii, 2020.10.05 10:19

Non proprio un UPU, ma una macchina virtuale su hardware in affitto:

2020.09.29 00:11:11.350 Terminal        MetaTrader 5 x64 build 2615 started for MetaQuotes Software Corp.
2020.09.29 00:11:11.352 Terminal        Windows 7 Service Pack 1 build 7601 on Virtual Box, Intel Core i7-4770  @ 3.40 GHz, 14 / 15 Gb memory, 4 / 31 Gb disk, IE 11, Admin, GMT+2
2020.10.05 11:11:25.340 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:11:31.308 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:12:34.699 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 3 mсs.
2020.10.05 11:13:04.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:13:58.116 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:08.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:14.975 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:19.095 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:28.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:55.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:56.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:27.818 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 9 mсs.
2020.10.05 11:16:35.275 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:45.775 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 27 mсs.
2020.10.05 11:16:51.715 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:17:30.477 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 5 mсs.
2020.10.05 11:18:25.081 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.

 
Andrey Khatimlianskii:

Nel mio caso (scatola virtuale con win7 + 2 core + 16GB di RAM sul proprio hardware con nient'altro che gira), da dove vengono i 2-3 µs periodici?

Questo è il prezzo della doppia virtualizzazione.

Soprattutto perché VirtualBox non è un hypervisor completo di tipo Hyper-V, ma vive sopra il vostro attuale sistema operativo desktop (anche Windows 7?) che ha una shell della CPU fatta su misura per un caso d'uso diverso.

Quindi, avete: Windows 7/10 -> VirtualBox -> Windows 7. Essenzialmente, due livelli di virtualizzazione, con il primo che non conosce le aspirazioni di VirtualBox, vedendolo solo come un programma normale. L'allocazione delle risorse della CPU (il threadsheduler) è chiaramente incasinata.

Dovrebbe essere: Hyper-V 2016/2019 -> Windows 2016/2019

 
Renat Fatkhullin:

Non è GetMicrosecondsCount che sta rallentando, è il sistema operativo che sta quantificando le risorse della CPU per qualsiasi thread nel vostro VPS strangolato. Per qualsiasi funzione, qualsiasi azione, qualsiasi programma all'interno della vostra UPU.

Credo che un argomento come questo faccia riflettere. Consulente.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

// Сделал действия по этой ссылке: https://www.mql5.com/ru/forum/342090/page41#comment_18597040

void OnStart()
{
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetMicrosecondCount();
      , 1)
      
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetTickCount();
      , 1)      
}



2020.10.06 00:24:26.779 Alert: Time[Test6.mq5 52: for(inti=0;i<1 e6;i++)GetMicrosecondCount();] = 16289902 mсs.
2020.10.06 00:24:26.784 Alert: Time[Test6.mq5 57: for(inti=0;i<1 e6;i++)GetTickCount();] = 4300 mсs.


Così lontano dal rallentare tutto. Ecco perché sono stato in grado di passare a winmm::timeBeginPeriod(1)+winmm::timeGetTime() in modo abbastanza innocuo, ottenendo velocità come GetTickCount, ma senza il temuto limite di 16 ms. Tuttavia, i produttori di mercato non sono autorizzati a farlo, poiché si tratta di una DLL. È improbabile che tu faccia una versione regolare al millisecondo.

 
Renat Fatkhullin:

La funzione MQL5 per minimizzare tutte le finestre e l'applicazione stessa è una grande idea. Lavoreremo su questo.

Ecco un'altra cosa.

terminale su un VPS, allora sarà fortemente contraria ad avere tutto bruscamente rollato. Lui stesso può e deve minimizzare windows se lascia la sessione RDP.

Attualmente sto usando WinAPI per minimizzare con un tasto di scelta rapida. Molto comodo e molto più innocuo del TerminalClose standard.
 
Renat Fatkhullin:


Ecco un esempio di quello che volevo dire.
Entrambi i server sono broker diversi, sono nella stessa zona, possono essere nella stessa posizione.
La scheda di servizio suggerisce che AMP si trovi nel Regno Unito.
E per Solo per qualche motivo offre in NL.
Perché? Se c'è un vpc più vicino.

dfgh

jt

 
fxsaber:

Credo che troverete un argomento che vi farà riflettere. Consigliere.


Così lontano dal rallentare le cose. Ecco perché sono stato in grado di passare a winmm::timeBeginPeriod(1)+winmm::timeGetTime() abbastanza innocuamente, ottenendo velocità come GetTickCount, ma senza il temuto limite di 16ms. Tuttavia, i produttori di mercato non sono autorizzati a farlo, poiché si tratta di una DLL. È improbabile che tu faccia una versione regolare al millisecondo.

Beh, sei un maestro degli stress test di corsa senza correlazione o controllo di ragionevolezza.

Naturalmente la misurazione al microsecondo richiede risorse per poter misurare intervalli 1000 volte più piccoli di un millisecondo.

Se occasionalmente avete bisogno di misurare intervalli in modo super accurato, allora usate i microsecondi. E vi costerà 0 microsecondi.

Se sei impostato per chiamare milioni di volte l'auto-misura, probabilmente ti stai impegnando in un'auto-illusione.


Su un VPS soffocato, overcloccare il timer di sistema tramite timeBeginPeriod è rischioso. Aumenterete solo l'overhead della CPU:

Questa funzione influisce su un'impostazione globale di Windows. Windows usa il valore più basso (cioè la risoluzione più alta) richiesto da qualsiasi processo. L'impostazione di una risoluzione più alta può migliorare la precisione degli intervalli di time-out nelle funzioni di attesa. Tuttavia, può anche ridurre le prestazioni complessive del sistema, perché il thread scheduler cambia i compiti più spesso. Risoluzioni elevate possono anche impedire al sistema di gestione dell'alimentazione della CPU di entrare in modalità di risparmio energetico. L'impostazione di una risoluzione più alta non migliora la precisione del contatore di prestazioni ad alta risoluzione.

Altrimenti, il sistema operativo avrebbe dovuto fare un accurato GetTickCount/GetTickCount64 molto tempo fa e rallegrarsi della precisione gratuita. Ma no, dovrete pagare per la precisione di questo timer.

 
Si prega di rimuovere i freniCHART_IS_MAXIMIZED. La soluzione WinAPI non è ora un ordine di grandezza più veloce della soluzione stock.
 
Roman:

Ecco un esempio di quello che volevo dire.
Entrambi i server sono broker diversi, sono nella stessa zona, possono essere nella stessa posizione.
La scheda di servizio suggerisce che AMP si trovi nel Regno Unito.
E per Solo per qualche motivo offre in NL.
Perché? Se c'è un PSTN più vicino.

Conosciamo i geopunti dei server, e qui le posizioni dei server broker sono costruite da basi GeoIP.

E spesso succede che l'informazione non corrisponde alla realtà. Perciò non dovremmo mai dare per scontato che la posizione del broker sia accurata.

Approfondiremo questo aspetto domani, perché abbiamo bisogno di ricontrollare e riesaminare manualmente tutto per rispondere alla domanda.

 
Renat Fatkhullin:

Questo è il prezzo della doppia virtualizzazione.

Soprattutto perché VirtualBox non è un hypervisor completo di tipo Hyper-V, ma vive sopra il vostro attuale sistema operativo desktop (anche Windows 7?) che ha una shell della CPU fatta su misura per un caso d'uso diverso.

Quindi, avete: Windows 7/10 -> VirtualBox -> Windows 7. Essenzialmente, due livelli di virtualizzazione, con il primo che non conosce le aspirazioni di VirtualBox, vedendolo solo come un programma normale. L'allocazione delle risorse della CPU (il threadsheduler) è chiaramente incasinata.

Dovrebbe essere: Hyper-V 2016/2019 -> Windows 2016/2019

No, ho dei virtualizzatori che girano su CentOS. Ma non sono competente per continuare questo dialogo.