XYで描画したオブジェクトをスムーズに変化させる方法(MT4とMT5の比較) - ページ 3

 
Vitaliy Kuznetsov:

個々のグラフィックス要素に マウスを合わせたときに、ツールチップ(tooltip)を異なる形で表示することは可能でしょうか?

CHARTEVENT_MOUSE_MOVE を追跡して、マウスカーソルの座標を使用していました。これは、Canvas では、任意のテイストと色のデータセット全体で表現されています。

   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つは簡単に出力できる...
コードお願いします。
もしダメなら、明日起きたら自分で書きます。でも、その時はフェドセーエフをバカ呼ばわりしますよ。))

フェドセーエフがリークしたとか?
括弧の中に入れたくなかった。
似非プライドが高すぎるか、知性が低すぎるかのどちらかです。
やっぱりね。
新しいニックネームが決まりました。
 
Vitaliy Kuznetsov:


これは、私が最初に話した 、図書館なしで、フェドセーエフが譲歩しようとした遠回りな方法です(大差はありません)。
これは、あなたの状況をより良く解決するものです。

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

これは、私が最初に話した 、図書館なしで、フェドセーエフが譲歩しようとした遠回りな方法です(大差はありません)。
この方がより正しい解決方法です。

が、ChartGet関数の非同期性の問題は、これでは解決しないことを理解する必要があります。
これらの機能は、99.76%ではなく、99.1%という低い消費率になりました。

もし、非同期でなければ、すべてがチャートと一緒に動き、少し遅れることはないでしょう。

 

さらに感動したのがここ。

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
それは驕りですね。でも、そのユーモアのジョークが何なのかすらわからないでしょう。恥ずかしいですね。
 
Nikolai Semko:
フェドセーエフが合併したのか何なのか?
ブラケットから出したくなかったんです。
似非プライドが高すぎるか、知性が低いかのどちらか。
やっぱりね。
新しいあだ名がついた。

フライを失くすぞ、ベイビー。

 
Vitaliy Kuznetsov:

例を挙げていただき、ありがとうございました非常に分かりやすく、有益で、しかも迅速。

オブジェクトリストのカンヴァス上の例のグラフィックは、すべて1つのオブジェクトのように見えます。

別々のグラフィック アイテムにマウスを合わせたときに、異なるツールチップ(tooltip)を表示させることは可能でしょうか?

それとも、矩形ごとに別のキャンバスオブジェクトを作成してもよいのでしょうか?速度に影響が出ないか?

もしお時間があれば、回答、もしかしたらコードサンプルもお待ちしています。

1つのオブジェクトに対して1つのキャンバスを使用するのではなく、1つのキャンバスを使用することができます。
さらに少し速くなり、コードもそれほど大きくはならないでしょう。少なくとも、モノより少ない。
Kanvasはとても速いです。オブジェクトも、数が多すぎなければ良い。ボトルネックは、オブジェクトが数百、千となったときに発生します。
ちなみに、JavaScriptでも同じです。また、キャンバスやオブジェクト(htmlやCVG)もあります。キャンバスは、スピードとグラフィック性能では常に勝っていますが、コントロールと管理の使いやすさでは負けています。
JSでは、私自身、canvasとベクターオブジェクト(html、css、svg)を積極的に混在させ、両方の利点を活かしています。
しかし、MQL5でキャンバスを使用する際の(オブジェクトと同様に)本当の最大の問題は、ChartGet関数の信じられないほどのダサさです。
しかし、これは価格チャートにバインドしようとしている場合です。
チャート全体を無効にして、自分でチャートを描けば、そのような問題は発生しません。

 
Dmitry Fedoseev:

この場所にさらに感動した。

それは驕りですね。でも、ユーモアのジョークが何なのかすらわからないでしょう。恥ずかしいですね。

地元の古参の方で、いつも何かと気の利いたことをおっしゃるので驚きます。
目的のない年月を苦痛に感じないように。
でも、なぜか毎回おならを絞り出すだけなんですよね :))
 
Ihor Herasko:

CHARTEVENT_MOUSE_MOVE をトラッキングして、マウスカーソルの座標を使用していましたが、Canvas ではすべてのテイストと色のデータセットで表現されています。

で、どのオブジェクトに対してヒントを表示するかを計算する。

ニコライ・セムコ

を使用すると、1つのCanvasではなく、オブジェクトごとに1つのCanvasを使用することができます。
さらに少し速くなり、コードもそれほど大きくならないでしょう。少なくとも、モノより少ない。
Kanvasはとても速いです。オブジェクトも、数が多すぎなければ良い。オブジェクトが数百、千になると速度低下が発生する。

ありがとうございます。両方のバリエーションをテストしてみます。

 
Vitaliy Kuznetsov:

ありがとうございます。両方の選択肢を確認してみる。

Vitalyさん、YouTubeのビデオエディターは何を使っていますか?
とてもクールですね。
Adobe Premiere Pro?