Erros, bugs, perguntas - página 2777

 
Alain Verleyen:

Actualização :

O pico máximo agora aumentou seriamente:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Número = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Mín = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Máximo = 81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Avg = 149

Para o bem da pureza da experiência, este guião tem de ser executado em paralelo em vários gráficos e vários terminais. Depois comparar o tempo de pendências.

 
Stanislav Korotky :

Para o bem da experiência, execute este guião em paralelo em vários gráficos e vários terminais. Depois comparar o tempo de soluços.

Ok, mas se já aconteceu com 1 gráfico, não irá melhorar com múltiplos gráficos.

O que é que lhe daria mais para o fazer funcionar em múltiplas cartas/terminais?

 
Alain Verleyen:

OK, mas se já tiver acontecido com 1 gráfico, não melhorará com múltiplos gráficos.

O que é que lhe dará mais para o fazer funcionar em múltiplas cartas/terminais?

Se será o mesmo em terminais diferentes, então o problema reside no plano do sistema operativo.

 
Stanislav Korotky :

Se isto for o mesmo em terminais diferentes, então o problema reside no sistema operativo.

Já está. Vou tentar.
 
Stanislav Korotky :

Para o bem da experiência, execute este guião em paralelo em vários gráficos e vários terminais. Depois comparar os tempos de pausa.

Outro Terminal, mas 20 gráficos (símbolos diferentes), começou simultaneamente.

Verifiquei no AUDUSD onde entra o pico:

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Número = 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: 35151 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) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Min = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Quantidade = 240
2020.06.13 09: 16: 35152 342152 (CHFJPY, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Mín. = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Mín. = 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Max = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Avg = 607
2020.06.13 09: 16: 35: 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) Quantidade = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Max = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 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) Quantidade = 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) Avg = 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: 35.152 342152 (AUDCAD, H1) Máximo = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Máximo = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Avg = 611
2020.06.13 09: 16: 35152 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: 3513 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) Quantidade = 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) Quantidade = 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

E isto é quando os topos entram:

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) Quantidade = 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) Quantidade = 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: 35.151 342152 (EURUSD, H1) Quantidade = 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: 35.151 342152 (EURCHF, H1) Máximo = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Máximo = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) Quantidade = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Min = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) Quantidade = 480
2020.06.13 09: 17: 35: 35.151 342152 (AUDCHF, H1) Máximo = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Quantidade = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Quantidade = 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: 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) Avg = 664
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664.13 09: 17: 35.152 342152 (EURNZD, H1) Quantidade = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Mín = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Máximo = 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: 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: 35152 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: 35.152 342152 (CADCHF, H1) Máximo = 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) Quantidade = 480
2020.06.13 09: 17: 35152 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) Quantidade = 480
2020.06.13 09: 17: 3513 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) Quantidade = 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) Quantidade = 480
2020.06.13 09: 17: 35: 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: 35152 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) Avg = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Máximo = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Avg = 656

Portanto, tudo aconteceu ao mesmo tempo. Mas isto ainda pode ser um problema de MT5. Irei verificar com outros terminais simultâneos.

 
Stanislav Korotky:

Se será o mesmo em terminais diferentes, então o problema reside no plano do sistema operativo.

O problema não está no SO, mas no MT.
Verifiquei-o no MT5 (build 2009) - tudo voa, o tempo de execução é inferior a 5 ms
Enquanto no MT5 (build 2485) - tudo abranda, o tempo de execução muitas vezes ultrapassa os 200 ms (especialmente quando 50+ gráficos estão abertos)
Utilizei o código da descrição do problema:

Comparei a realização da função ChartGetInteger para duas versões do MT5 2009 e MT5 2485, talvez haja o problema:
1. Em 2485 para leitura dos campos "atómicos" de um objecto gráfico são utilizadas operações bastante lentas:
mfence; lock mov eax,[rax+2C];
Enquanto em 2009 a construção é feita usando: lock xadd [rcx+2C],eax

2. também parece que a lógica e o tempo de permanência possível na secção ntdll_RtlEnterCriticalSection mudaram significativamente.
Anteriormente, em 2009, uma secção crítica apenas verificava um par de valores recebidos, sem quaisquer operações atómicas.
E em 2485, os objectos da lista ligada do gráfico poderiam ser enumerados adicionalmente.


Presumivelmente, o problema poderia acontecer quando o acidente fosse corrigido quando se trabalhava com funções de gráficos como parte da migração para o novo compilador (cerca de 2-3 meses atrás).
O código de montagem para a chamada ChartGetInteger em MT5 (build 2485) está anexado.

 
Sergey Dzyublik :

