Errori, bug, domande - pagina 2801

 
Roman:

Prova solo con Print(

E anche printf sembra funzionare.
In printf, il primo parametro specifica il tipo di valore da stampare.


Lastampa funziona! Grazie! ))

Ma printf non funziona sempre


 

Voglio visualizzare un personaggio sulla tela e spostarlo, 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();
}
//+------------------------------------------------------------------+


perché sovrascrivo l'immagine renderizzata precedente con il nero e gli artefatti rimangono?


 
Igor Makanu:

Voglio visualizzare un personaggio sulla tela e spostarlo, fonte:


perché sovrascrivo l'immagine renderizzata precedente con il nero e ho ancora artefatti?


È meglio riempire di nuovo tutto il kanvas in una volta sola. È meglio ridisegnare tutto il kanvas in una volta sola.

 
Andrey Barinov:

È meglio riempire di nuovo tutto il canva in una volta sola. In ogni caso è tutto ridisegnato dopo.

Ci ho già pensato, ma la domanda è puramente tecnica

si scopre che l'antialiasing dei caratteri funziona? e l'obiettivo è quello di spostare gli sprite, in generale, voglio capire perché funziona così

 

Non so dove scavare, qualcuno può suggerire una direzione per la ricerca. Sto scrivendo un indicatore, ma dopo il primo clic su "compile", la parte di calcolo dà un nonsenso, compilo di nuovo, sembra essere vero.

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

Non faccio niente di straordinario - calcolo solo le ultime 100 ginocchia Zig-Zag. Ho invertito il codice più di una volta, ma il fatto è che è lo stesso, ma il risultato è diverso.

Anticipando una delle possibili versioni: i buffer degli indicatori sono inizializzati forzatamente, non c'è spazzatura in essi.

 
Igor Zakharov:

anticipando una delle possibili versioni: i buffer degli indicatori sono inizializzati forzatamente, non c'è spazzatura in essi.

la domanda è dove inizializzi

se prev_calculated == 0, allora tutto è OK, se è in OnInt(), allora avrà un glitch quando si cambia TFs e quando si compila

 
Igor Makanu:

La domanda è dove inizializzi

se da prev_calculated == 0, allora tutto è ok, se in OnInt(), allora avrà un glitch quando si passa a TF e quando si compila

provato tutte le varianti (sia onInt che oncalculated); quella attuale: nel ciclo ogni valore è assegnato individualmente. ho controllato attraverso la finestra dei dati - nessun valore strano/molto.

 
Igor Makanu:

Voglio visualizzare un personaggio sulla tela e spostarlo, fonte:


Perché sto schiacciando l'immagine renderizzata precedente in nero e gli artefatti rimangono?


È a causa dell'anti-aliasing. Il modo più sicuro è quello di disegnare un rettangolo nel colore di sfondo, sopra il simbolo. E poi emettere il simbolo con le nuove coordinate. Questo è ciò che si fa di solito in casi come questo.

 
Igor Makanu:
Mihail Matkovskij:

Questo è dovuto all'anti-aliasing. Il modo più sicuro è quello di disegnare un rettangolo nel colore dello sfondo, sopra il simbolo. E poi emettere il simbolo con le nuove coordinate. Questo è ciò che si fa di solito in casi come questo.

Non dimenticate il semplice spostamento di kanvas senza ridisegnare e dipingere.
Questo è il modo più rapido di muoversi.

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

Non dimenticate la possibilità di spostare semplicemente il kanvas senza tutto il ridisegno e la sovraverniciatura.
Questo è il modo più veloce per muoversi.

Nessuno lo nega. È solo che c'è un concetto in cui c'è un unico schermo come tela. A sua volta, la stessa tela personalizzata (matrice di pixel) è disegnata su una tela della finestra (grafico). Più precisamente, viene prima passato al grafico (copiato) usando ResourceCreate (in OBJ_BITMAP o OBJ_BITMAP_LABEL). Nella finestra del grafico, tutto è disegnato usando Win API (se non mi sbaglio). Anche se può essere fatto usando anche altre API. Ma la classe CCanvas ha i propri metodi di disegno sugli elementi dell'array m_pixels.

Si scopre che, disegnando un piccolo rettangolo, si deve ancora passare un sacco di pixel usandoResourceCreate (si risparmia tempo solo sul disegno). E in questo modo potete semplicemente spostareOBJ_BITMAP_LABEL intorno al grafico, senza elaborare l'array m_pixels e poi copiarlo in OBJ_BITMAP_LABEL.