Lona vs Rótulos - página 6

 

E por que eu gostaria de testar a plotagem gráfica em um testador de estratégia (especialmente em uma versão especializada de pendências visuais), quando é melhor testá-la diretamente em um gráfico de trabalho?

E parabéns para aqueles que não pensam em desativar a trama gráfica em seus robôs no testador não-visual.

 

Nikolay está certo - as propriedades de edição de etiquetas não tem nada a ver com a renderização de etiquetas.

A etiqueta, como qualquer outro objeto no gráfico, é desenhada em uma linha completamente diferente e independentemente do trabalho do programa MQL5. O robô só pode pedir que o gráfico seja renderizado novamente com força, mas não pode medir o tempo de renderização. O desenho da carta com objetos é completamente assíncrono.

Mas a renderização da tela é fácil de medir, pois é feita diretamente no fluxo do robô e depois, durante a renderização independente do gráfico, resta fazer um BitBlit nativo do bitmap pronto no contexto da janela. Esta operação é elementar e é bem acelerada pela placa de vídeo.

Nas etiquetas de texto SetFont/TextOut em fontes TTF é bastante caro.
 
Mihail Matkovskij:

Acontece que são 321 vezes, se quisermos acreditar nesta medida.

Esta figura mostra que esta medida não pode ser confiável.
Isto é óbvio para um programador experiente.
Você realmente acha que existe alguma outra maneira de exibir caracteres em uma tela gráfica, exceto por sua formação pixel a pixel? Os dias do ECock já se foram há muito tempo.
 
Renat Fatkhullin:

Por que eu gostaria de testar a trama gráfica no testador de estratégia (especialmente em uma versão especializada de pendências visuais), quando é melhor testá-la diretamente no gráfico de trabalho?

Ao mesmo tempo, parabéns para aqueles que não pensaram em desativar a trama gráfica em seus robôs no testador não-visual.

Eu poderia ter verificado na tabela também. No entanto, pensei que seria mais fácil de fazer no Testador de Estratégia. Além disso, eu tinha uma situação, que descrevi acima, quando a exibição foi baseada no CCanvas e desacelerou seriamente o Expert Advisor no testador. Principalmente, estava aparecendo em carrapatos. Para demonstrar isso no gráfico, a saída de texto teria de ser feita em loop. Isto é, para fazer uma maior taxa de atualização, como é feito no meu Expert Advisor com a otimização offline em que estou trabalhando agora. E decidi fazer um display baseado em etiquetas para ele, pois a Tela teria desacelerado o processo. Porque, como você observou, a etiqueta é renderizada em um fio diferente, portanto, não vai retardar a otimização autônoma da EA, que eu tenho correndo em loop.

Acontece que, como você disse, leva mais tempo para desenhar texto em etiquetas do que para desenhar OBJ_BITMAP_LABEL. Portanto, para torná-la mais rápida, ela também precisa ser feita em uma linha separada. Mas como? Se isto não puder ser feito, então do ponto de vista deuma aplicaçãoque usaOBJ_LABEL, é mais rápido que OBJ_BITMAP_LABEL...

 
Nikolai Semko:
Isto é óbvio para um programador experiente.

É óbvio para um programador experiente que estudou em detalhes ou conhece bem o terminal! E como não sou um desenvolvedor do terminal, mas apenas escrevo aplicações para ele, posso não saber, como a maioria dos programadores, o que não está na documentação do MQL.

 
Mihail Matkovskij:

Isto é óbvio para um programador experiente que estudou em detalhes ou conhece a fundo o funcionamento do terminal! E como não sou um desenvolvedor do terminal, mas apenas escrevo aplicações para ele, posso não saber, como a maioria dos programadores, o que não está na documentação do MQL.

E ainda assim você está tentando discutir não apenas com um desenvolvedor, mas com o diretor da MQ.

 
Alexey Viktorov:

E ainda assim você está tentando discutir não apenas com um desenvolvedor, mas com o diretor da MQ.

Não estou tentando argumentar, mas para descobrir se OBJ_BITMAP_LABEL pode ser feito menos caro do que OBJ_LABEL do ponto de vista do uso da aplicação!

 
Mihail Matkovskij:

E decidi fazer um display baseado em rótulos para ele, pois Kanvas teria desacelerado as coisas.

Tenho quase certeza por que sua tela estava diminuindo a velocidade.
Porque você estava tentando amontoar vários quadros em um quadro de 30 milissegundos.
A questão é que os quadros não redesenham (ChartRedraw) com mais freqüência do que cerca de 30 quadros por segundo de qualquer maneira.

