Prüfung von CGraphic - Fragen und Anregungen - Seite 9

 
Dennis Kirichenko:

Anatoly, ich danke dir sehr! Das hat bei Punkt 1 geholfen. Ja, ich habe dieAchsenmethode CAxis::MaxGrace(const double value) übersehen.

Hier ein weiteres kurzes Beispiel:

   CAxis *x_axis=graph.XAxis();
   x_axis.AutoScale(true);
   x_axis.Min(0);
   x_axis.Max(m_max_data);
   x_axis.MinGrace(0.0);
   x_axis.MaxGrace(0.2);
   x_axis.DefaultStep(m_max_data/10);
 

Antrag #1827124.


 
Anatoli Kazharski:

Antrag #1827124.

Das Problem wurde wie folgt behoben:

Support-Team2018.01.15 14:30

Der Fehler trat bei der sicheren Berechnung des Restes der Division in der Methode CAxis::Mod auf.

Früher war dort eine numerische Methode implementiert, ohne die MathMod-Funktion zu verwenden, aber Ihr Beispiel hat gezeigt, dass die Genauigkeit dieser Methode in einigen Fällen nicht die beste ist.

Also musste ich diese Methode ändern:

//+------------------------------------------------------------------+
//| Calculate the modulus (remainder) in a safe manner so that divide|
//| by zero errors are avoided                                       |
//+------------------------------------------------------------------+
double CAxis::Mod(const double x,const double y)
  {
//--- check 
   if(y==0)
      return(0);
//--- calculate modulus
   return (x>0)? MathMod(x,y): MathMod(x,y)+y;
  }

//---

Das Ergebnis mit den gleichen Parametern:


 

Initialisierung im CGraphic-Experten.

Wenn Sie im Expert Advisor ein Diagramm erstellen, z.B:

int OnInit()
  {
     
   CGraphic graphic;
   string name ="Graphic";   
   bool ch =graphic.Create(0,name,0,220,20,970,370);

   double x[24]={0,1,2,3,4,5,6,7,8,9,10};
   double y[24]={0,1,2,3,4,5,6,7,8,9,10};
   
   for(int i=0;i<10;i++)
     {
     y[i] =y[i]+Shift;
     }
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_HISTOGRAM);
   curve.HistogramWidth(6);
   curve.Color(Green);
   curve.Name("Curve");
   
   graphic.CurvePlotAll();
   graphic.Update();
//   ChartRedraw();
   
  return(INIT_SUCCEEDED);       
  }

Wenn Sie einen externen Parameter ändern, verschwindet die Grafik in regelmäßigen Abständen. Nicht beim ersten Mal. Sie können den Parameter 3-5 Mal ändern und er geht zufällig verloren, und nicht für immer. Sie kann durch den Wechsel der Zeitrahmen oder den automatisierten Handel (aktiviert oder deaktiviert) gefunden werden.

Können wir es schaffen, dass es nicht verloren geht?

 
Photic:

Initialisierung im CGraphic-Experten.

Wenn Sie z. B. ein Diagramm in Expert Advisor erstellen:

dann verschwindet die Grafik periodisch, wenn der externe Parameter geändert wird. Nicht vom ersten Mal an. Es ist möglich, den Parameter 3-5 Mal zu ändern, und dann ist er zufällig irgendwo verloren, und nicht für immer. Sie kann durch Umschalten der Zeitrahmen oder des automatischen Handels (aktiviert - nicht aktiviert) gefunden werden.

Können Sie es so gestalten, dass es nicht verloren geht?

Sie erstellen und zerstören das Objekt auf der lokalen Ebene der OnInit-Funktion.

Schaffen Sie eines auf globaler Ebene.
 

Das Problem wurde durch eine Neuinstallation von MT gelöst.

Ich kann mich nicht daran gewöhnen, dass es keinen Fehler geben kann, wenn ein Fehler auftritt.

 

Können Sie mir sagen, wie ich die Breite der Legende ändern oder den ihr zugewiesenen Platz ganz entfernen kann?

 
Wie kann ich verhindern, dass einige Zeilen in die Legende geschrieben werden? Ich habe eine Linie, die aus Punkten auf der Y-Koordinate besteht, und ich muss diese Punkte in verschiedenen Farben darstellen, so dass es sich um eine andersfarbige Linie handelt, die dieselben Informationen anzeigt, obwohl sie aus verschiedenen Linien besteht, und ich muss nur zusammenfassende Informationen über diese Linie in die Legende aufnehmen, denn es gibt viele solcher verschiedenfarbigen Linien. Wie kann ich das tun?
 

Und noch eine Frage: Warum gebe ich eine Farbe "Rot" an, aber sie wird auf dem Diagramm als Blau angezeigt, während Grün korrekt angezeigt wird?

if(TypeInfo=="TP_FP")
{
   graphicP.HistoryNameSize(Point_K);//Устанавливает размер шрифта имени кривой
   graphicP.HistorySymbolSize(Point_K);//Получить/установить размер символов условных обозначений  

   CCurve *A=graphicP.CurveAdd(X,Y,Green,CURVE_POINTS,N_Model+"("+N+")");//Создает и добавляет кривую на график
   A.PointsFill(true);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
   A.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
}

if(TypeInfo=="FN")
{
   //graphicP.HistoryNameSize(1);//Устанавливает размер шрифта имени кривой
   //graphicP.HistorySymbolSize(1);//Получить/установить размер символов условных обозначений  

   CCurve *A=graphicP.CurveAdd(X,Y,Red,CURVE_POINTS,"");//Создает и добавляет кривую на график
   A.PointsFill(false);//Устанавливает флаг, указывающий, нужно ли выполнять заливку для точек, определяющих кривую при отрисовке точками. 
   A.PointsType(POINT_VERTICAL_DASH);//Устанавливает флаг, указывающий на тип точек, использующихся при отрисовке кривой точками.
}



 
Aleksey Vyazmikin:

Und noch eine Frage: Warum gebe ich eine Farbe "Rot" an, aber sie wird im Diagramm blau angezeigt, während Grün korrekt angezeigt wird?



Ich habe es herausgefunden, die Farbe muss wie folgt eingestellt werden

ColorToARGB(Red,256)