Test de CGraphic - questions et suggestions - page 3

 

@Roman Konopelko

Deuxième problème, ou peut-être pouvez-vous me donner un indice.

J'essaie de créer une ligne avec des prix de clôture. Sur X en conséquence, je passe un tableau de temps. Mais le problème est que lors de la création d'une courbe, il ajoute les intervalles tout seul. C'est-à-dire qu'il uniformise le temps et ajoute un endroit où il n'y a pas de données.

Donc, je comprends que vous devez créer un type de courbe distinct - CURVE_TIMESERIES - il ne devrait pas trouver automatiquement une étape et ne pas ajouter d'écarts entre les points X.

C'est analogue à la façon dont vous avez créé une courbe sans passer par X - et alors toutes les valeurs sont égales, tout est purement lié à la taille du tableau X (m_xmax = m_size-1 ; m_xmin = 0.0 ; ).

 
o_O:

@Roman Konopelko

Deuxième problème, ou peut-être pouvez-vous me donner un indice.

J'essaie de créer une ligne avec des prix de clôture. Sur X en conséquence, je passe un tableau de temps. Mais le problème est que lors de la création d'une courbe, il ajoute des intervalles. C'est-à-dire qu'il uniformise le temps et ajoute un endroit où il n'y a pas de données.

Donc, je comprends que vous devez créer un type de courbe séparé - CURVE_TIMESERIES - il ne devrait pas trouver automatiquement une étape et ne pas ajouter d'écarts entre les points X.

C'est analogue à la façon dont vous avez créé une courbe sans passer par X - et alors toutes les valeurs sont égales, tout est purement lié à la taille du tableau X (m_xmax = m_size-1 ; m_xmin = 0.0 ; ).

Le pas sur les deux axes est calculé automatiquement par l'algorithme intégré. D'après ce que j'ai compris, vous voulez définir vous-même le maximum, le minimum et le pas. Pour ce faire, vous pouvez passer en mode manuel pour la mise à l'échelle des axes :

   CAxis *xAxis = graphic.XAxis();  // получаем ось X
   xAxis.AutoScale(false);          // отключаем автомасштабирование
   xAxis.Min(0);                    // указываем минимальное значение по X
   xAxis.Max(10);                   // указываем максимальное значение по X
   xAxis.DefaultStep(1);            // указываем шаг по X

Une autre chose à prendre en compte est le nombre maximum de valeurs autorisées sur l'axe MaxLabels, il doit être supérieur à (Max-Min)/DefaultStep, sinon le pas sera modifié.

 
Roman Konopelko:

Le pas pour les deux axes est calculé automatiquement par l'algorithme intégré. D'après ce que j'ai compris, vous voulez définir vous-même le maximum, le minimum et le pas. Pour ce faire, vous pouvez passer en mode manuel pour la mise à l'échelle des axes

Vous devez également tenir compte de l'axe maxLabels, il doit être supérieur à (Max-Min)/DefaultStep, sinon l'étape sera modifiée.


Oui, c'est quelque chose.

Mais comme je vous l'ai expliqué - votre échelle est uniforme.

Quelle que soit la façon dont vous le présentez - vous faites une échelle X, et vous visez la coordonnée en pixels.

Eh bien, vous ne pouvez pas faire ça avec une série chronologique.

Voyez ce que vous obtenez






#include <Graphics/Graphic.mqh>

//+------------------------------------------------------------------+
void OnStart()
{
        MqlRates rates[];
        CopyRates(Symbol(), Period(), 0, 100, rates);
        ArraySetAsSeries(rates, true);
        int size=ArraySize(rates);
        double arrY[], arrX[];
        ArrayResize(arrX, size); ArrayResize(arrY, size);
        for(int i=0; i<size; ++i) { arrX[i]=(double)rates[i].time; arrY[i]=rates[i].close; }
        
        CGraphic graphic;
        graphic.Create(0, "Rates", 0, 30, 30, 1600, 300);
        CCurve* curve=NULL;
        
        //curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close");
        
        curve=graphic.CurveAdd(arrX, arrY, CURVE_LINES, "Close");
        CAxis *xAxis = graphic.XAxis();  // получаем ось X
        xAxis.AutoScale(false);          // отключаем автомасштабирование
        xAxis.Min(arrX[size-1]);                    // указываем минимальное значение по X
        xAxis.Max(arrX[0]);                 // указываем максимальное значение по X
        xAxis.DefaultStep(10*(arrX[0]-arrX[size-1])/size);            // указываем шаг по X
        xAxis.MaxLabels((arrX[0]-arrX[size-1])/xAxis.DefaultStep()+1);                          // число значений по оси MaxLabels должно быть больше чем (Max-Min)/DefaultStep
        
        curve.Visible(true);
        graphic.Redraw();
        graphic.Update();
}
 

