Discussion de l'article "Visualisez le ! Bibliothèque graphique MQL5 similaire à 'plot' du langage R"

 

Un nouvel article Visualisez le ! Bibliothèque graphique MQL5 similaire à 'plot' du langage R a été publié :

Lors de l'étude de la logique de trading, la représentation visuelle sous forme de graphiques est d’une grande importance. Un certain nombre de langages de programmation populaires dans la communauté scientifique (tels que R et Python) contiennent une fonction spéciale "plot" utilisée pour la visualisation. Elle permet de dessiner des lignes, des distributions de points et des histogrammes pour visualiser les modèles. En MQL5, vous pouvez faire de même en utilisant la classe CGraphics.

Un autre avantage de la bibliothèque est de travailler avec des pointeurs de fonction CurveFunction. En MQL5, les pointeurs de fonctions n'acceptent que les fonctions globales ou statiques. La syntaxe de la fonction doit correspondre entièrement à celle du pointeur. Dans notre cas, CurveFunction est configuré pour que les fonctions prenant un paramètre de type double reçoivent également le double.

Pour construire une courbe à l'aide d'un pointeur vers une fonction, nous devons aussi définir avec précision les valeurs initiale (début) et finale (fin) de l'argument, ainsi que son incrément (pas). Plus la valeur de l'incrément est faible, plus on dispose de points de fonction pour le construire. Pour créer une série de données, utilisez CurveAdd(). Pour tracer une fonction, appelez CurvePlot() ou CurvePlotAll().


Principaux avantages de la bibliothèque Graphics

Le langage MQL5 permet aux développeurs de créer non seulement des robots de trading et des indicateurs techniques, mais aussi d'effectuer des calculs mathématiques complexes à l'aide des bibliothèques ALGLIB, Fuzzy et Statistics. Les données obtenues sont ensuite facilement visualisées avec la bibliothèque Graphics fournie. La plupart des opérations sont automatisées, et la bibliothèque offre des fonctionnalités étendues :

  • 5 types d'affichage de graphiques
  • 10 types de marqueurs graphiques
  • mise à l'échelle automatique des graphiques sur les axes X et Y
  • sélection automatique de la couleur, même si un graphique comporte plusieurs constructions
  • lissage des lignes à l'aide de l'anti-crénelage standard ou de l’algorithme de Bresenham plus avancé
  • possibilité de définir les paramètres d'approximation des courbes
  • capacité de tracer un graphique en utilisant en une ligne de code basée sur les tableaux x[] et y[]
  • capacité à tracer des graphiques en utilisant des pointeurs de fonctions


Auteur : MetaQuotes

 
Bon travail ! Merci. J'avais déjà l'intention de corriger l'algorithme CircleAA
D'ailleurs, la fonction CircleWu peut être simplifiée et accélérée :

void CCanvas::CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX)
  {
   if(r<=0)
      return;
//--- calculs préliminaires
   double r2=r*r;
   double quarter=round(r*M_SQRT1_2);
//--- définir le style de la ligne
   uint prev_style=m_style;
   if(style!=UINT_MAX)
      LineStyleSet(style);
   uint mask=1<<m_style_idx;
//--- dessiner
   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;
     }
  
//--- définit le style de la ligne précédente
   if(style!=UINT_MAX)
      m_style=prev_style;
  }
 
Nikolai Semko:
Bon travail ! Merci. J'avais déjà l'intention de corriger l'algorithme CircleAA
D'ailleurs, la fonction CircleWu peut être simplifiée et accélérée :
Merci pour l'idée, des modifications seront apportées !
 

Vous pouvez modifier les propriétés du graphique lui-même et de chacune de ses fonctions à tout moment. Par exemple, ajoutons des légendes aux axes du graphique, changeons le nom de la courbe et activons le mode d'approximation spline pour celle-ci :

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
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:

Vous pouvez modifier les propriétés du graphique lui-même et de chacune de ses fonctions à tout moment. Par exemple, ajoutons des légendes aux axes du graphique, changeons le nom de la courbe et activons le mode d'approximation spline pour celle-ci :

  {
   curve.LinesIsSmooth(true);             

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

 

La méthode a été renommée par la suite. Merci, corrigé dans l'article
[Supprimé]  

Comment puis-je faire en sorte que lorsqu'une courbe est redessinée sur le graphique, l'échelle soit également mise à jour ?

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


La courbe elle-même est mise à jour, mais l'échelle avec les anciens prix reste et le graphique sort des limites du canevas.

J'ai trouvé, je dois faire CalculateMaxMinValues() :)

 
Maxim Dmitrievsky:
Pourriez-vous me dire comment redessiner correctement un graphique déjà créé, par exemple, lorsque l'on modifie des valeurs dans des tableaux ? Redraw() et Update() n'ont aucun effet.

Bonjour, comment avez-vous essayé de redessiner le graphique ?

Si vous avez juste besoin de changer les données d'une courbe particulière, voici un exemple qui fonctionne :

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- données 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};
//--- données 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- graphique
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- Points
   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. Il existe un fil de discussion sur le forum concernant la bibliothèque Graphics, où ce problème a déjà été soulevé.
[Supprimé]  
Roman Konopelko:

Bonjour, comment essayez-vous de redessiner le graphique ?

Si vous avez simplement besoin de changer les données d'une courbe particulière, voici un exemple qui fonctionne :

P.S. Il y a un fil de discussion sur le forum concernant la bibliothèque Graphics, dans lequel cette question a déjà été soulevée.
Merci, j'ai déjà compris, je faisais exactement la même chose, seulement sur un tableau... il suffit de recalculer graph.CalculateMaxMinValues() pour le graphique aussi, puis l'échelle est mise à jour.
 
Maxim Dmitrievsky:
Merci, j'ai déjà compris, j'ai fait exactement la même chose, seulement sur un tableau. Il suffit de recalculer graph.CalculateMaxMinValues() pour le graphique également, puis l'échelle est mise à jour.
Si vous appelez la méthode CGraphic::Redraw(const bool rescale=false) avec le paramètre true, les échelles seront recalculées automatiquement (pas besoin d'appeler CalculateMaxMinValues séparément).
[Supprimé]  
Roman Konopelko:
Si vous appelez la méthode CGraphic::Redraw(const bool rescale=false) avec le paramètre true, les échelles seront recalculées automatiquement (il n'est pas nécessaire d'appeler CalculateMaxMinValues séparément).

D'accord, j'ai compris. Merci)
 

Est-il possible de créer deux échelles ou plus sur le graphique - comme sur une règle, où les divisions sont indiquées en centimètres et en pouces, les valeurs n'étant données que si le point a été utilisé pour tracer le graphique ?