Errori, bug, domande - pagina 2777

 
Alain Verleyen:

Aggiornamento:

Picco massimo ora seriamente aumentato:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Numero = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Min = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Max = 81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Avg = 149

Per la purezza dell'esperimento, questo script deve essere eseguito in parallelo in diversi grafici e diversi terminali. Poi confronta il tempo di riaggancio.

 
Stanislav Korotky :

Per il bene dell'esperimento, eseguite questo script in parallelo su diversi grafici e diversi terminali. Poi confronta il tempo di singhiozzo.

Ok, ma se è già successo con 1 grafico, non migliorerà con più grafici.

Cosa ti darebbe di più farlo funzionare su più grafici/terminali?

 
Alain Verleyen:

Ok, ma se è già successo con 1 grafico, non migliorerà con più grafici.

Che cosa vi darà in più per eseguirlo su più grafici/terminali?

Se sarà lo stesso in diversi terminali, allora il problema sta nel piano del sistema operativo.

 
Stanislav Korotky :

Se questo è lo stesso in diversi terminali, allora il problema sta nel sistema operativo.

Capito. Farò un tentativo.
 
Stanislav Korotky :

Per il bene dell'esperimento, eseguite questo script in parallelo su diversi grafici e diversi terminali. Poi confronta i tempi di hovering.

Un altro terminale, ma 20 grafici (simboli diversi), è partito simultaneamente.