O problema não está no SO, mas no MT.
Verifiquei-o no MT5 (build 2009) - tudo voa, o tempo de execução é inferior a 5 ms
Enquanto no MT5 (build 2485) - tudo abranda, o tempo de execução muitas vezes ultrapassa os 200 ms (especialmente quando 50+ gráficos estão abertos)
O código da descrição do problema foi utilizado: https://www.mql5.com/en/forum/342152

Comparei a realização da função ChartGetInteger para duas versões do MT5 2009 e MT5 2485, talvez haja o problema:
1. Em 2485 para leitura dos campos "atómicos" de um objecto gráfico são utilizadas operações bastante lentas:
mfence; lock mov eax,[rax+2C];
Enquanto em 2009 a construção é feita usando: lock xadd [rcx+2C],eax

2. também parece que a lógica e o tempo de permanência possível na secção ntdll_RtlEnterCriticalSection mudaram significativamente.
Anteriormente, em 2009, uma secção crítica apenas verificava um par de valores recebidos, sem quaisquer operações atómicas.
E em 2485, os objectos da lista ligada no gráfico poderiam adicionalmente ser numerados.


Presumivelmente, o problema poderia acontecer quando o acidente fosse corrigido quando se trabalhava com funções de gráficos como parte da migração para o novo compilador (cerca de 2-3 meses atrás).
O código de montagem para a chamada ChartGetInteger em MT5 (build 2485) está anexado.

As construções oficiais foram 2005 Build e depois 2085 Build, tem alguma? Só tenho 2007 Construir.
 
Sergey Dzyublik:

Tem alguma incompreensão dos termos assíncrono e síncrono.
Quando se diz que uma função é assíncrona, significa que será executada não no fio da execução actual, mas em algum outro fio.

Chamar uma função assíncrona como ChartSetInteger a partir do fio principal é rápido, uma vez que a execução propriamente dita ocorre num fio diferente.

Por outro lado, uma chamada de uma função síncrona ChartGetInteger exigirá a sincronização dos fios e isto pode exigir tempo adicional.
Os atrasos são especialmente notáveis quando o fio paralelo está constantemente a actualizar os dados da estrutura gráfica (por exemplo, quando o utilizador move a janela gráfica ou percorre o histórico).
Muito provavelmente, por simplicidade e fiabilidade, um único objecto de sincronização é utilizado para a sua estrutura de dados gráfica.
Pode tentar melhorar a velocidade de execução usando "segmentação de dados", mas por outro lado, agora pode deparar-se com bloqueios, ou dados subactualizados, ou abrandamentos noutros locais mais críticos.
Em geral, é melhor não tocar em algo que já está a funcionar de forma estável.

Ilyas:

Suponho que o pico está a renderizar comentários gráficos, caso contrário, quando a fila de gráficos está vazia, a chamada de função ChartGetXXX (nota, a chamada com sincronização) demora 0,13 milissegundos.

Estou mais habituado a falar em código.
Eu, por exemplo, esbocei um tal indicador:


ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0) é executado quando o rato se move;
o gráfico vermelho é a estatística do tempo de execução desta função.
Uma simples consulta para um dígito corre muitas vezes mais lentamente do que a função BildChart que limpa o ecrã inteiro, forma um gráfico de vários milhares de linhas, desenha uma escala, forma um bloco de informação de texto e mostra tudo no ecrã.

Toda a conversa académica sobre como deveria ser assim devido à sincronicidade - a sincronicidade é percebida como "preto é branco".
Com um conjunto completo de citações, não terei qualquer problema em criar o meu próprio gráfico independente baseado no kanvas e ter uma tabela completa de características desse gráfico, que pode ser acedido em nanossegundos. E com isso, a kanvas do gráfico será apresentada num fio diferente.

Arquivos anexados:
 
Fui burro durante muito tempo, não compreendendo o que o compilador não gosta nesta linha.
  else (Type != -1) // expression has no effect

Esqueci-me de escrever se. Pensei que seria uma boa ideia soletrar a mensagem para tais burros.

 
Nikolai Semko:

Uma simples consulta para um único dígito é muitas vezes mais lenta que a função BildChart, que limpa todo o ecrã, forma um gráfico de vários milhares de linhas, desenha uma escala, forma um bloco de informação de texto e produz tudo para o ecrã.

Tanto quanto sei, a chamada de ChartRedraw não provoca o redesenho imediato do gráfico. Só quando algum método Get é chamado é que ocorre o redesenho.
E o ChartRedraw é essencialmente o mesmo método assíncrono, pelo que a sua medição BuildChart não é fiável.