XY로 그려진 물체를 매끄럽게 만드는 방법(MT4 vs MT5) - 페이지 2

 
Vitaliy Kuznetsov :

이렇게 문제를 해결해주셔서 감사합니다. 실제로 렌더링 속도가 빨라졌습니다. 도서관을 배워야 할 것 같습니다.

다음 뉘앙스를 명확히 하고 싶습니다. 이 공식은 경고와 함께 컴파일됩니다.

그리고 이것은 경고없이 속도가 약간 떨어집니다.

어떤게 더 좋아?)

그리고, 예, 나는 int를 넣는 것을 잊었습니다. 라이브러리는 이중 좌표에 대해 선명합니다.
속도는 떨어질 수 없습니다. (int) 거의 무료입니다. 나노초 미만입니다.
다음과 같이 넣을 수 있습니다.

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

속도도 영향을 받지 않지만(+ ~ 1ns) 위치 지정에서 조금 더 정확합니다.

iCanvas의 내장 Round 함수는 int를 반환하고 일반 round()보다 훨씬 빠르지만 이중 인수 x는 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 :
어떤 종류의 Canvas.Y(price);

어떤 유형을 반환합니까

iCanvas를 살펴보면 질문이 사라집니다.

   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));
     };
 
물 속의 물고기처럼 :)
 
Vitaliy Kuznetsov :

그래도 Canvas로 작업하는 것이 훨씬 더 즐겁습니다. 투명도를 적용할 수 있고 더 빠르고 코드가 적은 공간을 차지합니다.)):

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

이렇게 문제를 해결해주셔서 감사합니다. 실제로 렌더링 속도가 빨라졌습니다. 도서관을 배워야 할 것 같습니다.

다음 뉘앙스를 명확히 하고 싶습니다. 이 공식은 경고와 함께 컴파일됩니다.

그리고 이것은 경고없이 속도가 약간 떨어집니다.

어떤게 더 좋아?)

루프 전에 각 다시 그리기 이벤트에서 한 번만 호출되도록 루프에서 이 코드를 가져옵니다.

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

라이브러리를 배우는 것보다 정말 어렵습니까?

 
Aleksei Stepanenko :
물 속의 물고기처럼 :)

PNB2))

 
Dmitry Fedoseev :

루프 전에 각 다시 그리기 이벤트에서 한 번만 호출되도록 루프에서 이 코드를 가져옵니다.

라이브러리를 배우는 것보다 정말 어렵습니까?

글쎄, 나는 그것에 대해 이야기 했다.
나는 단지 궁금합니다 - 당신이 그것을 스스로 할 수 있습니까? 그리고 나에게 조언을 반복하지 않습니까?
2개는 쉽게 나온다...
스튜디오의 코드는 더 짧습니다.
떨어뜨리지 않으면 내일 일어나면 제가 직접 쓰겠습니다. 그러나 나는 Fedoseev를 빈 사람이라고 부를 것입니다. ))

 
Nikolai Semko :

글쎄, 나는 그것에 대해 이야기 했다.
나는 단지 궁금합니다 - 당신이 그것을 스스로 할 수 있습니까? 그리고 나에게 조언을 반복하지 않습니까?
2개는 쉽게 나온다...
스튜디오의 코드는 더 짧습니다.
떨어뜨리지 않으면 내일 일어나면 제가 직접 쓰겠습니다. 그러나 나는 Fedoseev를 빈 사람이라고 부를 것입니다. ))

나에 대한 당신의 생각에 놀라울 정도로 감명을 받았습니다))

 
Dmitry Fedoseev :

나에 대한 당신의 생각에 놀라울 정도로 감명을 받았습니다))

적게 말하고 더 많이 일하라

 

예를 들어 주셔서 감사합니다! 매우 시각적이고 유익하며 중요하지 않습니다. 빠릅니다.

개체 목록에 있는 캔버스 예제의 모든 그래픽은 하나의 개체처럼 보입니다.

개별 그래픽 요소 위로 마우스를 가져갈 때 다른 도구 설명(도구 설명)을 얻을 수 있습니까?

또는 각 개별 사각형이 자체 캔버스 개체를 담을 수 있도록 하시겠습니까? 그러면 속도에 영향을 주나요?

시간이 있다면 답변과 코드 예제를 기다리고 있습니다.