Diskussion zum Artikel "Visualisierung! Eine grafische MQL5 Bibliothek ähnlich 'plot' der Sprache R"

 

Neuer Artikel Visualisierung! Eine grafische MQL5 Bibliothek ähnlich 'plot' der Sprache R :

Beim Studium der Handelslogik hat die visuelle Darstellung durch Grafiken eine großer Bedeutung. Eine Reihe von Programmiersprachen, die in der wissenschaftlichen Gemeinschaft weit verbreitet sind (wie R und Python), verfügen über eine spezielle "plot"-Funktion für die Visualisierung von Daten. Sie ermöglicht das Zeichnen von Linien, Gruppen von Punkten und Histogramme, um Muster darzustellen. In MQL5 können wir das Gleiche mit der Klasse CGraphics erreichen.

Es könnte der Fehler Division durch Null bei dieser Funktion entstehen. Es gibt zwei Wege dieses Problem abzufangen:

  • deaktivieren der Überprüfung einer Division durch Null im metaeditor.ini
    [Experts]
            FpNoZeroCheckOnDivision=1
    
  • oder eine Analyse der Gleichung, die von der Funktion verwendet werden soll, und die Rückgabe eines gültigen Wertes in diesem Fall. Ein Beispiel für den Umgang damit findet sich in den beigefügten Dateien 3Functions.mq5 und bat.mq5 Dateien.




Autor: MetaQuotes Software Corp.

 
Gute Arbeit geleistet! Danke! Ich war schon dabei, den CircleAA-Algorithmus zu korrigieren
Übrigens kann die CircleWu-Funktion vereinfacht und beschleunigt werden:

void CCanvas::CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX)
  {
   if(r<=0)
      return;
//--- vorläufige Berechnungen
   double r2=r*r;
   double quarter=round(r*M_SQRT1_2);
//--- den Linienstil festlegen
   uint prev_style=m_style;
   if(style!=UINT_MAX)
      LineStyleSet(style);
   uint mask=1<<m_style_idx;
//--- zeichnen
   for(int dx=0; dx<=quarter; dx++)
     {
      double dy=sqrt(r2-dx*dx);
      double alpha1=dy-floor(dy);
      double alpha2=1-alpha1;
      if((m_style&mask)==mask)
        {
         PixelTransform4(x,y,dx,(int)(dy)+1,clr,alpha1);
         PixelTransform4(x,y,dx,(int)(dy),clr,alpha2);
         PixelTransform4(x,y,(int)dy+1,dx,clr,alpha1);
         PixelTransform4(x,y,(int)dy,dx,clr,alpha2);
        }
      mask<<=1;
      if(mask==0x1000000)
         mask=1;
     }
  
//--- den vorherigen Zeilenstil einstellen
   if(style!=UINT_MAX)
      m_style=prev_style;
  }
 
Nikolai Semko:
Gute Arbeit geleistet! Danke! Ich war schon dabei, den CircleAA-Algorithmus zu korrigieren
Übrigens, die CircleWu-Funktion kann vereinfacht und beschleunigt werden:
Danke für die Idee, ich werde die Änderungen vornehmen!
 

Sie können die Eigenschaften des Diagramms selbst und jeder seiner Funktionen jederzeit ändern. Fügen Sie beispielsweise Beschriftungen zu den Achsen des Diagramms hinzu, ändern Sie den Namen der Kurve und aktivieren Sie den Spline-Approximationsmodus:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");                 
   curve.LinesIsSmooth(true);             
   graphic.XAxis().Name("X - axis");      
   graphic.XAxis().NameSize(12);          
   graphic.YAxis().Name("Y - axis");      
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
   graphic.CurvePlotAll();
   graphic.Update();
   DebugBreak();
  }

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

 
Orangetree:

Sie können die Eigenschaften des Diagramms selbst und jeder seiner Funktionen jederzeit ändern. Fügen Sie beispielsweise Beschriftungen zu den Achsen des Diagramms hinzu, ändern Sie den Namen der Kurve und aktivieren Sie den Spline-Approximationsmodus für sie:

  {
   curve.LinesIsSmooth(true);             

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

Die Methode wurde später umbenannt. Danke, im Artikel korrigiert
 

Wie kann ich erreichen, dass beim Neuzeichnen einer Kurve im Diagramm auch die Skala aktualisiert wird?

curve5.Update(resultPrices);
    
graphicfirst.Redraw(); и Update()


Die Kurve selbst wird aktualisiert, aber die Skala mit den alten Preisen bleibt bestehen und das Diagramm bewegt sich außerhalb der Grenzen der Leinwand

Ich habe es gefunden, ich muss CalculateMaxMinValues() ausführen :)

 
Maxim Dmitrievsky:
Können Sie mir sagen, wie ich ein bereits erstelltes Diagramm korrekt neu zeichnen kann, z. B. wenn ich Werte in Arrays ändere? Redraw() und Update() haben keine Wirkung.

Guten Tag, wie genau haben Sie versucht, das Diagramm neu zu zeichnen?

Wenn Sie nur die Daten für eine bestimmte Kurve ändern müssen, finden Sie hier ein funktionierendes Beispiel:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Daten 1
   double x1[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y1[]={-5,4,-10,23,17,18,-9,13,17,4};
//--- Daten 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- Grafik
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- Punkte
   CCurve *curve=graph.CurveAdd(x1,y1,CURVE_LINES);
   graph.CurvePlot(0);
   graph.Update();
   Sleep(1000);
   curve.Update(x2,y2);
   graph.Redraw(true);
   graph.Update();
   Sleep(1000);
  }
P.S. Es gibt einen Thread im Forum über die Grafikbibliothek, in dem dieses Problem bereits angesprochen wurde.
 
Roman Konopelko:

Guten Tag, wie genau haben Sie versucht, das Diagramm neu zu zeichnen?

Wenn Sie nur die Daten für eine bestimmte Kurve ändern wollen, finden Sie hier ein funktionierendes Beispiel:

P.S. Es gibt einen Thread im Forum über die Grafikbibliothek, in dem diese Frage bereits gestellt wurde.
Danke, ich habe es schon herausgefunden, ich habe genau das Gleiche gemacht, nur mit einem Array... Sie müssen nur graph.CalculateMaxMinValues() auch für das Diagramm neu berechnen, dann wird die Skala aktualisiert.
 
Maxim Dmitrievsky:
Danke, ich habe es schon herausgefunden, ich habe genau das Gleiche gemacht, nur auf einem Array. Sie müssen nur graph.CalculateMaxMinValues() für den Graphen neu berechnen, dann wird die Skala aktualisiert
Wenn Sie die Methode CGraphic::Redraw(const bool rescale=false) mit dem Parameter true aufrufen, werden die Skalen automatisch neu berechnet (Sie müssen CalculateMaxMinValues nicht separat aufrufen).
 
Roman Konopelko:
Wenn man die Methode CGraphic::Redraw(const bool rescale=false) mit dem Parameter true aufruft, werden die Skalen automatisch neu berechnet (kein separater Aufruf von CalculateMaxMinValues notwendig).

Richtig, ich hab's. Danke )
 

Ist es möglich, zwei oder mehr Skalen auf dem Diagramm zu erstellen - ähnlich wie bei einem Lineal, bei dem die Teilungen in Zentimetern und Zoll angegeben werden, wobei die Werte nur dann angegeben werden, wenn der Punkt zur Erstellung des Diagramms verwendet wurde?