Como fazer os objetos desenhados por XY mudarem suavemente (MT4 vs MT5) - página 2

 
Vitaliy Kuznetsov:

Obrigado por este tipo de solução para o problema. De fato, a velocidade de renderização melhorou. Parece que vou ter que aprender a biblioteca.

Gostaria também de esclarecer a seguinte nuance. Ela se compila com esta formulação com um aviso:

E se compila com este sem um aviso, mas a velocidade é um pouco mais lenta.

O que é mais correto?)

Ah, sim, eu esqueci de colocar int. A biblioteca está voltada para coordenadas duplas.
A velocidade não pode cair. (int) é praticamente gratuito. Menos de nanossegundo.
Você pode definir isso:

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

Também não afetará a velocidade (+ ~1 ns), mas posicionará com um pouco mais de precisão.

A função Round integrada no iCanvas retorna int e é muito mais rápida que a função round() normal, mas o argumento duplo x deve estar dentro 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:
Não sei bem que tipo de Tela.Y(preço);

de que tipo retorna

Olhe dentro do iCanvas e a pergunta vai embora:

   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));
     };
 
Como um peixe na água :)
 
Vitaliy Kuznetsov:

Mas Kanvas é muito mais agradável de se trabalhar, você pode aplicar transparência, é mais rápido e o código ocupa menos espaço)):

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

Obrigado por este tipo de solução para o problema. De fato, a velocidade de renderização aumentou. Parece que vou ter que aprender a biblioteca.

Gostaria também de esclarecer a seguinte nuance. Ela se compila com esta formulação com um aviso:

E se compila com este sem um aviso, mas a velocidade é um pouco mais lenta.

O que é mais correto?)

Tire este seu código do laço e chame-o uma vez antes do laço em cada evento de repintura:

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

É mais complicado do que aprender alguma biblioteca?

 
Aleksei Stepanenko:
Como um peixe na água :)

PNB2))

 
Dmitry Fedoseev:

Tire este código do laço e ligue para ele uma vez antes de cada evento de redesenho:

É realmente mais complicado do que aprender alguma biblioteca?

Era isso que eu estava dizendo.
Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho?
dois deles são fáceis de produzir...
Código, em resumo.
Se você não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))

 
Nikolai Semko:

Isso foi o que eu disse.
Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho?
dois deles são fáceis de produzir...
Código, por favor.
Se não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))

Incrivelmente impressionado por suas idéias a meu respeito))

 
Dmitry Fedoseev:

Estou incrivelmente impressionado com suas percepções de mim))

Menos palavras, mais ação

 

Obrigado pelos exemplos! Muito claro e informativo, e não menos rápido.

Todos os gráficos do exemplo nas listas de objetos parecem ser um único objeto.

É possível obter diferentes pontas de ferramentas (pontas de ferramentas) quando se passa o mouse sobre itens gráficos individuais?

Ou posso criar um objeto de lona separado para cada retângulo? Isso não afetará a velocidade?

Se você tiver tempo, estou esperando por uma resposta, e talvez um exemplo de código.

Razão: