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

 
Vitaliy Kuznetsov :

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

CHARTEVENT_MOUSE_MOVE를 추적한 다음 마우스 커서의 좌표로 추적했으며 모든 취향과 색상에 대한 전체 데이터 세트로 캔버스에 표시됩니다.

   int                MouseX;       // coordinate X of the current position of the mouse pointer
   int                MouseY;       // coordinate Y of the current position of the mouse pointer
   double             MouseBar;     // the current bar position of the mouse pointer
   double             MousePrice;   // the current price of the mouse pointer
   datetime           MouseTime;   // the current time of the mouse pointer

, 힌트를 표시할 개체에 대해 계산:

 input uint                     i_uFontSize                = 14 ;                                     // Размер шрифта в подсказках


#define   TOOLTIP_BGCOLOR                                             color ( C'255,255,225' ) 

int g_nTooltipWidth = <ширина блока в пикселах>;
int g_nTooltipHeight = <высота блока в пикселах>;
int nY = <расчет положения левого верхнего угла для подсказки>;


         Canvas.FillRectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB (TOOLTIP_BGCOLOR));
         Canvas.Rectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB ( clrBlack ));
         Canvas.TextPosition(W.MouseX + 5 , nY + 2 );
         Canvas.CurentFont( "Arial" , i_uFontSize, i_uFontSize + 2 , clrBlack );
         Canvas.Comm( "<первая строка подсказки>" );
         Canvas.Comm( "<вторая строка подсказки>" );
         Canvas.Comm( "<третья строка подсказки>" );
 
Nikolai Semko :

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

Fedoseev 병합 또는 무엇?
브래킷을 꺼내고 싶지 않았습니다.
두 가지 중 하나: 너무 많은 사이비 교만 또는 너무 적은 지능.
알고 있었어.
새로운 드라이브를 얻었습니다.
 
Vitaliy Kuznetsov :


여기에 더 긴 방법이 있습니다(별로 많지는 않음). 처음에 내 라이브러리가 없고 Fedoseev가 반향을 시도한 내용에 대해 이야기 했습니다.
이것은 귀하의 상황에 더 정확한 솔루션입니다.

 #property indicator_chart_window
#define width 50
#define height 10
#define N 20

#property indicator_buffers 0
#property indicator_plots    0


string obj_name = "Asd_" ;
double max = 0 ;
double min = 0 ;
double w = 0 ;
double h = 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]) {
   if (prev_calculated != rates_total) {
      DrawObj();
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE ) {
       w = ( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
      h = ( int ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
      min = ChartGetDouble ( 0 , CHART_PRICE_MIN );
      max = ChartGetDouble ( 0 , CHART_PRICE_MAX );
      DrawObj();
   }
}
//+------------------------------------------------------------------+
//| Выводим на график                                                |
//+------------------------------------------------------------------+
void DrawObj() {
   string GenName = obj_name;
   double startPricePos = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   double step_Pips = 50 * _Point ;
   double stp = -N*step_Pips;
   for ( int i=-N; i<= 20 ; i++, stp+=step_Pips) 
      RectLabelCreate(GenName+ "UP_" + IntegerToString (i),startPricePos + stp);
   ChartRedraw ( 0 );
}
//+------------------------------------------------------------------+
//| Создает прямоугольную метку                                      |
//+------------------------------------------------------------------+
void RectLabelCreate( string name,   // имя метки
                     double price   // цена
                    ) {
   if (max==min) return ;
   const long              chart_ID= 0 ;               // ID графика
   int               sub_window= 0 ;                   // номер подокна
   int               x= int (w/ 2 );                     // координата по оси X
   int               y= int (h*(max-price)/(max-min)); // координата по оси Y

   const color             back_clr= C'236,233,216' ;   // цвет фона
   const ENUM_BORDER_TYPE border= BORDER_SUNKEN ;     // тип границы
   const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER ; // угол графика для привязки
   const color             clr= clrRed ;               // цвет плоской границы (Flat)
   const ENUM_LINE_STYLE   style= STYLE_SOLID ;         // стиль плоской границы
   const int               line_width= 1 ;             // толщина плоской границы
   const bool              back= false ;               // на заднем плане
   const bool              selection= false ;           // выделить для перемещений
   const bool              hidden= true ;               // скрыт в списке объектов
   const long              z_order= 0 ;                 // приоритет на нажатие мышью
   if ( ObjectCreate (chart_ID,name, OBJ_RECTANGLE_LABEL ,sub_window, 0 , 0 )) {
       ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
       ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
       ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width);
       ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height);
       ObjectSetInteger (chart_ID,name, OBJPROP_BGCOLOR ,back_clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_BORDER_TYPE ,border);
       ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
       ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,line_width);
       ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
   } else Print ( "Error - " + string ( _LastError ));
}

Как сделать плавность изменения объектов, нарисованных по XY (MT4 vs MT5)
Как сделать плавность изменения объектов, нарисованных по XY (MT4 vs MT5)
  • 2021.07.19
  • www.mql5.com
Помогите решить проблему на терминале МТ5. Решил перевести свой продукт из mql4 в mql5...
 
Nikolai Semko :

여기에 더 긴 방법이 있습니다(별로 많지는 않음). 처음에 내 라이브러리가 없고 Fedoseev가 반향을 시도한 내용에 대해 이야기 했습니다.
이것은 귀하의 상황에 더 정확한 솔루션입니다.

그러나 ChartGet 함수의 비동기 문제는 이것으로 해결되지 않는다는 것을 이해해야 합니다.
이제 이러한 기능의 작업은 더 이상 99.76%가 걸리지 않지만 조금 덜 걸립니다 - 99.1%

비동기식이 아니라면 모든 것이 일정에 따라 움직이고 조금 뒤처지지 않습니다.

 

이 장소에 더 깊은 인상을 받았습니다.

 double stp = -N*step_Pips;
   for ( int i=-N; i<= 20 ; i++, stp+=step_Pips )
얼마나 많은 자만을 위해. 그러나 당신은 이 유머의 농담이 무엇인지조차 이해하지 못할 것입니다. 불명예가 굉장합니다.
 
Nikolai Semko :
Fedoseev 병합 또는 무엇?
브래킷을 꺼내고 싶지 않았습니다.
두 가지 중 하나: 너무 많은 사이비 교만 또는 너무 적은 지능.
알고 있었어.
새로운 드라이브를 얻었습니다.

파리를 운전해, 자기야.

 
Vitaliy Kuznetsov :

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

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

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

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

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

하나 이상의 캔버스를 사용할 수 있지만 각 개체에 대해 하나씩 사용할 수 있습니다.
그것은 조금 더 빨라질 것이고 훨씬 더 많은 코드가 없을 것입니다. 어쨌든 개체보다 적습니다.
캔버스는 매우 빠릅니다. 개체가 너무 많지 않은 한 개체도 괜찮습니다. 수백 또는 수천 후에 물체에서 제동이 발생합니다.
그건 그렇고 - JavaScript와 동일한 상황입니다. 캔버스와 개체(html 및 CVG)도 있습니다. Canvas는 항상 속도와 그래픽 기능 면에서 이겼지만 제어 및 관리의 용이성은 졌습니다.
JS에서는 캔버스와 벡터 객체(html, css, svg)를 적극적으로 혼합하여 각각을 활용합니다.
그러나 (객체와 마찬가지로) MQL5에서 캔버스를 사용하는 것의 정말 큰 문제는 ChartGet 함수의 놀라운 어리석음입니다.
그러나 이것은 가격 차트에 묶이려는 경우입니다.
전체 그래프를 끄고 직접 그리면 그런 문제는 없습니다.

 
Dmitry Fedoseev :

이 장소에 더 깊은 인상을 받았습니다.

얼마나 많은 자만을 위해. 그러나 당신은 이 유머의 농담이 무엇인지조차 이해하지 못할 것입니다. 불명예가 굉장합니다.

나는 항상 지역의 오래된 방귀에 감동을 받고 항상 스스로 똑똑한 것을 짜내려고 노력합니다.
목적 없이 살아온 세월이 너무 고통스럽지 않도록.
하지만 왠지 모를 때마다 뭉쳐져 나오는 것뿐이에요 :))
 
Ihor Herasko :

CHARTEVENT_MOUSE_MOVE를 추적한 다음 마우스 커서의 좌표로 추적했으며 모든 취향과 색상에 대한 전체 데이터 세트로 캔버스에 표시됩니다.

, 힌트를 표시할 개체에 대해 계산:

니콜라이 셈코 :

하나 이상의 캔버스를 사용할 수 있지만 각 개체에 대해 하나씩 사용할 수 있습니다.
그것은 조금 더 빨라질 것이고 훨씬 더 많은 코드가 없을 것입니다. 어쨌든 개체보다 적습니다.
캔버스는 매우 빠릅니다. 개체가 너무 많지 않은 한 개체도 괜찮습니다. 수백 또는 수천 후에 물체에서 제동이 발생합니다.

고맙습니다. 두 가지 옵션을 모두 테스트하려고 합니다.

 
Vitaliy Kuznetsov :

고맙습니다. 두 가지 옵션을 모두 테스트하려고 합니다.

Vitaly, YouTube에서 어떤 동영상 편집기를 사용하시나요?
매우 영광입니다!
어도비 프리미어 프로?