Como eu disse aqui, a diferença entre texto kanvas e etiqueta é que o preenchimento da matriz de pixels no caso das etiquetas é assíncrono e não controlado por você, portanto o preenchimento da matriz de pixels no caso das etiquetas não acontece mais de uma vez a cada cerca de 30 milissegundos.
Mas pode acontecer com a tela porque não é assíncrona (preenchimento de bitmap). Você pode preencher o bitmap dez vezes em 30 milissegundos, mas ele será exibido apenas uma vez, e 9 vezes estará ocioso.
Portanto, como discutido emTela é legal! O programador precisa controlar a hora de início do BitMap.
Um modelo de comportamento poderia ser:

  • há uma função que forma o bitmap
  • a entrada desta função armazena a hora de início em uma variável estática em milissegundos.
  • Da próxima vez que você entrar nesta função, você deve verificar se passaram menos de 30 milissegundos desde a última geração do bitmap. Se sim, então saia e retorne falso, se não - comece a preencher e produza um novo Bitmap.
É mais conveniente, é claro, introduzir a variável bool na classe, o que permite ou não a formação da tela.
 
Nikolai Semko:

Tenho quase certeza porque seu kanvas estava desacelerando.
Porque você estava tentando amontoar vários quadros em um quadro de 30 milissegundos.
A questão é que os quadros não redesenham (ChartRedraw) com mais freqüência do que cerca de 30 quadros por segundo de qualquer forma.

Como eu disse aqui, a diferença entre texto kanvas e etiqueta é que o preenchimento da matriz de pixels no caso das etiquetas é assíncrono e não controlado por você, portanto o preenchimento da matriz de pixels no caso das etiquetas não acontece mais de uma vez a cada cerca de 30 milissegundos.
Mas pode acontecer com a tela porque não é assíncrona (preenchimento de bitmap). Você pode preencher o bitmap dez vezes em 30 milissegundos, mas ele será exibido apenas uma vez, e 9 vezes estará ocioso.
Portanto, como discutido emTela é legal! O programador precisa controlar o tempo de enchimento do BitMap.
Um comportamento modelo poderia ser o seguinte:

  • há uma função que forma o bitmap
  • a entrada desta função armazena o tempo de início da geração da imagem em uma variável estática em milissegundos.
  • Da próxima vez que você entrar nesta função, você deve verificar se passaram menos de 30 milissegundos desde a última geração do bitmap. Se sim, então saia e retorne falso, se não - prossiga para preencher e emitir um novo Bitmap.
Seria melhor, talvez, introduzir uma variável em uma classe que permita a criação de uma tela.

Há alguma informação disponível em algum lugar onde você possa ler mais sobre isso? Embora tudo esteja claro para mim, mas ainda assim, o tema é bastante interessante! Agora resta fazer a variante de controle de atualização do bitmap e testá-lo. Ficarei surpreso se o bitmap se revelar mais rápido do que as etiquetas.

 

Aqui está um exemplo, que mostra do que estou falando. A base do roteiro é extraída da documentação aqui .
Começa com uma matriz aleatória que produz 100 vezes 100 linhas e gera 100 etiquetas.
Primeiro produz 100 quadros com Rótulo.
Depois disso, ele produzirá 100 quadros com cordas de lona.
A lona é a mesma.
Em um loop Sleep está documentado. Se o laço contiver Sleep(0), a situação será bem diferente. Você pode experimentar um pouco.
Todas as estruturas e linhas são numeradas para controle.
Gravei um vídeo e o desacelerei 30 vezes. Você pode ver, que apenas dois dos 100 quadros foram realmente renderizados para etiquetas, além disso, no segundo quadro você pode ver que as etiquetas são de quadros diferentes, ou seja, você pode ver a assíncronia funcionando.

Portanto, estes valores para o Rótulo são falsos:

Kanvas produz cerca de 60-70 quadros de um total de 100. Isto aconteceu porque o quadro é formado um pouco mais rápido do que 30 milissegundos e, portanto, nem todos os quadros têm tempo para ser produzidos, embora todos os quadros sejam formados.
Experiência com os dois principais parâmetros

e atraso do ciclo.


Se você aumentar o número de linhas a serem produzidas, você pode pegar o erro 4001. Isto é um bug no MQ quando há muitas saídas.

Arquivos anexados: