Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стохастический Осциллятор (Stochastic Oscillator). 7 страница




В качестве решения Задачи 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.

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

 

Обычно во время практической работы трейдер открывает в окне финансового инструмента несколько подокон, в которых отображаются индикаторы. Порядок вывода индикаторов не лимитирован - они могут располагаться в любой последовательности. Количество подокон в окне финансового инструмента не ограничено. Все подокна имеют свой номер. Основное окно, в котором отображается ценовой график, имеется всегда, его номер 0. Каждое из подокон индикаторов также имеют номер. Соблюдается простой порядок нумерации подокон - в порядке представления в окне финансового инструмента в направлении сверху вниз: подокно индикатора, ближайшее к основному, имеет номер 1, следующее нижнее имеет номер 2, следующее - номер 3 и т.д.


Рис. 140. Расположение подокон в окне финансового инструмента.

Количество подокон можно легко вычислить с помощью функции:

int WindowsTotal()

Функция возвращает количество подокон индикаторов на графике, включая главное окно графика. Максимальный номер (самого нижнего) окна всегда на 1 меньше, чем общее количество подокон (включая основное, с номером 0) в окне финансового инструмента. Если в ситуации, изображённой на Рис. 140, из любой прикладной программы вызвать для исполнения функцию WindowsTotal(), то возвращённое ею значение будет равно 3, в то время как максимальный номер (самого нижнего) подокна равен 2.

Указанный порядок нумерации окон сохраняется в случаях, если добавляется новое подокно индикатора или удаляется любое из имеющихся. В случае добавления нового окна, оно отображается ниже всех других подокон и получает соответствующий номер, на 1 больше, чем номер вышестоящего окна. Если же какое-либо из подокон удаляется из окна финансового инструмента, то все подокна, находящиеся ниже него, автоматически перенумеруются - номер каждого из них уменьшается на 1.

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

int WindowFind(string name)

Функция возвращает номер подокна графика, содержащего индикатор с указанным именем name, если он найден, иначе возвращается -1. Функция также возвращает -1, если пользовательский индикатор ищет сам себя в процессе инициализации init().

Параметры:

name - короткое имя индикатора.

 

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

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

Для решения задачи выберем индикаторы RSI и Momentum. Общий алгоритм построения эксперта сводится к следующему. В функции init() можно задать тексты, которые будут выводиться на экран в зависимости от показаний индикаторов, т.е. выполнить те вычисления, которые выполняются в программе один раз. В функции start() необходимо вычислить показания индикаторов, определить наличие необходимых подокон и их номера, а затем, в зависимости от ситуации, выдать то или иное сообщение в то или иное подокно. При исполнении функции deinit() необходимо удалить все графические объекты, созданные в процессе работы программы. Ниже представлен эксперт charts.mq4, управляющий графическими объектами в подокнах окна финансового инструмента.




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


Дата добавления: 2014-12-29; Просмотров: 437; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.