Fehler, Irrtümer, Fragen - Seite 2801

 
Roman:

Versuchen Sie einfach Print(

Und printf scheint auch zu funktionieren.
In printf gibt der erste Parameter den Typ des zu druckenden Wertes an.


Drucken funktioniert! Ich danke Ihnen! ))

Aber printf funktioniert nicht immer


 

Ich möchte ein Zeichen auf der Leinwand anzeigen und es verschieben, Quelle:

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


Warum überschreibe ich das vorherige gerenderte Bild mit Schwarz und es bleiben Artefakte?


 
Igor Makanu:

Ich möchte ein Zeichen auf der Leinwand anzeigen und es verschieben, Quelle:


Warum überschreibe ich das vorherige gerenderte Bild mit Schwarz und habe trotzdem Artefakte?


Es ist besser, die gesamte Leinwand auf einmal aufzufüllen. Es ist besser, die gesamte Leinwand auf einmal neu zu zeichnen.

 
Andrey Barinov:

Es ist besser, die gesamte Leinwand auf einmal neu zu zeichnen. Danach wird sowieso alles neu gezeichnet.

Ich habe bereits darüber nachgedacht, aber die Frage ist rein technischer Natur

es stellt sich heraus, dass die Antialiasing von Schriften funktioniert? und das Ziel ist es, die Sprites zu bewegen, im Allgemeinen, ich möchte verstehen, warum es so funktioniert

 

Ich weiß nicht, wo zu graben, kann jemand eine Richtung für die Suche vorschlagen. Ich schreibe einen Indikator, aber nach dem ersten Klick auf "kompilieren", die Berechnung Teil gibt Unsinn, ich kompilieren wieder, es scheint wahr zu sein.

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

Ich tue nichts Außergewöhnliches - ich berechne nur die letzten 100 Zig-Zag-Knie. Ich habe den Code mehr als einmal umgedreht, aber die Sache ist die, dass es die gleiche ist, aber das Ergebnis ist anders.

In Erwartung einer der möglichen Versionen: Indikatorpuffer werden zwangsinitialisiert, es gibt keinen Müll in ihnen.

 
Igor Zakharov:

eine der möglichen Versionen vorwegnehmend: Indikatorpuffer werden zwangsweise initialisiert, es befindet sich kein Müll darin.

die Frage ist, wo Sie die Initialisierung vornehmen

wenn prev_calculated == 0, dann ist alles in Ordnung, wenn es in OnInt() ist, dann wird es beim Umschalten TF und während der Kompilierung glitch

 
Igor Makanu:

Die Frage ist, wo Sie die

wenn bei prev_calculated == 0, dann ist alles in Ordnung, wenn in OnInt(), dann wird es glitch beim Umschalten TF und beim Kompilieren

habe alle Varianten ausprobiert (sowohl onInt als auch oncalculated); die aktuelle: in der Schleife wird jeder Wert einzeln zugewiesen. ich habe durch das Datenfenster geprüft - keine seltsamen/abfallenden Werte.

 
Igor Makanu:

Ich möchte ein Zeichen auf der Leinwand anzeigen und es verschieben, Quelle:


Warum wird das zuvor gerenderte Bild schwarz dargestellt und es bleiben Artefakte?


Das liegt an der Anti-Aliasing-Funktion. Am sichersten ist es, wenn Sie ein Rechteck in der Hintergrundfarbe über dem Symbol zeichnen. Und geben Sie dann das Symbol mit den neuen Koordinaten aus. So wird es in solchen Fällen normalerweise gehandhabt.

 
Igor Makanu:
Mihail Matkovskij:

Der Grund dafür ist das Anti-Aliasing. Am sichersten ist es, wenn Sie ein Rechteck in der Hintergrundfarbe über dem Symbol zeichnen. Und geben Sie dann das Symbol mit den neuen Koordinaten aus. Das wird in der Regel in solchen Fällen getan.

Vergessen Sie nicht das einfache Verschieben von Leinwänden ohne erneutes Zeichnen und Malen.
Dies ist die schnellste Art der Beförderung.

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

Vergessen Sie nicht, dass Sie die Leinwand einfach verschieben können, ohne sie neu zu zeichnen und zu übermalen.
Dies ist die schnellste Art der Fortbewegung.

Das bestreitet niemand. Es ist nur so, dass es ein Konzept gibt, bei dem ein einziger Bildschirm als Leinwand dient. Im Gegenzug wird dieselbe benutzerdefinierte Leinwand (Array von Pixeln) auf einer Fensterleinwand (Diagramm) gezeichnet. Genauer gesagt, wird sie zunächst mit ResourceCreate (in OBJ_BITMAP oder OBJ_BITMAP_LABEL) an das Diagramm übergeben (kopiert). Im Diagrammfenster wird alles über die Win-API gezeichnet (wenn ich mich nicht irre). Es kann jedoch auch mit anderen APIs durchgeführt werden. Aber die CCanvas-Klasse hat ihre eigenen Methoden zum Zeichnen auf Elementen des m_pixels-Arrays.

Es stellt sich heraus, Zeichnung ein kleines Rechteck, dann müssen Sie noch eine Menge von Pixeln mitResourceCreate übergeben(spart Zeit nur auf Zeichnung). Auf diese Weise können SieOBJ_BITMAP_LABEL einfachauf dem Diagramm verschieben, ohne das m_pixels-Array zu verarbeiten und es dann in OBJ_BITMAP_LABEL zu kopieren.