Come fare in modo che gli oggetti disegnati da XY cambino in modo fluido (MT4 vs MT5) - pagina 2

 
Vitaliy Kuznetsov:

Grazie per questo tipo di soluzione al problema. In effetti, la velocità di rendering è aumentata. Sembra che dovrò imparare la biblioteca.

Vorrei anche chiarire la seguente sfumatura. Si compila con questa formulazione con un avvertimento:

E si compila con questo senza un avvertimento, ma la velocità è un po' più lenta.

Cosa è più corretto?).

Ah, sì, ho dimenticato di mettere int. La biblioteca è orientata verso le doppie coordinate.
La velocità non può diminuire. (int) è praticamente gratuito. Meno di un nanosecondo.
Si può impostare in questo modo:

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

Non influenzerà nemmeno la velocità (+ ~1 ns), ma posizionerà un po' più accuratamente.

La funzione Round incorporata in iCanvas restituisce int ed è molto più veloce della normale funzione round(), ma l'argomento doppio x deve essere entro 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:
Non sono sicuro di quale tipo Canvas.Y(price);

che tipo restituisce

Guarda dentro iCanvas e la domanda sparisce:

   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));
     };
 
Come un pesce nell'acqua :)
 
Vitaliy Kuznetsov:

Ma Kanvas è molto più bello da lavorare, puoi applicare la trasparenza, è più veloce e il codice prende meno spazio )):

#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:

Grazie per questo tipo di soluzione al problema. In effetti, la velocità di rendering è migliorata. Sembra che dovrò imparare la biblioteca.

Vorrei anche chiarire la seguente sfumatura. Si compila con questa formulazione con un avvertimento:

E si compila con questo senza un avvertimento, ma la velocità è un po' più lenta.

Cosa è più corretto?).

Prendete questo vostro codice fuori dal ciclo e chiamatelo una volta prima del ciclo su ogni evento di ridipintura:

 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);

È più complicato che imparare qualche biblioteca?

 
Aleksei Stepanenko:
Come un pesce nell'acqua :)

PNB2))

 
Dmitry Fedoseev:

Togliete questo codice dal ciclo e chiamatelo una volta prima di ogni evento di ridisegno:

È davvero più complicato che imparare qualche libreria?

Questo è quello che stavo dicendo.
Mi sto solo chiedendo - puoi farlo tu stesso, e non solo ripetere i miei consigli?
due di loro sono facili da produrre...
Codice, per favore.
Se non lo fai, lo scriverò io stesso domani quando mi sveglio. Ma allora chiamerò Fedoseev un idiota. ))

 
Nikolai Semko:

Questo è quello che ho detto.
Mi sto solo chiedendo - puoi farlo tu stesso, e non solo ripetere i miei consigli?
due di loro sono facili da produrre...
Codice, per favore.
Se non lo fai, lo scriverò io stesso domani quando mi sveglio. Ma allora chiamerò Fedoseev un idiota. ))

Incredibilmente impressionato dalle tue idee su di me))

 
Dmitry Fedoseev:

Sono incredibilmente impressionato dalle vostre percezioni di me))

Meno parole, più azione

 

Grazie per gli esempi! Molto chiaro e informativo, e non da ultimo veloce.

Tutti i grafici dell'esempio sul kanvas nelle liste di oggetti sembrano un unico oggetto.

È possibile ottenere diversi tooltip (suggerimenti) quando si passa il mouse su singoli elementi grafici?

O posso creare il mio oggetto canvas per ogni rettangolo? Non influenzerà la velocità?

Se hai tempo, aspetto una risposta e magari un esempio di codice.

Motivazione: