Получение координат буксировки MQL-программы на график

Пользователи часто наносят MQL-программы на график с помощью мыши. Это не только удобно, но и позволяет задать некий контекст для алгоритма. Например, индикатор может быть применен в разных подокнах или скрипт может установить отложенный ордер на той цене, где пользователь отпустил его на график. Следующая группа функций предназначена для получения координат точки, в которую была отбуксирована программа.

int ChartWindowOnDropped()

Данная функция возвращает номер подокна графика, на которое брошен мышкой текущий эксперт, скрипт или индикатор. Главное окно, как мы знаем, имеет номер 0, а подокна нумеруются, начиная с 1. Номер подокна не зависит от того, есть ли над ним скрытые подокна — их индексы остаются закрепленными за ними. Иными словами, видимый номер подокна может отличаться от его реального индекса, если на графике имеются скрытые подокна.

double ChartPriceOnDropped()

datetime ChartTimeOnDropped()

Эта пара функций возвращает координаты точки "заброски" программы в единицах цены и времени. Обратите внимание, что в подокнах могут выводиться произвольные данные, а не только цены, хотя в названии функции ChartPriceOnDropped фигурирует "Price".

Внимание! Время целевой точки не округляется по размеру таймфрейма графика, поэтому даже на графиках H1, D1 можно получить значение с минутами и даже секундами.

int ChartXOnDropped()

int ChartYOnDropped()

Данные две функции возвращают экранные координаты точки по осям X и Y в пикселях. Начало координат находится в левом верхнем углу основного окна графика. Про направление осей мы рассказывали в разделе Характеристики экрана.

Координата Y всегда отсчитывается от левого верхнего угла основного графика, даже если точка "заброски" принадлежит подокну. Для перевода этого значения в координату y относительно подокна следует использовать свойство CHART_WINDOW_YDISTANCE (см. пример).

В скрипте ChartDrop.mq5 выведем в журнал значения всех упомянутых функций.

void OnStart()
{
   const int w = PRTF(ChartWindowOnDropped());
   PRTF(ChartTimeOnDropped());
   PRTF(ChartPriceOnDropped());
   PRTF(ChartXOnDropped());
   PRTF(ChartYOnDropped());
   
   // для подокна пересчитаем координату y в локальную
   if(w > 0)
   {
      const int y = (int)PRTF(ChartGetInteger(0CHART_WINDOW_YDISTANCEw));
      PRTF(ChartYOnDropped() - y);
   }
}

Например, если набросить этот скрипт в первое подокно, где запущен индикатор WPR, можем получить такие результаты.

ChartWindowOnDropped()=1 / ok
ChartTimeOnDropped()=2021.11.30 03:52:30 / ok
ChartPriceOnDropped()=-50.0 / ok
ChartXOnDropped()=217 / ok
ChartYOnDropped()=312 / ok
ChartGetInteger(0,CHART_WINDOW_YDISTANCE,w)=282 / ok
ChartYOnDropped()-y=30 / ok

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

Обратите внимание, что значение "цены" равно -50, поскольку диапазон значений WPR равен [0,-100].

Кроме того, вертикальная координата точки 312 (относительно всего окна графика) была переведена в локальную координату подокна: поскольку расстояние по вертикали от начала основного графика до подокна составило 282, значение y внутри подокна оказалось равным 30.