MT5 e la velocità in azione - pagina 16

 
fxsaber:

Sarebbe interessante confrontare lo stesso script con altre piattaforme di trading.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Solo tre scivoloni e poi sono spuntati molto raramente. Probabilmente è difficile creare un freno dato che non c'è HistorySelect e CopyTicks.

 
Fast235:

così sono entrambi Haswell, xeon ha molto più bassa frequenza operativa, ci sarà degrado delle prestazioni in prestazioni e test singolo, solo in ottimizzazione multi-threaded sarà un vantaggio. L'i3 degli ultimi modelli dovrebbe essere molto più veloce da eseguire

chiedere agli sviluppatori l'effetto del livello di cache sulla velocità e in generale la velocità di Zen2 e degli ultimi intel


aggiungere

Ryzen 3700x che ho, si possono fare prove con Intel

per esempio con questo script MQL5\Scripts\UnitTests\Stat\TestStatBenchmark.mq5

fare il loop più volte con un timer

Qui non stiamo parlando di test, ma di ritardi nell'esecuzione degli ordini. Questo ritardo c'è ed è fluttuante. E questo preoccupa molto sia me che il TS.

 
fxsaber:

Solo tre cose sono saltate fuori e poi sono saltate fuori molto raramente. Deve essere difficile creare un freno visto che non ci sono HistorySelect e CopyTicks.

Atteso anche su MT4.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

TimeLocal in 36 millisecondi. Scegli un simbolo con un volume di tick maggiore.

 

Per chiunque sia interessato, ecco le istruzioni per la riproduzione.

Chi pensa che non sarà toccato.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

Ha scelto un simbolo con un volume di tick maggiore.

Non ho nemmeno intenzione di controllarlo. Immaginate il simbolo FORTS più popolare con una sottoscrizione a tick. Invece della logica OnTick in OnBookEvent. I ritardi devono essere terribili.

Ho bisogno di un consiglio ufficiale su cosa fare per minimizzare i ritardi.

 
fxsaber:

Per riprodurre i freni, è necessario eseguire lo script su più grafici a UNO carattere - ottenere che OnTick sia chiamato allo stesso tempo. Poi, gli avvisi saranno inviati ad ogni tick.

Il grafico del carico della CPU mostra che terminal64.exe carica fino al 30% degli otto core logici. Sono solo quattro grafici EURUSD con lo script in esecuzione. Si può vedere chiaramente quanto ogni grafico è caricato alla volta.

Dove vanno a finire così tante risorse?

È facile rispondere a questa domanda.

Qui si copiano molti dati:

    HistorySelect(MathRand(), INT_MAX);

In realtà stai dando un comando per prendere tutta la storia di trading disponibile dal database del terminale nell'ambiente EA, per un uso successivo. State volutamente cercando di mettere in crisi un possibile algoritmo di caching per richieste identiche.

Ma voi non usate tutti questi dati, ma li resettate immediatamente nella riga successiva:

    _B2(HistorySelect(Tick.time, INT_MAX));

Ovviamente la base terminale qui è una risorsa condivisa con accesso sincronizzato. E lei ha deliberatamente creato migliaia di ordini e accordi in esso.

Tutta questa azione senza senso viene ripetuta 10 volte ad ogni tick da diversi thread alla volta. E state deliberatamente facendo accadere queste azioni simultaneamente da diversi thread.

Quindi sapete molto bene cosa state facendo e perché, dove vengono spese le risorse, e allo stesso tempo sostenete che "il ritardo è causato da un eccessivo carico della CPU da parte di MT5".

Detto questo, è chiaro che hai un problema con il tuo computer. Cioè, sì, state attivamente spostando quantità significative di memoria, ma non dovrebbe influenzare il tempo di esecuzione delle funzioni, specialmente non legate a HistorySelect() in alcun modo.

Nei nostri test b2582, anche con 1000 volte per tick e 5 EAs su grafici di un carattere, cioè ordini di grandezza più grandi delle vostre condizioni di default, non è stato osservato un solo Allarme.

Il nostro sistema di test: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

È facile rispondere a questa domanda.

Qui è dove si copiano molti dati:

In realtà stai dando un comando per prendere tutta la storia di trading disponibile dal database del terminale nell'ambiente EA, per un uso successivo. Cercando volutamente in modo casuale di disturbare il possibile algoritmo di caching di richieste identiche.

Ma voi non usate tutti questi dati, ma li resettate immediatamente nella riga successiva:

Ovviamente la base del terminale qui è una risorsa condivisa con accesso sincronizzato. E lei ha deliberatamente creato migliaia di ordini e accordi in esso.

Tutta questa azione senza senso viene ripetuta 10 volte ad ogni tick da diversi thread alla volta. E state deliberatamente facendo accadere queste azioni simultaneamente da diversi thread.

Quindi sapete molto bene cosa state facendo e perché, dove vengono spese le risorse, e allo stesso tempo sostenete che "il ritardo è causato da un eccessivo carico della CPU da parte di MT5".