et voici ce qu'il fait si vous ne lui passez pas le temps en X

la construction est graphiquement correcte



#include <Graphics/Graphic.mqh>

//+------------------------------------------------------------------+
void OnStart()
{
        MqlRates rates[];
        CopyRates(Symbol(), Period(), 0, 100, rates);
        ArraySetAsSeries(rates, true);
        int size=ArraySize(rates);
        double arrY[];
        ArrayResize(arrY, size); ArraySetAsSeries(arrY, size);
        for(int i=0; i<size; ++i) arrY[i]=rates[i].close;
        
        CGraphic graphic;
        graphic.Create(0, "Rates", 0, 30, 30, 1600, 300);
        CCurve* curve=NULL;
        
        curve=graphic.CurveAdd(arrY, CURVE_LINES, "Close");
        curve.Visible(true);
        graphic.Redraw();
        graphic.Update();
}
 
o_O:


Oui, j'ai quelque chose.

Mais comme je vous l'ai expliqué - votre échelle est plate.

Peu importe comment vous le tournez - vous mettez à l'échelle par X, et visez la coordonnée en pixels.

Eh bien - vous ne pouvez pas faire cela lorsque vous tracez des séries chronologiques.

Voyez ce que vous obtenez

Il est fort probable que la possibilité de changer le format de sortie des axes sera implémentée, mais je ne peux pas dire exactement sous quelle forme.

En ce qui concerne "samedi et dimanche" dans votre exemple, qui forment une ligne droite. Pour vérifier votre exemple, je l'ai modifié et ajouté l'écriture des tableaux dans le fichier :

#include <Graphics/Graphic.mqh>
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   CopyRates(Symbol(),Period(),0,100,rates);
   ArraySetAsSeries(rates,true);
   int size=ArraySize(rates);
   double arrY[],arrX[];
   datetime arrTime[];
   ArrayResize(arrX,size);
   ArrayResize(arrY,size);
   ArrayResize(arrTime,size);
   int handle=FileOpen("result.txt",FILE_WRITE|FILE_TXT);
   for(int i=0; i<size;++i)
     {
      arrTime[i]=rates[i].time;
      arrX[i]=(double)rates[i].time;
      arrY[i]=rates[i].close;
      string str=TimeToString(arrTime[i])+"\t"+DoubleToString(arrY[i],3)+"\n";
      FileWriteString(handle,str);

     }
   FileClose(handle);
   CGraphic graphic;
   graphic.Create(0,"Rates",0,30,30,1080,380);
   CCurve *curve=graphic.CurveAdd(arrX,arrY,CURVE_LINES,"Close");
   double min = arrX[ArrayMinimum(arrX)];
   double max = arrX[ArrayMaximum(arrX)];
   double step=(max-min)/10;
   CAxis *xAxis = graphic.XAxis();           // получаем ось X
   xAxis.AutoScale(false);                   // отключаем автомасштабирование
   xAxis.Min(min);                           // указываем минимальное значение по X
   xAxis.Max(max);                           // указываем максимальное значение по X
   xAxis.DefaultStep(step);                  // указываем шаг по X
   curve.Visible(true);
   graphic.Redraw();
   graphic.Update();
  }

Et je l'ai tracé dans OpenOffice :

Ce graphique contient également une ligne droite, elle est donc intégrée dans les données (tableaux X et Y). Pour réaliser le graphique décrit dans le commentaire , vous devrez modifier manuellement vos données d'entrée (par exemple, supprimer les week-ends).

 
Roman Konopelko:

Il est probable que la possibilité de modifier le format de sortie des axes sera implémentée, mais je ne peux pas dire avec certitude sous quelle forme exactement.

