Wie man Objekte, die von XY gezeichnet werden, reibungslos ändern kann (MT4 vs MT5) - Seite 2

 
Vitaliy Kuznetsov:

Ich danke Ihnen für diese Art der Problemlösung. Die Rendering-Geschwindigkeit hat sich in der Tat verbessert. Sieht so aus, als müsste ich die Bibliothek lernen.

Ich möchte auch die folgende Nuance klarstellen. Es kompiliert mit dieser Formulierung mit einer Warnung:

Und es kompiliert mit diesem ohne eine Warnung, aber die Geschwindigkeit ist ein bisschen langsamer.

Was ist richtiger?)

Ah, ja, ich habe vergessen, int anzugeben. Die Bibliothek ist auf Doppelkoordinaten ausgerichtet.
Die Geschwindigkeit kann nicht sinken. (int) ist praktisch kostenlos. Weniger als eine Nanosekunde.
Sie können es so einstellen:

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

Auch dies hat keinen Einfluss auf die Geschwindigkeit (+ ~1 ns), aber die Position wird etwas genauer.

Die in iCanvas integrierte Funktion Round gibt int zurück und ist viel schneller als die normale Funktion round(), aber das Double-Argument x muss innerhalb von int liegen (-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:
Ich bin mir nicht ganz sicher, welcher Typ Canvas.Y(Preis);

welchen Typ er zurückgibt

Ein Blick in iCanvas und die Frage ist vom Tisch:

   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));
     };
 
Wie ein Fisch im Wasser :)
 
Vitaliy Kuznetsov:

Aber Kanvas ist viel angenehmer zu arbeiten, man kann Transparenz anwenden, es ist schneller und der Code braucht weniger Platz)):

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

Ich danke Ihnen für diese Art der Problemlösung. Die Rendering-Geschwindigkeit hat sich in der Tat verbessert. Sieht so aus, als müsste ich die Bibliothek lernen.

Ich möchte auch die folgende Nuance klarstellen. Es kompiliert mit dieser Formulierung mit einer Warnung:

Und es kompiliert mit diesem ohne eine Warnung, aber die Geschwindigkeit ist ein bisschen langsamer.

Was ist richtiger?)

Nehmen Sie diesen Code aus der Schleife heraus und rufen Sie ihn einmal vor der Schleife bei jedem Repaint-Ereignis auf:

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

Ist es komplizierter, als eine Bibliothek zu lernen?

 
Aleksei Stepanenko:
Wie ein Fisch im Wasser :)

PNB2))

 
Dmitry Fedoseev:

Nehmen Sie diesen Code aus der Schleife heraus und rufen Sie ihn einmal vor jedem Redraw-Ereignis auf:

Ist es wirklich komplizierter, als eine Bibliothek zu lernen?

Das habe ich auch gesagt.
Ich frage mich nur - können Sie es selbst tun und nicht nur meinen Rat wiederholen?
zwei von ihnen sind leicht auszugeben...
Code, kurz gesagt.
Wenn nicht, schreibe ich ihn morgen nach dem Aufwachen selbst. Aber dann werde ich Fedoseev einen Idioten nennen. ))

 
Nikolai Semko:

Das habe ich auch gesagt.
Ich frage mich nur - können Sie es selbst tun, und nicht nur meinen Rat wiederholen?
zwei von ihnen sind leicht ausgegeben...
Code, bitte.
Wenn nicht, schreibe ich ihn morgen nach dem Aufwachen selbst. Aber dann werde ich Fedoseev einen Idioten nennen. ))

Unglaublich beeindruckt von deinen Ideen über mich))

 
Dmitry Fedoseev:

Ich bin unglaublich beeindruckt, wie du mich wahrnimmst))

Weniger Worte, mehr Taten

 

Vielen Dank für die Beispiele! Sehr übersichtlich und informativ, und nicht zuletzt schnell.

Alle Grafiken aus dem Beispiel auf der Leinwand in den Objektlisten sehen wie ein einziges Objekt aus.

Ist es möglich, verschiedene Tooltips zu erhalten, wenn man mit der Maus über einzelne Grafikelemente fährt?

Oder kann ich für jedes Rechteck ein eigenes Leinwandobjekt erstellen? Beeinträchtigt das nicht die Geschwindigkeit?

Wenn Sie Zeit haben, warte ich auf eine Antwort und vielleicht ein Codebeispiel.