Mql4 размер окна графика

API: как узнать размер графика в пикселях?

вас наверное забанили на поиск в гугле ?

размер графика в пикселях site:mql4.com

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

делов-то: получить цвет левого верхнего пикселя границы окна (кажется 4х4) и пробежаться вниз по рамочке пока пиксель будет этого же цвета и получить эту самую высоту. если побежать дальше — можно получить и высоты окон всех пристегнутых индикаторов. аналогично (по горизонтали) можно получить и ширину. Единственная заморочка — запаздывание в отработке при изменении размеров окна между тиками.

вот, уже была такая тема:

как определить размер окна в пикселях ?

делов-то: получить цвет левого верхнего пикселя границы окна (кажется 4х4) и пробежаться вниз по рамочке пока пиксель будет этого же цвета и получить эту самую высоту. если побежать дальше — можно получить и высоты окон всех пристегнутых индикаторов. аналогично (по горизонтали) можно получить и ширину. Единственная заморочка — запаздывание в отработке при изменении размеров окна между тиками.

Источник

API: как узнать размер графика в пикселях? — страница 3

я вот такую хрень делаю

я вот такую хрень делаю

я вот такую хрень делаю

Блин, никак руки не дойдут Объектный метод выложить.

В аттаче функция возвращающая высоту любого из графических окон, завернутая в проверочный скрипт.

FAQ :

не катит. по левому краю выравнивает, а мне надо по правому

За функцию спасибо! Пригодится!

не катит. по левому краю выравнивает, а мне надо по правому

Да, первый столбец привязан к левому верхнему углу, а столбцы с числами — к правому верхнему. А вместе они собираются через ширину окна. Весь блок ещё мышью таскать можно.

Моноширинный шрифт совсем ни к чему. и так хорошо получается)))

Источник

Операции с графиками

Функции для работы с графиками. Все операции с графиками применимы только в экспертах и скриптах.

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

По этой причине не следует ожидать немедленного визуального обновления графика после вызова данных функций. В общем случае обновление графика производится терминалом автоматически по событиям изменения — поступление новой котировки, изменения размера окна графика и т.д. Для принудительного обновления внешнего вида графика используйте команду на перерисовку графика ChartRedraw().

Применяет к указанному графику шаблон из указанного файла

Сохраняет текущие настройки графика в шаблон с указанным именем

Возвращает номер подокна, в котором находится индикатор

Преобразует координаты графика из представления время/цена в координаты по оси X и Y

Преобразует координаты X и Y графика в значения время и цена

Открывает новый график с указанным символом и периодом

Возвращает идентификатор первого графика клиентского терминала

Возвращает идентификатор графика, следующего за указанным

Закрывает указанный график

Возвращает имя символа указанного графика

Возвращает значение периода указанного графика

Вызывает принудительную перерисовку указанного графика

Задает значение типа double соответствующего свойства указанного графика

Задает значение целочисленного типа (datetime, int, color, bool или char) соответствующего свойства указанного графика

Задает значение типа string соответствующего свойства указанного графика

Возвращает значение соответствующего свойства указанного графика

Возвращает целочисленное значение соответствующего свойства указанного графика

Возвращает строковое значение соответствующего свойства указанного графика

Осуществляет сдвиг указанного графика на указанное количество баров относительно указанной позиции графика

Возвращает идентификатор текущего графика

Удаляет с указанного окна графика индикатор с указанным именем

Возвращает короткое имя индикатора по номеру в списке индикаторов на указанном окне графика.

Возвращает количество всех индикаторов, присоединенных к указанному окну графика.

Возвращает номер подокна графика, на которое брошен мышкой данный эксперт, скрипт, объект или индикатор

Возвращает ценовую координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт

Возвращает временную координату, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт

Возвращает координату по оси X, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт

Возвращает координату по оси Y, соответствующую точке, в которой брошен мышкой данный эксперт или скрипт

Меняет значения символа и периода указанного графика

Делает снимок указанного графика в формате gif

Возвращает период текущего графика

Возвращает текстовую строку с именем текущего финансового инструмента

Возвращает количество баров, помещающихся в окно текущего графика

Возвращает имя выполняющегося эксперта, скрипта, пользовательского индикатора или библиотеки

Возвращает номер подокна графика, содержащего индикатор с указанным именем

Возвращает номер первого видимого бара в окне текущего графика

Возвращает системный дескриптор окна, содержащего указанный график

Возвращает состояние видимости подокна графика

Возвращает индекс окна, в которое был брошен эксперт, пользовательский индикатор или скрипт

Возвращает максимальное значение вертикальной шкалы указанного подокна текущего графика