Ho controllato su AUDUSD dove arriva il picco:

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Numero = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Max = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Avg = 472
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Avg = 240
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Max = 2323
2020.06.06.13 09: 16: 35.152 342152 (CADCHF, H1) Avg = 606
2020.06.13 09: 16: 35.152 342152 (EURAUD, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Min = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Min = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Min. = 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Max = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Avg = 607
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Min = 74
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (USDCHF, H1) Avg = 240
2020.06.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Min = 122
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Max = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Media = 660
2020.06.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Min = 157
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Max = 2354
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Avg = 663
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Max = 2380
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Avg = 616
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Max = 2327
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Avg = 618
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Max = 2233
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Avg = 503
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1)13 09: 16: 35.152 342152 (CHFJPY, H1) Max = 2387
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Avg = 657
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Max = 2292
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Avg = 612
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Quantità = 240
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Media = 612
2020.06.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Min = 121
2020.06.13 09: 16: 35.152 342152 (EURCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Max = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Avg = 611
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Max = 2411
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 661
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 240
2020.06.13 09: 16: 35.13 09: 16: 35.153 342152 (GBPUSD, H1) Min = 113
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Max = 2362
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 667
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Quantità = 240
2020.06.06.13 09: 16: 35.153 342152 (USDCAD, H1) Min = 151
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Max = 2386
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Avg = 671
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Max = 2233
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Avg = 478
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Quantità = 240
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Min = 10
2020.06.06.13 09: 16: 35.153 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Max = 2384
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Avg = 658
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.153 342152 (USDCHF, H1) Max = 2369
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Avg = 614
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Max = 2344
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Avg = 658

Ed è qui che entrano in gioco le cime:

2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 480
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Max = 17421
2020.06.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 533
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Min = 35
2020.06.06.13 09: 17: 35.151 342152 (EURAUD, H1) Max = 17406
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Avg = 518
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Max = 17425
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Avg = 515
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Min = 18
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Max = 17366
2020.06.13 09: 17: 35.151 342152 (EURCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Min = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Quantità = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Quantità = 480
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Min = 112
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Max = 10485
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Max = 10435
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Avg = 661
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Min = 71
2020.06.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Min = 10
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Max = 10487
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Media = 664
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Media = 664.13 09: 17: 35.152 342152 (EURNZD, H1) Quantità = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Max = 17426
2020.06.06.13 09: 17: 35.152 342152 (EURNZD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Max = 17427
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Avg = 649
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 17433
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Avg = 647
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min = 480
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min. = 47
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Max = 17415
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Avg = 640
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Max = 17435
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Avg = 637
2020.06.13 09: 17: 35.152 342152 (AUDCHF, H1) Avg = 662
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Quantità = 480
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Min = 43
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Max = 17416
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Quantità = 480
2020.06.13 09: 17: 35.13 09: 17: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Max = 10468
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Avg = 660
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Quantità = 480
2020.06.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Max = 10474
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Quantità = 480
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Min = 61
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Max = 10491
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Max = 17414
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Avg = 646
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Min = 100
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 17421
2020.06.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Media = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Max = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Media = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Media = 656

Quindi è successo tutto nello stesso momento. Ma questo potrebbe essere ancora un problema di MT5. Controllerò con altri terminali simultanei.

 
Stanislav Korotky:

Se sarà lo stesso in diversi terminali, allora il problema sta nel piano del sistema operativo.

Il problema non è nel sistema operativo, ma in MT.
Ho controllato su MT5 (build 2009) - tutto vola, il tempo di esecuzione è meno di 5 ms
Mentre in MT5 (build 2485) - tutto rallenta, il tempo di esecuzione spesso supera i 200 ms (soprattutto quando 50+ grafici sono aperti)
Ho usato il codice dalla descrizione del problema:https://www.mql5.com/en/forum/342152

Ho confrontato la realizzazione della funzione ChartGetInteger per due versioni di MT5 2009 e MT5 2485, forse c'è il problema:
1. Nel 2485 per leggere i campi "atomici" di un oggetto grafico si usano operazioni piuttosto lente:
mfence; lock mov eax,[rax+2C];
Mentre nella build 2009 si fa usando: lock xadd [rcx+2C],eax

2. Sembra anche che la logica e il possibile tempo di permanenza in ntdll_RtlEnterCriticalSection siano significativamente cambiati.
In precedenza, nel 2009, una sezione critica controllava solo una coppia di valori ricevuti, senza alcuna operazione atomica.
E nel 2485, gli oggetti linked-list del grafico potrebbero anche essere enumerati.


Presumibilmente, il problema potrebbe accadere quando il crash è stato risolto quando si lavora con le funzioni del grafico come parte della migrazione al nuovo compilatore (circa 2-3 mesi fa).
Il codice assembler per la chiamata ChartGetInteger in MT5 (build 2485) è allegato.

 
Sergey Dzyublik :

Il problema non è nel sistema operativo, ma in MT.
Ho controllato su MT5 (build 2009) - tutto vola, il tempo di esecuzione è meno di 5 ms
Mentre in MT5 (build 2485) - tutto rallenta, il tempo di esecuzione spesso supera i 200 ms (specialmente quando 50+ grafici sono aperti)
Il codice dalla descrizione del problema è stato usato: https://www.mql5.com/en/forum/342152

Ho confrontato la realizzazione della funzione ChartGetInteger per due versioni di MT5 2009 e MT5 2485, forse c'è il problema:
1. Nel 2485 per leggere i campi "atomici" di un oggetto grafico si usano operazioni piuttosto lente:
mfence; lock mov eax,[rax+2C];
Mentre nella build 2009 si fa usando: lock xadd [rcx+2C],eax

2. Sembra anche che la logica e il possibile tempo di permanenza in ntdll_RtlEnterCriticalSection siano significativamente cambiati.
In precedenza, nel 2009, una sezione critica controllava solo una coppia di valori ricevuti, senza alcuna operazione atomica.
E nel 2485, gli oggetti linked-list del grafico potrebbero anche essere enumerati.


Presumibilmente, il problema potrebbe accadere quando il crash è stato risolto quando si lavora con le funzioni del grafico come parte della migrazione al nuovo compilatore (circa 2-3 mesi fa).
Il codice assembler per la chiamata ChartGetInteger in MT5 (build 2485) è allegato.

Le build ufficiali erano 2005 Build e poi 2085 Build, ne avete? Ho solo il 2007 Build.
 
Sergey Dzyublik:

Lei ha una certa incomprensione dei termini asincrono e sincrono.
Quando si dice che una funzione è asincrona, significa che sarà eseguita non nel thread di esecuzione corrente, ma in qualche altro thread.

Chiamare una funzione asincrona come ChartSetInteger dal thread principale è veloce perché l'esecuzione effettiva avviene in un thread diverso.

D'altra parte, una chiamata di una funzione sincrona ChartGetInteger richiederà la sincronizzazione dei thread e questo può richiedere tempo aggiuntivo.
Il ritardo è particolarmente evidente quando il thread parallelo aggiorna costantemente i dati della struttura del grafico (per esempio, quando l'utente sposta la finestra del grafico o scorre la cronologia).
Molto probabilmente, per semplicità e affidabilità, un oggetto di sincronizzazione è usato per la sua struttura di dati del grafico.
Si può cercare di migliorare la velocità di esecuzione usando la "segmentazione dei dati", ma d'altra parte ora si può incorrere in deadlock, o dati sotto-aggiornati, o rallentamenti in altre aree più critiche.
In generale, è meglio non toccare qualcosa che funziona già stabilmente.

Ilyas:

Presumo che il picco stia rendendo il commento del grafico, altrimenti, quando la coda del grafico è vuota, la chiamata alla funzione ChartGetXXX (nota, la chiamata con sincronizzazione) richiede 0,13 millisecondi.

Sono più abituato a parlare in codice.
Io, per esempio, ho abbozzato un simile indicatore:


ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0) viene eseguito quando il mouse si muove;
il grafico rosso è la statistica del tempo di esecuzione di questa funzione.
Una semplice query per una cifra è molto più lenta della funzione BildChart che cancella l'intero schermo, forma un grafico di diverse migliaia di linee, disegna una scala, forma un blocco di informazioni di testo e lo visualizza tutto sullo schermo.

Tutti i discorsi accademici su come dovrebbe essere così a causa della sincronicità-asincronicità sono percepiti come "il nero è bianco".
Avendo un array completo di quotazioni, non avrò problemi a creare il mio grafico indipendente basato sul kanvas e ad avere una tabella completa delle caratteristiche di quel grafico, a cui si può accedere in una questione di nanosecondi. E con questo il kanvas del grafico sarà reso in un thread diverso.

File:
 
Sono stato muto per molto tempo, non capendo cosa non piace al compilatore in questa linea.
  else (Type != -1) // expression has no effect

Ho dimenticato di scrivere se. Ho pensato che sarebbe stata una buona idea scrivere il messaggio per questi idioti.

 
Nikolai Semko:

Una semplice interrogazione per una singola cifra è molte volte più lenta della funzione BildChart, che cancella l'intero schermo, forma un grafico di diverse migliaia di linee, disegna una scala, forma un blocco di informazioni di testo e manda tutto sullo schermo.

Per quanto ne so, chiamare ChartRedraw non provoca un immediato ridisegno del grafico, ma solo quando viene chiamato un metodo Get.
E ChartRedraw è essenzialmente lo stesso metodo asincrono, quindi la vostra misura BuildChart non è affidabile.