Errores, fallos, preguntas - página 2801

 
Roman:

Pruebe simplemente con Print(

Y printf parece que también funciona.
En printf, el primer parámetro especifica el tipo de valor a imprimir.


La impresión funciona. Gracias. ))

Pero printf no siempre funciona


 

Quiero mostrar un personaje en el lienzo y moverlo, fuente:

#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();
}
//+------------------------------------------------------------------+


¿por qué sobreescribo la imagen renderizada anterior con negro y los artefactos permanecen?


 
Igor Makanu:

Quiero mostrar un personaje en el lienzo y moverlo, fuente:


¿por qué sobreescribo la imagen anterior con negro y sigo teniendo artefactos?


Es mejor rellenar todo el kanvas de una vez. Es mejor redibujar todo el kanvas de una vez.

 
Andrey Barinov:

Es mejor rellenar todo el canva de una vez. De todos modos, todo se redibuja después.

Ya lo he pensado, pero la cuestión es puramente técnica

resulta que el antialiasing de las fuentes funciona... y el objetivo es mover los sprites, en general, quiero entender por qué funciona así

 

No sé donde indagar, alguien puede sugerir una dirección para buscar. Estoy escribiendo un indicador, pero después del primer clic en "compilar", la parte de cálculo da tonterías, vuelvo a compilar, parece que es cierto.

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

No hago nada extraordinario, simplemente calculo las últimas 100 rodillas en Zig-Zag. He invertido el código más de una vez, pero el caso es que es el mismo, pero el resultado es diferente.

Anticipando una de las posibles versiones: los búferes de los indicadores se inicializan a la fuerza, no hay basura en ellos.

 
Igor Zakharov:

anticipando una de las posibles versiones: los búferes de los indicadores se inicializan a la fuerza, no hay basura en ellos.

la pregunta es dónde se inicializa

si prev_calculated == 0, entonces todo está bien, si está en OnInt(), entonces tendrá un fallo al cambiar de TF y durante la compilación

 
Igor Makanu:

la pregunta es dónde se inicializa

si por prev_calculated == 0 , entonces todo está bien, si en OnInt() , entonces tendrá un fallo al cambiar de TF y al compilar

he probado todas las variantes (tanto onInt como oncalculated); la actual: en el bucle cada valor se asigna individualmente. he comprobado a través de la ventana de datos - no hay valores extraños/de basura.

 
Igor Makanu:

Quiero mostrar un personaje en el lienzo y moverlo, fuente:


¿Por qué estoy machacando la imagen renderizada anterior en negro y los artefactos permanecen?


Es por el antialiasing. La forma más segura es dibujar un rectángulo en el color de fondo, encima del símbolo. Y a continuación, la salida del símbolo con las nuevas coordenadas. Así es como se suele hacer en casos como éste.

 
Igor Makanu:
Mihail Matkovskij:

Esto se debe al antialiasing. La forma más segura es dibujar un rectángulo en el color de fondo, encima del símbolo. Y a continuación, la salida del símbolo con las nuevas coordenadas. Esto es lo que se suele hacer en casos como éste.

No te olvides de los lienzos que se mueven sin necesidad de redibujar y pintar.
Esta es la forma más rápida de moverse.

#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:

No olvides la posibilidad de mover el lienzo sin necesidad de redibujar y pintar.
Esta es la forma más rápida de moverse.

Nadie lo niega. Es que hay un concepto donde hay una sola pantalla como lienzo. A su vez, el mismo lienzo personalizado (matriz de píxeles) se dibuja en un lienzo de ventana (gráfico). Más concretamente, primero se pasa al gráfico (se copia) utilizando ResourceCreate (en OBJ_BITMAP o OBJ_BITMAP_LABEL). En la ventana del gráfico, todo se dibuja utilizando la API de Win (si no me equivoco). Aunque también se puede hacer utilizando otra API. Pero la clase CCanvas tiene sus propios métodos para dibujar sobre los elementos del array m_pixels.

Resulta que al dibujar un rectángulo pequeño todavía hay que pasar un montón de píxeles usandoResourceCreate (ahorra tiempo sólo en el dibujo). Y de esta manera puedes simplemente moverOBJ_BITMAP_LABEL alrededor del gráfico, sin tener que procesar el array m_pixels y luego copiarlo en OBJ_BITMAP_LABEL.