Erros, bugs, perguntas - página 2801

 
Roman:

Tente apenas imprimir(

E o printf parece funcionar também.
Na impressão, o primeiro parâmetro especifica o tipo de valor a ser impresso.


Trabalhos deimpressão! Obrigado! ))

Mas o printf nem sempre funciona


 

Quero mostrar um personagem na tela e movê-lo, fonte:

#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>


CCanvas canvas;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   canvas.CreateBitmapLabel(ChartID(), 0, "canvas", 0, 0, 900, 400);
   canvas.FontSet("Courier New", 32);
   canvas.Erase(0);
   canvas.Update();
   EventSetMillisecondTimer(250);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   static int x = 0;
   static const uint col_black = ColorToARGB(clrBlack);
   static const uint col_red = ColorToARGB(clrRed);
   canvas.TextOut(x, 100, "S", col_black);
   x+=10;
   canvas.TextOut(x, 100, "S", col_red);
   canvas.Update();
}
//+------------------------------------------------------------------+


porque é que eu substituo a imagem anterior com preto e os artefactos permanecem?


 
Igor Makanu:

Quero mostrar um personagem na tela e movê-lo, fonte:


porque é que eu substituo a imagem anterior com preto e ainda tenho artefactos?


É melhor encher de novo todo o kanvas de uma só vez. É melhor redesenhar todo o kanvas de uma só vez.

 
Andrey Barinov:

É melhor redesenhar a tela inteira de uma só vez. É tudo redesenhado depois, de qualquer forma.

Já pensei sobre isso, mas a questão é puramente técnica

acontece que o anti-aliasing das fontes funciona? e o objectivo é mover os sprites, em geral, quero entender porque funciona assim

 

Não sei onde escavar, alguém pode sugerir uma direcção de pesquisa. Estou a escrever um indicador, mas após o primeiro clique em "compilar", a parte de cálculo dá um disparate, compenso novamente, parece ser verdade.

2020.07.13 14:12:05.987 ZigZag_MP (USDJPY,M15)  Average wave size = -2147483648 points; less then average: 1/100 min=99999999.0 max=107.1 steps=-2147483648
2020.07.13 14:12:27.179 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65/100 min=106.422 max=107.848 steps=57

2020.07.13 14:18:38.001 ZigZag_MP (USDJPY,M15)  Average wave size = -2147483648 points; less then average: 1/100 min=99999999.0 max=107.1 steps=-2147483648
2020.07.13 14:18:46.751 ZigZag_MP (USDJPY,M15)  Average wave size = 273 points; less then average: 65/100 min=106.422 max=107.848 steps=57

Não faço nada de extraordinário - apenas calculo os últimos 100 joelhos Zig-Zag. Inverti o código mais do que uma vez, mas a coisa é, é o mesmo, mas o resultado é diferente.

Antecipação de uma das versões possíveis: os amortecedores indicadores são inicializados à força, não há lixo neles.

 
Igor Zakharov:

antecipando uma das versões possíveis: os amortecedores indicadores são inicializados à força, não há lixo neles.

a questão é onde se inicializa

se pré_calculado == 0, então tudo está OK, se estiver em OnInt(), então irá falhar ao mudar de TF e durante a compilação

 
Igor Makanu:

a questão é onde se inicializa

se por prev_calculado == 0 , então tudo está bem, se em OnInt() , então irá falhar ao mudar de TF e ao compilar

experimentou todas as variantes (tanto onInt como oncalculated); o actual: no laço cada valor é atribuído individualmente. verifiquei através da janela de dados - sem valores estranhos/muitos.

 
Igor Makanu:

Quero mostrar um personagem na tela e movê-lo, fonte:


Porque é que estou a mascarar a imagem anterior em preto e os artefactos permanecem?


É por causa do anti-aliasing. A forma mais segura é desenhar um rectângulo na cor de fundo, no topo do símbolo. E depois emitir o símbolo com as novas coordenadas. É assim que normalmente se faz em casos como este.

 
Igor Makanu:
Mihail Matkovskij:

Isto é devido ao anti-aliasing. A forma mais segura é desenhar um rectângulo na cor de fundo, no topo do símbolo. E depois emitir o símbolo com as novas coordenadas. Isto é o que normalmente é feito em casos como este.

Não esquecer a simples movimentação de kanvas sem qualquer redesenho e pintura.
Esta é a forma mais rápida de se mover.

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

void OnStart() {
// Формируем какой-то фон
   for (int i = 0; i<1000; i++) Canvas.Circle(rand()%2048, rand()%2048,50+rand()%50,ARGB(255,rand()%256,rand()%256,rand()%256));
   Canvas.Update();
// -----------------------
   int x=100, y=100;
   iCanvas c(0,x,y,"symbol",50,50); // создаем дополнительный канвас размером 50х50
   c.TextPosition(0,0);
   c.CurentFont("Tahoma",50);
   c.Comm("S");
   c.Update();
   while(!IsStopped()&& x<W.Height) {
      c.MoveCanvas(++x,++y);        // перемещаем данный канвас
      c.Update();
      Sleep(50);
   }
}
 
Nikolai Semko:

Não se esqueça da capacidade de simplesmente mover o kanvas sem toda a reelaboração e pintura por cima.
Esta é a forma mais rápida de se mover.

Ninguém o nega. É que existe um conceito onde há um único ecrã como tela. Por sua vez, a mesma tela personalizada (matriz de pixels) é desenhada sobre uma tela de janela (gráfico). Mais precisamente, é primeiro passado para o gráfico (copiado) usando ResourceCreate (em OBJ_BITMAP ou OBJ_BITMAP_LABEL). Na janela do gráfico, tudo é desenhado utilizando Win API (se não estou enganado). Embora, também pode ser feito utilizando outros API. Mas a classe CCanvas tem os seus próprios métodos de desenho sobre elementos da matriz m_pixels.

Acontece que, desenhando um pequeno rectângulo, ainda tem de passar muitos pixels usandoResourceCreate (poupa tempo apenas no desenho). E desta forma pode simplesmente moverOBJ_BITMAP_LABEL em torno do gráfico, sem processar a matriz m_pixels e depois copiá-la para OBJ_BITMAP_LABEL.