Русский

Учебник по MQL4  Стандартные функции  Графические объекты

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


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

К графическим объектам относятся, например, горизонтальные и вертикальные линии, канал линейной регрессии, уровни Фибоначчи, прямоугольник, текстовая метка и пр. Такие изображения, как индикаторные линии, уровни индикатора, изображения свечей, надписи, выводимые функцией 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()

bool ObjectCreate(string name, int type, int window, datetime time1, double price1, 
datetime time2=0, double price2=0, datetime time3=0, double price3=0)

Функция создаёт объект указанного типа с заданным именем и начальными координатами в указанном подокне графика. Число координат, связываемых с объектом, может быть от 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()

bool ObjectSet(string name, int prop_id, double value)

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

Параметры:

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

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

Функция ObjectSetText()

bool ObjectSetText(string name, string text, int font_size,
 
string font_name=NULL, color text_color=CLR_NONE)

Функция изменения описания объекта. В случае успеха функция возвращает значение 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:

//--------------------------------------------------------------------
// grafobjects.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Спец. функция start
{
//--------------------------------------------------------------- 1 --
int Sit;
double MACD_M_0,MACD_M_1, // Главная линия, 0 и 1 бар
MACD_S_0,MACD_S_1; // Сигнальная линия, 0 и 1 бар
string Text[4]; // Объявление строков. массива
color Color[4]; // Объявление массива цветов

Text[0]= "Открытие Buy"; // Текст для различных ситуаций
Text[1]= "Открытие Sell";
Text[2]= "Удерживаем Buy";
Text[3]= "Удерживаем Sell";

Color[0]= DeepSkyBlue; // Цвет объекта ..
Color[1]= LightPink; // .. для различных ситуаций
Color[2]= Yellow;
Color[3]= Yellow;
//--------------------------------------------------------------- 2 --
ObjectCreate("Label_Obj_MACD", OBJ_LABEL, 0, 0, 0);// Создание объ.
ObjectSet("Label_Obj_MACD", OBJPROP_CORNER, 1); // Привязка угол
ObjectSet("Label_Obj_MACD", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Label_Obj_MACD", OBJPROP_YDISTANCE, 15);// Координата Y
//--------------------------------------------------------------- 3 --
MACD_M_0 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 бар
MACD_S_0 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);// 0 бар
MACD_M_1 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 бар
MACD_S_1 =iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);// 1 бар
//--------------------------------------------------------------- 4 --
// Анализ ситуации
if(MACD_M_1=MACD_S_0) // Персеч. снизу вверх
Sit=0;
if(MACD_M_1>MACD_S_1 && MACD_M_0<=MACD_S_0)// Персеч. сверху вниз
Sit=1;
if(MACD_M_1>MACD_S_1 && MACD_M_0>MACD_S_0) // Главная выше сигн.
Sit=2;
if(MACD_M_1

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

   ObjectCreate("Label_Obj_MACD", OBJ_LABEL, 0, 0, 0);// Создание объ.

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

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

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

   ObjectSet("Label_Obj_MACD", OBJPROP_CORNER, 1);    // Привязка угол
ObjectSet("Label_Obj_MACD", OBJPROP_XDISTANCE, 10);// Координата Х
ObjectSet("Label_Obj_MACD", OBJPROP_YDISTANCE, 15);// Координата Y

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

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

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

                                       // Изменение свойств объекта
ObjectSetText("Label_Obj_MACD",Text[Sit],10,"Arial",Color[Sit]);

В результате исполнения функции 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()

bool ObjectDelete(string name)

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

Параметры:

  • name - имя удаляемого объекта.

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

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

//--------------------------------------------------------------- 7 --
int deinit() // Спец. функция deinit
{
ObjectDelete("Label_Obj_MACD"); // Удаление объекта
return; // Выход из deinit()
}
//--------------------------------------------------------------- 8 --

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


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


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

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

Функция ObjectGet()

double ObjectGet(string name, int prop_id)

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

Параметры:

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

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

Функция ObjectMove()

bool ObjectMove(string name, int point, datetime time1, double price1)

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

Параметры:

  • name - имя объекта;
  • point - индекс координаты (0-2);
  • time1 - новое значение времени;
  • price1 - новое значение цены.

Задача 33.Составить программу (эксперт), поддерживающую отображение канала линейной регрессии для последних 50 баров.

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

//--------------------------------------------------------------------
// moveobjects.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Len_Cn=50; // Длина канала (баров)
extern color Col_Cn=Orange; // Цвет канала
//--------------------------------------------------------------- 1 --
int init() // Спец. функция init()
{
Create(); // Вызов пользов. ф-ии создания
return; // Выход из init()
}
//--------------------------------------------------------------- 2 --
int start() // Спец. функция start()
{
datetime T2; // Вторая координата времени
int Error; // Код ошибки
//--------------------------------------------------------------- 3 --
T2=ObjectGet("Obj_Reg_Ch",OBJPROP_TIME2);// Запрос коорд. t2
Error=GetLastError(); // Получение кода ошибки
if (Error==4202) // Если объекта нет :(
{
Alert("Канал регрессии находится под управлением",
"\n Book_expert_82_2. Удалять нельзя.");
Create(); // Вызов пользов. ф-ии создания
T2=Time[0]; // Текущее значение коорд. t2
}
//--------------------------------------------------------------- 4 --
if (T2!=Time[0]) // Если объект не на месте
{
ObjectMove("Obj_Reg_Ch", 0, Time[Len_Cn-1],0); //Новая коорд. t1
ObjectMove("Obj_Reg_Ch", 1, Time[0], 0); //Новая коорд. t2
WindowRedraw(); // Перерисовка изображения
}
return; // Выход из start()
}
//--------------------------------------------------------------- 5 --
int deinit() // Спец. функция deinit()
{
ObjectDelete("Obj_Reg_Ch"); // Удаление объекта
return; // Выход из deinit()
}
//--------------------------------------------------------------- 6 --
int Create() // Пользовательская функция..
{ // ..создания объекта
datetime T1=Time[Len_Cn-1]; // Определение 1 коорд времени
datetime T2=Time[0]; // Определение 2 коорд времени
ObjectCreate("Obj_Reg_Ch",OBJ_REGRESSION,0,T1,0,T2,0);// Создание
ObjectSet( "Obj_Reg_Ch", OBJPROP_COLOR, Col_Cn); // Цвет
ObjectSet( "Obj_Reg_Ch", OBJPROP_RAY, false); // Луч
ObjectSet( "Obj_Reg_Ch", OBJPROP_STYLE, STYLE_DASH);// Стиль
ObjectSetText("Obj_Reg_Ch","Создан экспертом moveobjects",10);
WindowRedraw(); // Перерисовка изображения
}
//--------------------------------------------------------------- 7 --

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

   datetime T1 = Time[Len_Cn-1];       // Определение 1 коорд времени
datetime T2 = Time[0]; // Определение 2 коорд времени

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

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

   ObjectSetText("Obj_Reg_Ch","Создан экспертом moveobjects",10);

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


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

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

   WindowRedraw();                     // Перерисовка изображения

Функция WindowRedraw()

void WindowRedraw()

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

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

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

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

   T2=ObjectGet("Obj_Reg_Ch",OBJPROP_TIME2);     // Запрос коорд. t2
Error=GetLastError(); // Получение кода ошибки

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

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

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

   ObjectMove("Obj_Reg_Ch", 0, Time[Len_Cn-1],0); //Новая коорд. t1
ObjectMove("Obj_Reg_Ch", 1, Time[0], 0); //Новая коорд. t2

Здесь объекту с именем 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 Software Corp. или к разделу "Справка" в редакторе MetaEditor.