Возвращает минимальное значение вертикальной шкалы указанного подокна текущего графика

Возвращает значение цены в точке графика, на который был брошен эксперт или скрипт

Принудительно перерисовывает текущий график

Сохраняет изображение текущего графика в файле формата GIF, PNG или BMP в зависимости от указанного расширения

Возвращает значение времени в точке графика, на который был брошен эксперт или скрипт

Возвращает количество окон индикаторов на графике, включая главное окно графика

Возвращает значение координаты по оси X в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт

Возвращает значение координаты по оси Y в пикселах точки клиентской области окна графика, на которой был брошен эксперт или скрипт

Источник

Свойства графиков

Идентификаторы семейства перечислений ENUM_CHART_PROPERTY используются в качестве параметров функций для работы с графиками. Аббревиатура r/o в столбце «Тип свойства» означает, что данное свойство предназначено только для чтения и не может быть изменено. Аббревиатура w/o в столбце «Тип свойства» означает, что данное свойство предназначено только для записи и не может быть получено. При обращении к некоторым свойствам необходимо указывать дополнительный параметр-модификатор (modifier), который служит для указания номера подокна графика. 0 означает главное окно.

Показ графика поверх всех других

Прокрутка графика левой кнопкой мышки по горизонтали. Прокрутка по вертикали также будет доступна, если установлено в true значение любого из трех свойств: CHART_SCALEFIX, CHART_SCALEFIX_11 или CHART_SCALE_PT_PER_BAR

Отправка всем mql4-программам на графике сообщений о событиях перемещения и нажатия кнопок мыши (CHARTEVENT_MOUSE_MOVE)

Отправка всем mql4-программам на графике сообщений о событии создания графического объекта (CHARTEVENT_OBJECT_CREATE)

Отправка всем mql4-программам на графике сообщений о событии уничтожения графического объекта (CHARTEVENT_OBJECT_DELETE)

Тип графика (свечи, бары или линия)

Ценовой график на переднем плане

Режим отступа ценового графика от правого края

Режим автоматического перехода к правому краю графика

Разрешение на перехват графиком нажатий клавиш Space и Enter для активации строки быстрой навигации. Строка быстрой навигации автоматически появляется внизу графика при двойном клике мышки или нажатии клавиш Space/Enter. Таким образом можно быстро сменить символ, таймфрейм и дату первого видимого бара.

Режим фиксированного масштаба

Режим масштаба 1:1

Режим указания масштаба в пунктах на бар

Отображение в левом верхнем углу значений OHLC

Отображение значения Bid горизонтальной линией на графике

Отображение значения Ask горизонтальной линией на графике

Отображение значения Last горизонтальной линией на графике

Отображение вертикальных разделителей между соседними периодами

Отображение сетки на графике

Отображение объемов на графике

Отображение текстовых описаний объектов (не для всех объектов описания показываются)

Количество баров на графике, доступных для отображения

Общее количество окон графика, включая подокна индикаторов

bool r/o модификатор — номер подокна

Хэндл графика (HWND)

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

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

int r/o модификатор — номер подокна

Номер первого видимого бара на графике. Индексация баров соответствует таймсерии.

Ширина графика в барах

Ширина графика в пикселях

Читайте также:  Как отшпаклевать откосы окна

Высота графика в пикселях

int модификатор — номер подокна

Цвет фона графика

Цвет осей, шкалы и строки OHLC

Цвет объемов и уровней открытия ордеров

Цвет бара вверх, тени и окантовки тела бычьей свечи

Цвет бара вниз, тени и окантовки тела медвежьей свечи

Цвет линии графика и японских свечей «Доджи»

Цвет тела бычьей свечи

Цвет тела медвежьей свечи

Цвет линии Bid-цены

Цвет линии Ask-цены

Цвет линии цены последней совершенной сделки (Last)

Цвет уровней стоп-ордеров (Stop Loss и Take Profit)

Отображение на графике торговых уровней (уровни открытых ордеров, Stop Loss, Take Profit и отложенных ордеров)

Разрешение на перетаскивание торговых уровней на графике с помощью мышки. По умолчанию режим перетаскивания включен (значение true)

Отображение на графике шкалы времени

Отображение на графике ценовой шкалы

Признак, определяющий, является ли график автономным

Размер отступа нулевого бара от правого края в процентах

double (от 10 до 50 процентов)

Положение фиксированной позиции графика от левого края в процентах. Фиксированная позиция графика обозначена маленьким серым треугольником на горизонтальной оси времени и показывается только в том случае, если отключена автоматическая прокрутка к правому краю при поступлении нового тика (смотри свойство CHART_AUTOSCROLL ). Бар, который находится на фиксированной позиции, остаётся на том же месте при увеличении и уменьшении масштаба.

