- Типы объектов и особенности указания их координат
- Объекты с привязкой ко времени и цене
- Объекты с привязкой к экранным координатам
- Создание объектов
- Удаление объектов
- Поиск объектов
- Обзор функций доступа к свойствам объектов
- Основные свойства объектов
- Координаты времени и цены
- Угол окна привязки и экранные координаты
- Определение точки привязки на объекте
- Управление состоянием объекта
- Приоритет объектов (Z-порядок)
- Настройка отображения объекта: цвет, стиль и рамка
- Настройки шрифта
- Поворот текста на произвольный угол
- Определение ширины и высоты объектов
- Видимость объектов в разрезе таймфреймов
- Назначение кода символа для метки
- Свойства лучей для объектов c прямыми линиями
- Управление нажатым состоянием объекта
- Настройка изображений в объектах-картинках
- Кадрирование (вывод части) изображения
- Свойства поля ввода: выравнивание и "только чтение"
- Ширина канала стандартного отклонения
- Настройка уровней в объектах с их поддержкой
- Дополнительные свойства Ганна, Фибоначчи и Эллиота
- Объект-график
- Перемещение объектов
- Получение времени или цены в заданных точках линий
Получение времени или цены в заданных точках линий
Множество графических объектов включает в свой состав одну или несколько прямых линий. MQL5 позволяет выполнять интерполяцию и экстраполяцию точек на этих линиях и получать по одной координате другую, например, цену по времени или время по цене.
Интерполяция доступна всегда: она работает "внутри" объекта, то есть между точками привязки. Экстраполяция за пределы объекта возможна только в том случае, если для него включено свойство "луча" в соответствующем направлении (см. Свойства лучей для объектов с прямыми линиями).
Функция ObjectGetValueByTime возвращает значение цены для указанного времени. Функция ObjectGetTimeByValue возвращает значение времени для указанной цены.
double ObjectGetValueByTime(long chartId, const string name, datetime time, int line)
datetime ObjectGetTimeByValue(long chartId, const string name, double value, int line)
Вычисления производятся для объекта с именем name на графике с идентификатором chartId. Параметры time и value задают известную координату, для которой следует рассчитать неизвестную. Так как объект может иметь несколько линий, одной координате будет соответствовать несколько значений, в связи с чем необходимо указать номер линии в параметре line.
Функция возвращает значение цены или времени для проекции точки с указанной исходной координатой относительно линии.
В случае ошибки будет получен 0, а код ошибки записан в _LastError. Например, попытка экстраполировать значение линии при отключенном свойстве луча генерирует ошибку OBJECT_GETVALUE_FAILED (4205).
Функции применимы для следующих объектов:
- Трендовая линия (OBJ_TREND)
- Трендовая линия по углу (OBJ_TRENDBYANGLE)
- Линия Ганна (OBJ_GANNLINE)
- Равноудаленный канал (OBJ_CHANNEL) — 2 линии
- Канал на линейной регрессии (OBJ_REGRESSION) — 3 линии
- Канал стандартного отклонения (OBJ_STDDEVCHANNEL) — 3 линии
- Линия со стрелкой (OBJ_ARROWED_LINE)
Проверим работу функции с помощью безбуферного индикатора ObjectChannels.mq5. Он создает два объекта с каналами стандартного отклонения и линейной регрессии, после чего запрашивает и выводит в комментарий цену верхней и нижней линий на будущих барах. Для канала стандартного отклонения свойство OBJPROP_RAY_RIGHT включено, а для канала регрессии — нет (намеренно). В связи с этим значения от второго канала получены не будут, и на экране для него всегда выводятся нули.
По мере формирования новых баров каналы будут автоматически перемещаться вправо. Длина каналов задается во входном параметре WorkPeriod (10 баров по умолчанию).
input int WorkPeriod = 10;
|
Функция CreateObjects создает 2 канала и делает начальные настройки для них.
void CreateObjects()
|
Функция UpdateObjects перемещает каналы на последние WorkPeriod баров.
void UpdateObjects()
|
В обработчике OnCalculate обновляем позицию каналов на новых барах, а на каждом тике вызываем DisplayObjectData, чтобы получить экстраполяцию цен и вывести в комментарий.
int OnCalculate(const int rates_total,
|
В функции DisplayObjectData узнаем цены в точках привязки на средней линии (OBJPROP_PRICE), а также запрашиваем с помощью ObjectGetValueByTime значения цен для верхней и нижней линий каналов через WorkPeriod баров в будущем.
void DisplayObjectData()
|
Важно отметить, что из-за того, что свойство луча не включено для канала регрессии, он всегда дает нули в будущем (хотя при запросе цен внутри временного отрезка канала мы получили бы корректные значения).
Каналы и значения цен в точках их линий
Здесь для каналов длиной 10 баров экстраполяция также делается на 10 баров вперед, что дает будущие значения, показанные в строке с "dev:", примерно соответствующие правой границе окна.