Detto questo, è chiaro che hai un problema con il tuo computer. Cioè, sì, state attivamente spostando quantità significative di memoria, ma non dovrebbe influenzare il tempo di esecuzione delle funzioni, specialmente non legate a HistorySelect() in alcun modo.

Nei nostri test b2582, anche con 1000 volte per tick e 5 EAs su grafici di un carattere, cioè ordini di grandezza maggiori delle tue condizioni di default, non è stato osservato un solo Allarme.

Il nostro sistema di test: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Colleghi,

è ora che tu esca dal cerchio dell'aeromodellismo.

Ecco le condizioni di battaglia: 4 terminali, circa 300 Expert Advisors, circa 30 strumenti. Un terzo di loro è abbonato ai tumbler. Tutto questo su FORTS. Simulare in queste condizioni.

 
Dmi3:


Colleghi,

è ora che tu esca dal circolo dei modellisti di aerei.

Ecco le condizioni di combattimento: 4 terminali, circa 300 EAs, circa 30 strumenti. Un terzo degli EA sono abbonati ai tumbler. Tutto questo su FORTS. Simulare in queste condizioni.

"Here you go" viene accettato come file zip, più una descrizione dettagliata del problema. Altrimenti è una conversazione vuota.

Ciò che viene discusso qui è il codice dell'EA presentato e l'efficacia della sua esecuzione. Sulla base dei problemi identificati, si è lavorato per ottimizzare il codice del terminale.

 
Anton:

"Here you go" viene accettato come file zip, più una descrizione dettagliata del problema. Altrimenti è una conversazione vuota.

In questo caso, la discussione riguarda il codice presentato dall'Expert Advisor e l'efficienza della sua esecuzione. Il codice del terminale è stato ottimizzato per i problemi identificati.

Non ho nessun problema, non c'è niente da inviare.

fxsaber ha problemi, ha già scritto 16 pagine qui.

E Mikhail ha gli stessi problemi dal 2014, ha già scritto 149 pagine: https://www.mql5.com/ru/forum/38456/page149.

Sono entrambi abbastanza qualificati per darvi tutte le informazioni di cui avete bisogno.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

È facile rispondere a questa domanda.

Qui è dove si copiano molti dati:

In realtà stai dando un comando per prendere tutta la storia di trading disponibile dal database del terminale nell'ambiente EA, per un uso successivo. Randomizzare volutamente cercando di disturbare il possibile algoritmo di caching di richieste identiche.

Lei non ha seguito la cronologia di sviluppo di questo thread, quindi si permette delle note accusatorie nelle sue affermazioni.

Ho rimosso la linea MathRand. Ecco un breve resoconto.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Ma tu non usi tutti questi dati, li scarichi immediatamente nella riga successiva:

Ovviamente la base terminale qui è una risorsa condivisa con accesso sincronizzato. E lei ha deliberatamente creato migliaia di ordini e accordi in esso.

Lo provo su conti reali dove gli ordini superiori a 10K sono la norma. Questi non sono ordini falsi, poiché >70% di essi sono stati eseguiti.

Nello screenshot, a proposito, 9331+576 != 12529.

Tutta questa azione insensata viene ripetuta 10 volte ad ogni tick da più fili contemporaneamente. E state deliberatamente facendo in modo che queste azioni da più thread si verifichino simultaneamente.

Sto avendo problemi su diversi personaggi. Si suggerisce un unico simbolo per riprodurre più rapidamente il problema.

Ripetere 10 volte per ogni spunta è una necessità vitale. Poiché è normale che un EA contenga una dozzina di TC con diverse major.

Quindi sai molto bene cosa stai facendo e perché, e dove vanno le risorse, eppure affermi che "La latenza è dovuta a un carico eccessivo della CPU da parte di MT5".

Detto questo, è chiaro che hai un problema con il tuo computer. Voglio dire, sì, state attivamente spostando quantità significative di memoria, ma non dovrebbe influenzare il tempo di esecuzione delle funzioni, specialmente non legate a HistorySelect() in alcun modo.

Non posso accusarla di incompetenza, ma quello che ha scritto, per usare un eufemismo, provoca sconcerto. HistorySelect è la ricerca di quattro indici (inizio/fine per la tabella degli ordini e inizio/fine per la tabella degli affari). Le tabelle sono ordinate per tempo, quindi c'è (dovrebbe esserci) una ricerca binaria al peggio. Per 10K ordini è istantaneo (calcolare il logaritmo binario). Che movimento del volume della memoria! Nessuno qui sta parlando della temuta HistorySelectByPosition. L'elemento HistorySelect è interessato.

Sui nostri test b2582, anche con 1000 volte per tick e 5 EAs su grafici di un carattere, cioè ordini di grandezza maggiori delle vostre condizioni di default, non si osserva un solo Allarme.

Il nostro sistema di test: Windows 10 build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

Si prega di fornire i dettagli di accesso per il conto di trading su cui sono stati condotti i test qui.