Фиксированный максимум графика

Фиксированный минимум графика

Значение масштаба в пунктах на бар

double r/o модификатор — номер подокна

double r/o модификатор — номер подокна

Текст комментария на графике

int chartMode= ChartGetInteger (0, CHART_MODE );
switch (chartMode)
<
case ( CHART_BARS ): Print ( «CHART_BARS» ); break ;
case ( CHART_CANDLES ): Print ( «CHART_CANDLES» ); break ;
default : Print ( «CHART_LINE» );
>
bool shifted= ChartGetInteger (0, CHART_SHIFT );
if (shifted) Print ( «CHART_SHIFT = true» );
else Print ( «CHART_SHIFT = false» );
bool autoscroll= ChartGetInteger (0, CHART_AUTOSCROLL );
if (autoscroll) Print ( «CHART_AUTOSCROLL = true» );
else Print ( «CHART_AUTOSCROLL = false» );
int chartHandle= ChartGetInteger (0, CHART_WINDOW_HANDLE );
Print ( «CHART_WINDOW_HANDLE = » ,chartHandle);
int windows= ChartGetInteger (0, CHART_WINDOWS_TOTAL );
Print ( «CHART_WINDOWS_TOTAL = » ,windows);
if (windows>1)
<
for ( int i=0;i
<
int height= ChartGetInteger (0, CHART_HEIGHT_IN_PIXELS ,i);
double priceMin= ChartGetDouble (0, CHART_PRICE_MIN ,i);
double priceMax= ChartGetDouble (0, CHART_PRICE_MAX ,i);
Print (i+ «: CHART_HEIGHT_IN_PIXELS = » ,height, «pixels» );
Print (i+ «: CHART_PRICE_MIN = » ,priceMin);
Print (i+ «: CHART_PRICE_MAX = » ,priceMax);
>
>

Источник

Графические объекты

Графический объект — это изображение в окне финансового инструмента, которое можно выделить, переместить, изменить или удалить.

К графическим объектам относятся, например, горизонтальные и вертикальные линии, канал линейной регрессии, уровни Фибоначчи, прямоугольник, текстовая метка и пр. Такие изображения, как индикаторные линии, уровни индикатора, изображения свечей, надписи, выводимые функцией Comment(), и др. выделить и удалить невозможно, поэтому они не являются графическими объектами.

Графические объекты отображаются клиентским терминалом в окне финансового инструмента в соответствии с заданными координатами. Каждый графический объект, в зависимости от своего типа, имеет одну, две или три координаты и другие настраиваемые параметры. Любой графический объект можно установить в окно финансового инструмента вручную (с панели инструментов и из системного меню), а также в результате исполнения прикладной программы, запущенной в этом окне финансового инструмента, в том числе, эксперта, скрипта или пользовательского индикатора. Преобразование вида и места положения графического объекта может осуществляться вручную или программно, путём сообщения графическому объекту новых значений координат и других параметров.

Способы позиционирования графических объектов

В MQL4 принято два способа позиционирования объектов: относительно ценового графика и относительно окна финансового инструмента. Чтобы наглядно продемонстрировать разницу между этими способами, установим вручную в окне финансового инструмента два различных графических объекта: текст (OBJ_TEXT) и текстовую метку (OBJ_LABEL). Для этого можно воспользоваться кнопками А и Т на панели графических инструментов клиентского терминала. Установим размер окна таким образом, чтобы оно занимало приблизительно половину площади экрана (Рис. 134). Проследим, как будут реагировать эти графические объекты на изменение размеров окна (а также на горизонтальное и вертикальное масштабирование ценового графика).


Рис. 134. Графические объекты с различными способами позиционирования в окне финансового инструмента.

Позиционирование относительно окна финансового инструмента

Графический объект OBJ_LABEL будет оставаться неподвижным, если размер окна изменять путём перемещения его правой или нижней границы. Если же размер окна менять перемещая верхнюю или левую границу, то объект будет смещаться, при этом положение объекта относительно каждой их этих границ будет оставаться неизменным. Это происходит потому, что позиционирование графического объекта OBJ_LABEL осуществляется относительно границ окна финансового инструмента. В данном случае точкой привязки графического объекта к окну финансового инструмента является левый верхний угол окна финансового инструмента. Координаты объекта относительно указанной точки привязки задаются в пикселях — 193 и 48 на Рис. 135.


Рис. 135. Настройки графического объекта OBJ_LABEL.

Точкой отсчёта координат самого объекта (в данном случае) является верхний левый угол курсорной рамки, видимой при выделении объекта мышью. В левом верхнем углу курсорной рамки можно видеть небольшую точку, свидетельствующую о настройках данного графического объекта. В случае, если указана иная точка привязки, то и на курсорной рамке точка будет указана в другом углу.

При появлении в окне финансового инструмента новых баров объект типа OBJ_LABEL будет оставаться неподвижным относительно окна финансового инструмента. Использование этого объекта удобно в том случае, если необходимо вывести на экран текстовую информацию общего характера, например, о прекращении торгов, изменении брокером значения ограничивающей дистанции для ордеров и пр.

Позиционирование относительно ценового графика

При любом способе изменения размеров окна, а также при масштабировании ценового графика объект типа OBJ_TEXT не меняет своего положения относительно ценового графика. Точкой отсчёта координат для этого объекта является середина верхней линии курсорной рамки, координатой по оси Х — время, а по оси Y — цена по финансовому инструменту (Рис. 136).


Рис. 136. Настройки графического объекта OBJ_TEXT.

По мере появления в окне финансового инструмента новых баров место положения графического объекта OBJ_TEXT относительно ценового графика не изменяется, т.е. с появлением новых баров объект будет смещаться влево вместе с ценовым графиком, а когда новых баров накопится достаточное количество, то объект переместится за пределы левой границы окна финансового инструмента.

Тот или иной способ позиционирования является собственным свойством графического объекта определённого типа и не может быть изменён пользователем, в том числе программно. Большинство графических объектов позиционируются относительно ценового графика, т.е. в координатах цены и времени.

Создание графических объектов и изменение их свойств

Создать графический объект — это значит установить в окне финансового инструмента один из объектов предопределённого типа (см. Типы и свойства графических объектов). Для создания объекта используется функция:

Функция ObjectCreate()

Функция создаёт объект указанного типа с заданным именем и начальными координатами в указанном подокне графика. Число координат, связываемых с объектом, может быть от 1 до 3 в зависимости от его типа. При успешном создании объекта функция возвращает TRUE, иначе FALSE. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Координаты должны передаваться парами — время и цена. Например, объекту OBJ_VLINE требуется только время, но также нужно передать и цену (любое значение). Графический объект типа OBJ_LABEL игнорирует координаты, указанные в функции; для установки свойств OBJPROP_XDISTANCE и OBJPROP_YDISTANCE этого объекта необходимо использовать функцию ObjectSet().

  • name — имя объекта;
  • type — тип объекта (может быть одним из предопределённых типов объектов);
  • window — номер окна, в которое будет добавлен объект. Нумерация подокон графика (если на графике есть подокна с индикаторами) начинается с 1, главное окно графика есть всегда и имеет номер 0; указываемый номер окна должен быть большим или равным 0 и меньшим, чем значение, возвращаемое функцией WindowsTotal();
  • time1 — время первой координаты;
  • price1 — цена первой координаты;
  • time2 — время второй координаты;
  • price2 — цена второй координаты;
  • time3 — время третьей координаты;
  • price3 — цена третьей координаты.

Каждый графический объект имеет некоторые (свойственные ему) настраиваемые параметры. Например, кроме задаваемых координат объекту можно установить цвет, текст сообщения (для одних объектов), стиль линий (для других объектов) и т.д. Для изменения свойств объектов используется функция:

Функция ObjectSet()

Функция изменяет значение указанного свойства объекта. В случае успеха функция возвращает TRUE, иначе FALSE. Для получения информации об ошибке необходимо вызвать функцию GetLastError().

  • name — имя объекта;
  • prop_id — идентификатор свойства объекта (указывается одно из свойств объекта);
  • value — новое значение указанного свойства.

Все графические объекты могут иметь также текстовое описание. Текстовое описание каждого объекта доступно пользователю и может быть изменено на панели свойств объекта или программным способом. Для объектов OBJ_TEXT и OBJ_LABEL это описание составляет их основное содержание и всегда отображается в виде текстовой строки. Текстовые описания других объектов отображаются в непосредственной близости от изображения самого объекта в том случае, если включена опция «Показывать описания объектов» на панели свойств окна финансового инструмента (F8). Для изменения текстового описания объекта используется функция:

Читайте также:  Как распланировать студию с одним окном

Функция ObjectSetText()

Функция изменения описания объекта. В случае успеха функция возвращает значение TRUE, иначе FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию функцию GetLastError().Параметры font_size, font_name и text_color используются только для объектов OBJ_TEXT и OBJ_LABEL. Для объектов других типов эти параметры игнорируются.

  • name — имя объекта;
  • text — текст описания обьекта;
  • font_size — размер шрифта в пунктах;
  • font_name — наименование шрифта;
  • text_color — цвет текста.

Рассмотрим пример эксперта, в котором полезно используются функции управления графическими объектами.

Задача 32.Используя графический объект сообщить пользователю о торговых критериях, определённых на основе показаний индикатора MACD.

Как известно, индикатор MACD часто используется трейдерами для формирования торговых критериев. Индикатор представлен двумя линиями — главной и сигнальной. Считается, что торговый критерий срабатывает в момент пересечения указанных линий. Если главная линия индикатора (обычно серая гистограмма) пересекает сверху вниз сигнальную линию (обычно красную пунктирную), то нужно продавать, а если снизу вверх, — то покупать. В промежутках между пересечениями линий индикатора необходимо удерживать рыночные ордера, а в момент срабатывания противоположного критерия зарывать их и одновременно открывать новые в противоположном направлении. Таким образом, необходимо подготовить 4 вида сообщения: открытие Buy, открытие Sell, удержание Buy и удержание Sell.

В данной задаче все сообщения являются взаимоисключающими, т.е. невозможна ситуация, при которой возникает необходимость вывести на экран одновременно два или более сообщений. Поэтому в данном случае можно использовать всего один графический объект, постоянно присутствующий на экране, и по мере необходимости изменять выводимый текст. Отобразим объект в правом верхнем углу окна финансового инструмента, в котором будет работать эксперт. Поскольку положение объекта по ходу торгов менять не предполагается, то удобно использовать объект типа OBJ_LABEL, т.к. он позиционируется относительно окна финансового инструмента.

В качестве решения Задачи 32 рассмотрим эксперт grafobjects.mq4, использующий графический объект OBJ_LABEL:

В блоке 1-2 эксперта определены переменные, в частности, заданы значения элементов массивов Text[] и Color[], которые в дальнейшем используются для изменения свойств объекта. В блоке 2-3 создаётся объект, и устанавливаются значения некоторых его свойств. Разберём это блок подробно. Согласно этой строки кода эксперта в окне финансового инструмента, в котором исполняется эксперт, создаётся графический объект:

Значение «Label_Obj_MACD» указывает, что объекту назначено такое имя (имя создаваемому объекту присваивает программист по своему усмотрению). OBJ_LABEL — идентификатор типа объекта, указывает, что создаваемый объект будет иметь такой тип (выбирается из списка возможных типов). Первый из трёх последующих нолей указывает, что объект создаётся в основном окне (основное окно, где отображается ценовой график, всегда имеет индекс 0).

Следующие два ноля устанавливают для создаваемого объекта координаты, в соответствии с которыми объект должен быть отображён в указанном окне. В данном конкретном случае создаётся объект OBJ_LABEL, который не использует координаты цены и времени. Обратите внимание, в описании функции ObjectCreate() указываются только координаты цены и времени. Причём, для второй и третьей пары координат имеются умолчательные значения, в то время как для первой пары координат умолчательных значений нет. Это значит, что несмотря на то что для объекта OBJ_LABEL вообще не требуются координаты цены и времени, в вызове функции ObjectCreate() должны быть указаны какие-то значения. В данном случае указаны нули, можно было бы указать другие значения, но и в том и в другом случае они всё равно игнорируются при установлении свойств объекта OBJ_LABEL.

В последующих трёх строках программы (ранее созданному) объекту с именем Label_Obj_MACD устанавливаются значения для некоторых его свойств:

Для угла привязки (OBJPROP_CORNER) устанавливается значение 1, что означает привязку к правому верхнему углу (ранее определённого основного) окна финансового инструмента. В следующих двух строках устанавливаются значения дистанции в пикселях от объекта до угла привязки: по горизонтали (OBJPROP_XDISTANCE) 10 пикселей и по вертикали (OBJPROP_YDISTANCE) 15 пикселей. На этой стадии исполнения программы объект создан, имеет уникальное имя и определены его основные свойства.

Для того чтобы объект отобразил нужный текст, сначала необходимо вычислить каким этот текст должен быть. Для этого сначала в блоке 3-4 определяется взаимное положение индикаторных линий индикатора MACD на текущем и предыдущем барах, а затем в блоке 4-5 вычисляется значение Sit, соответствующее текущей ситуации (см. также Рис. 107 и callstohastic.mq4)

В следующей строке определяются свойства объекта в зависимости от сложившейся ситуации:

В результате исполнения функции ObjectSetText() объекту с именем Label_Obj_MACD назначается текстовое описание, а именно значение строковой переменной Text[Sit]. Это значение для разных ситуаций будет различным в зависимости от значения переменной Sit. Например, если главная линия пересекла сигнальную сверху вниз, то в блоке 4-5 переменная Sit получит значение 1, в результате чего графическому объекту будет назначено текстовое описание, содержащееся в элементе массива Text[1], а именно «Открытие Sell». Следующие параметры: 10, «Arial» и Color[Sit] указывают размер, название и цвет шрифта для текстового описания.

В результате исполнения эксперта в окне финансового инструмента EURUSD можно наблюдать следующее:


Рис. 137. Результат работы эксперта grafobjects.mq4 в момент срабатывание критерия на продажу.

На Рис. 137 видно, что в окне финансового инструмента имеется также подокно индикатора MACD. Нужно заметить, что для полноценной работы эксперта наличие этого индикатора в окне финансового инструмента не требуется, т.к. вычисление торговых критериев в эксперте происходит в результате исполнения функции технического индикатора, не связанной с выводом индикатора на экран. Здесь индикатор показан только для того, чтобы можно было визуально определить момент срабатывания торгового критерия и вывод необходимого для этого случая текстового описания графического объекта. Эксперт будет работать аналогично и при всех других сочетаниях взаимного положения индикаторных линий, всякий раз отображая описание, соответствующее ситуации.

Удаление графических объектов

Рассмотренный выше эксперт grafobjects.mq4 имеет небольшой недостаток. По окончании работы эксперта в окне финансового инструмента останется графический объект (при этом его свойства будут такими, какими они были на момент последнего изменения). Графические объекты самопроизвольно не удаляются. По мере развития торгов, начиная с некоторого момента, надпись Открытие Sell уже не будет соответствовать действительности. Чтобы не вводить пользователя в заблуждение, графический объект нужно удалить.

Для удаления любого графического объекта (независимо от способа его создания — вручную или программно) достаточно выделить его и нажать клавишу Delete. Однако, говоря о программировании, следует подчеркнуть, что правильно составленная программа обязательно должна «почистить» после себя окно финансового инструмента. Иными словами, в программе должен быть предусмотрен блок, в котором удаляются все созданные программой графические объекты.

Функция ObjectDelete()

Удаление объекта с указанным именем. При успешном удалении функция возвращает TRUE, иначе FALSE. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

Использование функции ObjectDelete() крайне просто: достаточно указать имя удаляемого объекта.

Для того чтобы устранить недоработку, допущенную в предыдущем примере, достаточно дополнить эксперт grafobjects.mq4 специальной функцией deinit(), в которой и указать функцию удаления объекта:

При исполнении эксперта, дополненного функцией deinit() с таким кодом, объект с именем Label_Obj_MACD будет удалён. В общем случае программа может создавать множество объектов. Каждый из них может быть удалён программно в соответствии с алгоритмом.

Модификация графических объектов

В ряде случаев требуется программно изменить положение объекта в окне финансового инструмента. Чаще всего такая необходимость возникает по причине появления новых баров. Например, торговые критерии в эксперте могут формироваться на основе канала линейной регрессии, построенного на баровой истории определённой длительности (например, по последним 50 барам). Если графический объект «канал линейной регрессии» просто отобразить в окне финансового инструмента и в дальнейшем не предпринимать никаких мер, то он всё время будет оставаться в том месте ценового графика, где был установлен, и с появлением новых баров будет смещаться влево вместе с историческими барами. Для того, чтобы этот графический объект не «съезжал», его необходимо перерисовывать на каждом новом баре. Для этой цели необходимо вычислить и сообщить объекту новые координаты, в соответствии с которыми объект должен быть отображён в окне финансового инструмента.

Для того, чтобы узнать какие свойства имеются у графического объекта на текущий момент, необходимо использовать функцию:

Функция ObjectGet()

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

  • name — имя объекта;
  • prop_id — идентификатор свойства объекта. Может быть любым из значений списка свойств объекта.

Сообщение новых координат объекту осуществляется с помощью функции ObjectMove().

Функция ObjectMove()

Изменение одной из координат объекта на графике. Функция возвращает TRUE в случае успеха, иначе FALSE. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError(). Нумерация координат объекта начинается с 0.

  • name — имя объекта;
  • point — индекс координаты (0-2);
  • time1 — новое значение времени;
  • price1 — новое значение цены.
Читайте также:  Размер пластикового окна меньше стандартного
Задача 33.Составить программу (эксперт), поддерживающую отображение канала линейной регрессии для последних 50 баров.

Графический объект «канал линейной регрессии» использует две координаты времени. Координаты цены (если они были назначены в программе) при построении этого объекта клиентским терминалом игнорируются. Канал линейной регрессии вычисляется клиентским терминалом на основе исторических цен и по своей сути не может быть отображён в стороне от ценового графика. Поэтому отсутствие привязки этого объекта по цене (игнорирование координат цены терминалом) является собственным неизменным свойством этого объекта. Эксперт (moveobjects.mq4), управляющий положением графического объекта может быть составлен так:

Алгоритм эксперта moveobjects.mq4 предполагает, что однажды выставленный графический объект будет оставаться на экране в течение всего времени исполнения программы. В подобных случаях имеет смысл использовать в программе пользовательскую функцию (здесь это функция Create(), блок 6-7) для создания объекта и обращаться к ней из программы по мере необходимости. Для отображения объекта необходимы две координаты времени (Т1 — координата левой границы объекта и Т2 — координата правой границы):

В данном примере правая граница графического объекта должна всегда находиться на нулевом баре, поэтому значение второй координаты совпадает со временем открытия нулевого бара. Левая координата вычисляется в зависимости от заданного пользователем количества баров (внешняя переменная Len_Cn) и определяется как время открытия бара с соответствующим индексом. Например, если длина канала составляет 50 баров, то левая координата объекта будет равна времени открытия бара с индексом 49.

В следующих строках пользовательской функции Create() с помощью ObjectCreate() создаётся объект OBJ_REGRESSION, и с помощью ObjectSet() созданный объект наделяется необходимыми свойствами (заданный пользователем во внешней переменной цвет, запрещено рисовать объект как луч, стиль линии — пунктирная). В строке:

объекту сообщается текстовое описание. В отличие от ранее рассмотренного объекта OBJ_LABEL, текстовое описание объекта OBJ_REGRESSION не выводится на экран. Текстовое описание графических объектов можно увидеть на панели свойств объектов. Это очень удобно использовать во время практической работы для того, чтобы отличить объекты, созданные программой, от объектов, выставленных пользователем вручную:


Рис. 138. Общие свойства графического объекта «канал линейной регрессии», созданного экспертом moveobjects.mq4.

В программе используется ещё одна функция, с помощью которой перерисовывается текущий график:

Функция WindowRedraw()

Функция принудительно перерисовывает текущий график. Обычно применяется после изменения свойств объектов.

Обычный порядок отображения графических объектов клиентским терминалом предусматривает фактическое изменение изображения в момент поступления нового тика. Поэтому, если не использовать WindowRedraw(), то изменения свойств объекта становятся видимы пользователю на следующем тике, т.е. процесс отображения постоянно запаздывает на один тик. Использование WindowRedraw() позволяет принудительно перерисовать все объекты в нужный момент, например, сразу после изменения свойств объектов. В общем случае, если в программе изменяются свойства нескольких объектов, то функцию WindowRedraw() достаточно использовать один раз, после изменения свойств последнего из объектов.

Первое обращение к пользовательской функции осуществляется из специальной функции init(). В момент прикрепления эксперта к окну финансового инструмента начнётся исполнение init(), в результате чего графический объект «канал линейной регрессии» отобразится в окне финансового инструмента.

В функции start() рассматривается две возможных ситуации: когда объект случайно удалён пользователем (блок 3-4) и когда объект необходимо переместить вправо при образовании нового нулевого бара (блок 4-5). Для того чтобы определить, существует ли вообще графический объект на текущий момент, достаточно запросить значение одной из его координат. Если объект существует, то функция ObjectGet() вернёт некоторое значение, соответствующее запрошенной координате, а функция GetLastError() вернёт нулевое значение (т.е. при запросе координаты ошибка не возникла). Если же объекта с заданным именем в окне финансового инструмента нет, то функция GetLastError() вернёт код ошибки 4202, т.е. объект не существует:

Если анализ ошибки показал, что объекта нет, значит его надо вновь создать, уведомив пользователя о недопустимых действиях (программа не удаляет объект в процессе работы, значит объект удалён пользователем). Поэтому после вывода сообщения в программе выполняется обращение к ранее рассмотренной пользовательской функции Create(), в результате чего объект снова создаётся в окне финансового инструмента.

К моменту, когда исполняется следующий блок (4-5), графический объект обязательно присутствует. Чтобы решить, надо ли его двигать, следует знать, каково положение объекта на текущий момент. Для этого достаточно проанализировать (ранее полученное) значение первой координаты объекта, и если это значение не совпадает со временем открытия нулевого бара, то сообщить объекту новые координаты.

Изменение координат объекта осуществляется с помощью функции ObjectMove():

Здесь объекту с именем Obj_Reg_Ch для первой координаты (координата 0) устанавливается значение Time[Len_Cn-1], а для второй координаты (координата 1) -Time[0]. Последним среди передаваемых в функцию ObjectMove() параметров указан 0. Это — координата цены, которую в соответствии с описанием функции передавать необходимо, но которое в данном случае будет проигнорировано клиентским терминалом. В результате исполнения этих строк свойства указанного графического объекта будут изменены, а в результате последующего исполнения функции WindowRedraw() графический объект будет принудительно перерисован клиентским терминалом — теперь уже соответственно новым значениям координат.

Таким образом, при исполнении функции start() графический объект «канал линейной регрессии» будет перерисовываться клиентским терминалом всякий раз при образовании нового бара, на первом же его тике (см. рис. 139). По окончании выполнения эксперта в окне финансового инструмента, в момент исполнения специальной функции deinit(), указанный объект будет удалён (т.е. программа «подметёт» после работы своё рабочее место).


Рис. 139. Отображение канала линейной регрессии при исполнении эксперта moveobjects.mq4.

В общем случае можно создавать и удалять графические объекты в зависимости от некоторых вычисленных в программе условий. Можно отображать линии поддержки и сопротивления (OBJ_TREND), вертикальными линиями (OBJ_VLINE) отмечать время приближающихся значительных событий, текстовыми объектами (OBJ_LABEL и OBJ_TEXT) указывать пересечения различных линий, прогнозируемое направление движения цены и т.д.

Отдельно нужно заметить, что в ряде случаев использование графических объектов не требуется. Например, если есть необходимость вывести на экран множество простых однотипных изображений (например, стрелки), то для этого можно воспользоваться индикаторными линиями, соответствующим образом настроив стиль линий. Такой подход избавит от необходимости отслеживать в программе множество координат объектов и предотвратит возможность случайного удаления изображения (значки, отображающие индикаторные линии, невозможно ни выделить, ни удалить).

Функции для работы с графическими объектами

Функция Краткое описание
ObjectCreate Создание объекта с указанным именем, тип и начальные координаты в указанном подокне графика. Число координат, связываемых с объектом, может быть от 1 до 3 в зависимости от типа. При успешном создании объекта функция возвращает TRUE, иначе FALSE.
ObjectDelete Удаление объекта с указанным именем. При успешном удалении функция возвращает TRUE, иначе FALSE
ObjectDescription Функция возвращает описание объекта. Для объектов типа OBJ_TEXT и OBJ_LABEL возвращается текст, отображаемый этими объектами.
ObjectFind Поиск объекта с указанным именем. Функция возвращает индекс окна, которому принадлежит искомый объект. В случае неудачи функция вернет -1.
ObjectGet Функция возвращает значение указанного свойства объекта.
ObjectGetFiboDescription Функция возвращает описание уровня объекта Фибоначчи. Количество уровней зависит от типа объекта, принадлежащего к группе объектов Фибоначчи. Максимальное количество уровней — 32.
ObjectGetShiftByValue Функция вычисляет и возвращает номер бара (смещение относительно текущего бара) для указанной цены. Номер бара вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов.
ObjectGetValueByShift Функция вычисляет и возвращает значение цены для указанного бара (смещение относительно текущего бара). Значение цены вычисляется при помощи линейного уравнения по первой и второй координатам. Применяется для трендовых линий и аналогичных объектов.
ObjectMove Изменение одной из координат объекта на графике. Объекты могут иметь от одной до трех точек привязки в зависимости от типа объекта. Функция возвращает TRUE в случае успеха, иначе FALSE.
ObjectName Функция возвращает имя объекта по порядковому номеру в списке объектов.
ObjectsDeleteAll Удаление всех объектов с указанным типом и в указанном подокне графика. Функция возвращает число удаленных объектов.
ObjectSet Изменение значения указанного свойства объекта. В случае успеха функция возвращает TRUE, иначе FALSE
ObjectSetFiboDescription Функция присваивает новое описание уровню объекта Фибоначчи. Количество уровней зависит от типа объекта Фибоначчи. Максимальное количество уровней — 32.
ObjectSetText Изменение описания объекта. Для объектов OBJ_TEXT и OBJ_LABEL это описание отображается на графике в виде текстовой строки. В случае успеха функция возвращает значение TRUE, иначе FALSE.
ObjectsTotal Возвращает общее число объектов указанного типа на графике.
ObjectType Функция возвращает тип указанного объекта.

Для получения подробного описания этих и других функций необходимо обратиться к справочной документации на MQL4.community, сайте MetaQuotes Ltd. или к разделу «Справка» в редакторе MetaEditor.

Источник

Поделиться с друзьями
Adblock
detector