Comment faire en sorte que les objets dessinés par XY changent en douceur (MT4 vs MT5) - page 2

 
Vitaliy Kuznetsov:

Merci pour ce type de solution au problème. En effet, la vitesse de rendu a augmenté. On dirait que je vais devoir apprendre la bibliothèque.

Je voudrais également clarifier la nuance suivante. Il compile avec cette formulation avec un avertissement :

Et il compile avec celui-ci sans avertissement, mais la vitesse est un peu plus lente.

Qu'est-ce qui est le plus correct ?)

Ah, oui, j'ai oublié de mettre int. La bibliothèque est orientée vers les doubles coordonnées.
La vitesse ne peut pas baisser. (int) est pratiquement gratuit. Moins d'une nanoseconde.
Vous pouvez le régler de cette façon :

y = Round(Canvas.Y(price));

Cela n'affectera pas non plus la vitesse (+ ~1 ns), mais le positionnement sera un peu plus précis.

La fonction Round intégrée à iCanvas renvoie un int et est beaucoup plus rapide que la fonction round() ordinaire, mais l'argument double x doit être compris dans l'int (-2 147 483 648 <= x <= 2 147 483 647).

int Ceil (double x) { return (x-(int)x>0)?(int)x+1:(int)x; }
int Round(double x) { return (x>0)?(int)(x+0.5):(int)(x-0.5);}
int Floor(double x) { return (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x; }
int Fabs(int x) {if (x<0) return -x; else return x;}
 
Vitaliy Kuznetsov:
Je ne suis pas tout à fait sûr du type Canvas.Y(price) ;

quel type il retourne

Regardez dans iCanvas et la question disparaît :

   double            X(double bar){return((double)W.Left_bar-bar)*W.dx_pix;}; //The X coordinate by the bar number. The bar number must be of type double, otherwise, the bar will be interpreted as time.
   double            X(datetime Time)                                         //The X coordinate by the time.
     { if(tester) return X((double)iBarShift(_Symbol,_Period,Time));
       else return X(wBarShift(Time,W.time,_Period));}
   double            Y(double Price) {if(W.dy_pix==0) W.dy_pix=1; return((W.Y_max-Price)/W.dy_pix); }; //The Y coordinate by the price.
   double            Price(int y)     {return (W.Y_max-y*(W.Y_max-W.Y_min)/W.Height);};                // Price by the Y coordinate
   double            Bar(double x) {return((double)W.Left_bar+1-x/(double)W.dx_pix);};                 // bar number by coordinate X                                                                      
   datetime          TimePos(double x)                                                                 // time by coordinate X 
     {
      double B=Bar(x);
      if (tester || W.BarsInWind == 0) iT[0]=iTime(_Symbol,_Period,(int)B);
      else {if(B<0 ) iT[0]=datetime(W.time[W.BarsInWind-1]-(long)B*PeriodSeconds());
      else if(B<W.Right_bar || B>W.Left_bar) iT[0]=iTime(_Symbol,_Period,(int)B);
      else iT[0]=W.time[W.BarsInWind-Floor(B)-1+(int)W.Right_bar];}
      return iT[0]+int((double)PeriodSeconds()*(1-B+(int)B));
     };
 
Comme un poisson dans l'eau :)
 
Vitaliy Kuznetsov:

Mais Kanvas est beaucoup plus agréable à utiliser, vous pouvez appliquer la transparence, c'est plus rapide et le code prend moins de place ;)) :

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#define  width 50                 
#define  height 10

#property indicator_buffers 0
#property indicator_plots   0

//+------------------------------------------------------------------+
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[]) {
   if (rates_total!=prev_calculated) DrawObj();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if(id == CHARTEVENT_CHART_CHANGE) DrawObj();
}
//+------------------------------------------------------------------+
void DrawObj() {

   double startPricePos = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   int step_Pips = 50;
   Canvas.Erase(0x00FFFFFF);
   int x1 = W.Width/2;
   Canvas.CurentFont("Arial",10);
   for(int i=-19; i<=20; i++) {
      double stp = step_Pips*i*_Point;
      int y1 = (int)Canvas.Y(startPricePos + stp);
      Canvas.FillRectangle(x1,y1,x1+width, y1+ height, 0xA0ECE9D8);
      Canvas.Rectangle(x1,y1,x1+width, y1+ height, 0xDD807870);
      _CommXY(x1+5, y1, string(startPricePos + stp));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+



 
Vitaliy Kuznetsov:

Merci pour ce type de solution au problème. En effet, la vitesse de rendu s'est améliorée. On dirait que je vais devoir apprendre la bibliothèque.

Je voudrais également clarifier la nuance suivante. Il compile avec cette formulation avec un avertissement :

Et il compile avec celui-ci sans avertissement, mais la vitesse est un peu plus lente.

Qu'est-ce qui est le plus correct ?)

Sortez votre code de la boucle et appelez-le une fois avant la boucle sur chaque événement de repeinture :

 x=(int)(ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,sub_window)/2);
   ChartXYToTimePrice(chart_ID,x,y,sub_window,time_pos_X_centr,price_pos_Y_tmp);         
         
   ChartTimePriceToXY(chart_ID,sub_window,time_pos_X_centr,price,x,y);

Est-ce plus compliqué que d'apprendre une bibliothèque ?

 
Aleksei Stepanenko:
Comme un poisson dans l'eau :)

PNB2))

 
Dmitry Fedoseev:

Sortez ce code de la boucle et appelez-le une fois avant chaque événement de redécoupage :

Est-ce vraiment plus compliqué que d'apprendre une bibliothèque ?

C'est ce que je disais.
Je me demande juste - pouvez-vous le faire vous-même, et ne pas simplement répéter mes conseils ?
deux d'entre eux sont faciles à sortir...
Code, s'il vous plaît.
Si vous ne le faites pas, je l'écrirai moi-même demain à mon réveil. Mais alors je traiterai Fedoseev d'idiot. ))

 
Nikolai Semko:

C'est ce que j'ai dit.
Je me demande juste - pouvez-vous le faire vous-même, et ne pas simplement répéter mes conseils ?
deux d'entre eux sont faciles à sortir...
Code, s'il vous plaît.
Si vous ne le faites pas, je l'écrirai moi-même demain à mon réveil. Mais alors je traiterai Fedoseev d'idiot. ))

Incroyablement impressionné par vos idées sur moi ;))

 
Dmitry Fedoseev:

Je suis incroyablement impressionné par la façon dont vous me percevez)).

Moins de mots, plus d'action

 

Merci pour les exemples ! Très clair et informatif, et surtout rapide.

Tous les graphiques de l'exemple sur le kanvas dans les listes d'objets ressemblent à un seul objet.

Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques distincts ?

Ou dois-je créer un objet de toile distinct pour chaque rectangle ? Cela ne va-t-il pas affecter la vitesse ?

Si vous avez le temps, j'attends une réponse, et peut-être un exemple de code.