Bonne nouvelle, merci.

Comme je l'ai déjà dit, vous n'avez pas besoin d'attendre la version officielle, mais postez des classes pour les tester ici.
 
o_O:

Bonne nouvelle, merci.

Comme je l'ai déjà dit, vous ne pouvez pas attendre le bureau de construction et mettre des classes pour les tests ici.
Jusqu'à présent, j'avais prévu d'implémenter la possibilité de définir le format de l'axe en trois formats :
enum ENUM_AXIS_TYPE
  {
   AXIS_TYPE_DOUBLE,
   AXIS_TYPE_DATETIME,
   AXIS_TYPE_CUSTOM,
  };
  1. AXIS_TYPE_DOUBLE - tel qu'utilisé actuellement, sera le paramètre par défaut.
  2. AXIS_TYPE_DATETIME - ce que vous avez demandé sera basé sur TimeToString.
  3. AXIS_TYPE_CUSTOM - permet une sortie arbitraire basée sur le pointeur vers DoubleToStringFunction.
    typedef string(*DoubleToStringFunction)(double);

En annexe, juste au cas où, j'ai mis tous les fichiers de la bibliothèque.

En ce qui concerne votre message à servicedesk, oui, en effet, il n'y a pas de dates de samedi et de dimanche dans le tableau X. Je n'ai donc pas dit correctement que vous deviez réparer les données.

Mais nous pouvons quand même résoudre votre problème, en utilisant simplement AXIS_TYPE_CUSTOM.

#include <Graphics/Graphic.mqh>
double arrX[];
double arrY[];
//---
string TimeFirmat(double x)
  {
   return(TimeToString((datetime)arrX[ArraySize(arrX)-(int)x-1]));
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   CopyRates(Symbol(),Period(),0,100,rates);
   ArraySetAsSeries(rates,true);
   int size=ArraySize(rates);
   ArrayResize(arrX,size);
   ArrayResize(arrY,size);
   for(int i=0; i<size;++i)
     {
      arrX[i]=(double)rates[i].time;
      arrY[i]=rates[i].close;
     }
   CGraphic graphic;
   graphic.Create(0,"Rates",0,30,30,780,380);
   CCurve *curve=graphic.CurveAdd(arrY,CURVE_LINES,"Close");
   CAxis *xAxis=graphic.XAxis();           // получаем ось X
   xAxis.AutoScale(false);
   xAxis.Type(AXIS_TYPE_CUSTOM);
   xAxis.ValuesFunctionFormat(TimeFirmat);
   xAxis.DefaultStep(20.0);
   curve.Visible(true);
   graphic.Redraw();
   graphic.Update();
  }
//+------------------------------------------------------------------+

Résultat :


Dossiers :
Graphic.mqh  86 kb
Curve.mqh  21 kb
Axis.mqh  12 kb
 
Roman Konopelko:

Mais vous pouvez toujours résoudre votre problème en utilisant simplement AXIS_TYPE_CUSTOM.

Super, ça colle !
 

J'ai jeté un coup d'oeil rapide au fichier Graphic.mqh.

Avez-vous décidé de laisser toutes les fonctions non virtuelles?

OK,

Peut-on au moins ***Les fonctions de tracé (HistogramPlot, LinesPlot, etc.) sont virtuelles ?

Car leurs capacités de "design" ne sont pas suffisantes pour la tâche (gradients lors du remplissage ou couleurs multiples dans le rendu).

 
o_O:

J'ai jeté un coup d'oeil rapide au fichier Graphic.mqh.

Avez-vous décidé de laisser toutes les fonctions non virtuelles?

OK,

Peut-on au moins ***Les fonctions de tracé (HistogramPlot, LinesPlot, etc.) sont virtuelles ?

Car leurs capacités de "design" ne sont pas suffisantes pour la tâche (gradients lors du remplissage ou couleurs multiples dans le rendu).

Même si vous les rendez virtuels , vous ne pourrez pas faire de surcharge normale sans un accès complet aux membres de la classe CGraphics, donc ils doivent tous (ou presque) être déclarés comme protégés. De plus, je ne le dirai pas avec certitude, mais il est fort probable que les deux aspects seront mis en œuvre.
Raison: