Как отловить событие наведения мыши на горизонтальную линию

 

Здравствуйте.

Не получается отловить событие наведения мыши на горизонтальную линию на графике.

Думал получить на какой высоте графика находится горизонтальная линия через вызов ObjectGetInteger(), а затем сделать событие наведения мыши в данную область графика.

Но ObjectGetInteger(0, LineName, OBJPROP_YDISTANCE) возвращает координаты линии (0,0)

string lineName = "Line name";
int lineX = ObjectGetInteger(0, lineName, OBJPROP_XDISTANCE);
int lineY = ObjectGetInteger(0, lineName, OBJPROP_YDISTANCE);
Print(LineName + ": (" + lineX + "," + lineY + ")"); // Выводит - Line name:(0,0)

Подскажите пожалуйста, как более правильно получить информацию о том, что наступило событие наведения мыши на горизонтальную линию на графике?

 
yar.forex:

Здравствуйте.

Не получается отловить событие наведения мыши на горизонтальную линию на графике.

Думал получить на какой высоте графика находится горизонтальная линия через вызов ObjectGetInteger(), а затем сделать событие наведения мыши в данную область графика.

Но ObjectGetInteger(0, LineName, OBJPROP_YDISTANCE) возвращает координаты линии (0,0)

Подскажите пожалуйста, как более правильно получить информацию о том, что наступило событие наведения мыши на горизонтальную линию на графике?

Получите цену на которой находится линия и её переведите в координату Y в пикселях.

 
yar.forex:

Здравствуйте.

Не получается отловить событие наведения мыши на горизонтальную линию на графике.

Думал получить на какой высоте графика находится горизонтальная линия через вызов ObjectGetInteger(), а затем сделать событие наведения мыши в данную область графика.

Но ObjectGetInteger(0, LineName, OBJPROP_YDISTANCE) возвращает координаты линии (0,0)

Подскажите пожалуйста, как более правильно получить информацию о том, что наступило событие наведения мыши на горизонтальную линию на графике?

string name = "hLine";   
int x = 0;
int y = 0;
   
if(ChartTimePriceToXY(0,0,Time[0],ObjectGet(name,OBJPROP_PRICE1),x,y))
 { 
 Comment(x,"  ",y);  
 }    
Ну а после этого (или прям все это) вызываем OnChartEvent, отлавливаем там мышку и работаем.
 
В МТ5 работа с объектами "не быстрая", поэтому лучше сначала собрать все объекты в  массив, отсортировать по цене.
И после этого отслеживать только мышку, сравнивая текущую цену в своем массиве объектов, без обращений к объектам на чарте.
 
Alexey Viktorov:

Получите цену на которой находится линия и её переведите в координату Y в пикселях.

Nikita Chernyshov:
Ну а после этого (или прям все это) вызываем OnChartEvent, отлавливаем там мышку и работаем.
Taras Slobodyanik:
В МТ5 работа с объектами "не быстрая", поэтому лучше сначала собрать все объекты в  массив, отсортировать по цене.
И после этого отслеживать только мышку, сравнивая текущую цену в своем массиве объектов, без обращений к объектам на чарте.

Супер, спасибо большое за ответы. Помогло.

А может еще подскажете, как правильнее отслеживать наведение мыши на трендовую линию?
Т.е. как проще выцепить область графика, где находится эта трендовая линия?

Благодарен за ответы

 
yar.forex:

Супер, спасибо большое за ответы. Помогло.

А может еще подскажете, как правильнее отслеживать наведение мыши на трендовую линию?
Т.е. как проще выцепить область графика, где находится эта трендовая линия?

Благодарен за ответы

Интересно, без опытов не получится, а тратить время на опыты нет желания. В принципе с чего я начал-бы: Получив цены и время трендовой, перевёл их в координаты XY и составил-бы уравнение прямой… Дальше только отслеживая координаты крыски, проверяем принадлежат-ли эти точки прямой. И вот это одна из причин нежелания экспериментировать, надо вспоминать чего никогда не знал… хотя какие-то задачи решал в институте. И даже помню, что есть уравнение по которому можно определить на каком расстоянии от прямой находится точка. То-есть можно задать диапазон от трендовой.

 
yar.forex:
А может еще подскажете, как правильнее отслеживать наведение мыши на трендовую линию?

Приблизительный алгоритм:

1. Сковырнуть цены трендовой и подсчитать ценовой диапазон;
2. Сковырнуть даты трендовой и подсчитать временной (в барах) диапазон;
3. Определить среднее ценовое изменение трендовой на бар;
4. Определить на каком баре сейчас находится мышка;
5. Подсчитать цену трендовой на том баре, на котором мышка;

6. Сравнить цену мышки и цену трендовой (если достаточно близко, то считаем, что наведена на трендовую)...

 
Yevhenii Levchenko:

Приблизительный алгоритм:

1. Сковырнуть цены трендовой и подсчитать ценовой диапазон;
2. Сковырнуть даты трендовой и подсчитать временной (в барах) диапазон;
3. Определить среднее ценовое изменение трендовой на бар;
4. Определить на каком баре сейчас находится мышка;
5. Подсчитать цену трендовой на том баре, на котором мышка;

6. Сравнить цену мышки и цену трендовой (если достаточно близко, то считаем, что наведена на трендовую)...

Работа с графическими элементами довольно затратна. Потому я и не рассматривал такой вариант. Хотя он имеет право быть.

 
Alexey Viktorov:

Работа с графическими элементами довольно затратна. Потому я и не рассматривал такой вариант. Хотя он имеет право быть.

Можно массив структур с базовыми свойствами объектов создать

 

вот пример из документации https://www.mql5.com/ru/docs/chart_operations/charttimepricetoxy

//+------------------------------------------------------------------+
//|                                           ChartXYToTimePrice.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---
   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[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- выведем параметры события на график
   Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);
//--- если это события клика мышки на графике
   if(id==CHARTEVENT_CLICK)
     {
      //--- подготовим переменные
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
      //--- преобразуем координаты X и Y  в терминах дата/время
      if(ChartXYToTimePrice(0,x,y,window,dt,price))
        {
         PrintFormat("Window=%d X=%d  Y=%d  =>  Time=%s  Price=%G",window,x,y,TimeToString(dt),price);
         //--- сделаем обратное преобразование: (X,Y) => (Time,Price)
         if(ChartTimePriceToXY(0,window,dt,price,x,y))
            PrintFormat("Time=%s  Price=%G  =>  X=%d  Y=%d",TimeToString(dt),price,x,y);
         else
            Print("ChartTimePriceToXY return error code: ",GetLastError());
         //--- удаляем линии
         ObjectDelete(0,"V Line");
         ObjectDelete(0,"H Line");
         //--- создаем горизонтальную и вертикальную линии перекрестия
         ObjectCreate(0,"H Line",OBJ_HLINE,window,dt,price);
         ObjectCreate(0,"V Line",OBJ_VLINE,window,dt,price);
         ChartRedraw(0);
        }
      else
         Print("ChartXYToTimePrice return error code: ",GetLastError());
      Print("+--------------------------------------------------------------+");
     }
  }
//+------------------------------------------------------------------+

XAUUSDM10

Документация по MQL5: Операции с графиками / ChartTimePriceToXY
Документация по MQL5: Операции с графиками / ChartTimePriceToXY
  • www.mql5.com
ChartTimePriceToXY - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: