Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Названия цветов 5 страница




Правило программирования на языке MQL4 состоит в следующем:

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

Это значит, что программные строки (операторы и обращения к функциям), находящиеся за пределами функций, не могут быть исполнены. При попытке компиляции такой программы редактор MetaEditor выдаст соответствующее сообщение об ошибке, и исполняемый файл *.ехе в результате компиляции получен не будет.

 

Рассмотрим функциональную схему обычной прикладной программы-эксперта:


Рис. 31. Функциональная схема программы (эксперта).

 

Наиболее крупными функциональными блоками составленной на MQL4 программы являются:

1. Головная часть программы.

2. Специальная функция init().

3. Специальная функция start().

4. Специальная функция deinit().

5. Пользовательские функции.

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

Информационная среда клиентского терминала МТ4

 

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

Структура программы

 

Головная часть

 

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

Специальные функции

 

Обычно после головной части следует описание специальных функций. Внешне описание специальной функции выглядят так же, как и описание обычной пользовательской функции, с той разницей, что специальные функции имеют предопределённые имена - init(), start() и deinit(). Специальные функции представляют собой собственно блок вычислений и находятся во взаимоотношениях с информационной средой клиентского терминала и пользовательскими функциями. Специальные функции подробно рассматриваются в разделе Специальные функции.

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

 

Описания пользовательских функций обычно располагаются непосредственно после описания специальных функций. Количество пользовательских функций в программе не ограничено. На схеме представлены всего две пользовательские функции, в то время как в программе их может быть 10 или 500, или ни одной. Если в программе не применяются пользовательские функции, значит программа будет иметь упрощённый вид: головную часть и описания специальных функций.

Стандартные функции

 

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

Порядок расположения в программе

 

Головная часть программы должна находиться в первых строках. Порядок расположения в программе описаний специальных и пользовательских функций не имеет значения. На рис. 32 представлена обычная последовательность функциональных блоков, а именно - головная часть, специальные функции, пользовательские функции. На рис. 33 представлены другие варианты структуры программы. Во всех примерах головная часть находится вверху, в то время как в отношении описаний функций допускается произвольный порядок.


Рис. 32. Обычный порядок расположения функциональных блоков в программе (рекомендуется).


Рис. 33. Возможные варианты расположения функциональных блоков в программе (произвольный порядок).

Особо нужно отметить:

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

Ниже представлены примеры неправильно расположенного описания функции.


Рис. 34. Примеры неправильного расположения описаний функций в программе.

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

 

Последовательность исполнения кода в программе

 

Головная часть и специальные функции

 

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

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

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

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

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

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

Исполняющиеся специальные функции могут обращаться к информационному окружению (тонкие синие стрелки на схеме) и вызывать для исполнения пользовательские функции (тонкие жёлтые стрелки). Обратите внимание на то, что специальные функции выполняются в результате их вызова клиентским терминалом в порядке, предопределённом в свойствах этих функций: сначала init(), потом (многократно) start() и потом deinit(). Условия, при которых клиентский терминал вызывает специальные функции, описаны в разделе Специальные функции.

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

 

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

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

Если в программе имеется описание пользовательской функции, но нигде не встречается вызов её на исполнение, то такая пользовательская функция будет исключена из готовой программы на этапе компиляции и в процессе работы программы использоваться не будет.

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

Специальные функции

 

Отличительной особенностью программ, предназначенных для работы в клиентском терминале MetaTrader 4, является их работа с постоянно обновляющейся информацией в режиме реального времени. В языке MQL4 эта особенность нашла своё отражение в виде трёх специальных функций: init(), start() и deinit().

Специальные функции - это функции с предопределёнными именами init(), start() и deinit(), обладающие специальными собственными свойствами.

 

Свойства специальных функций

 

Общее свойство специальных функций

 

Главным свойством всех специальных функций является их исполнение в программе при определённых условиях без использования вызова специальной функции из программы. Специальные функции вызываются для исполнения клиентским терминалом. Если в программе есть описание специальной функции, то она будет вызвана (и исполнена) в соответствии с условиями вызова (собственными свойствами).

Специальные функции вызываются для исполнения клиентским терминалом.

Собственные свойства специальных функций

 

Специальная функция init().

 

Собственным свойством специальной функции init() является её исполнение при запуске (инициализации) программы. Если в программе есть описание специальной функции init(), то она будет вызвана (и исполнена) в момент запуска программы. Если в программе нет специальной функции init(), то при запуске программы не выполняется никаких действий.

В экспертах специальная функция init() вызывается (и исполняется) также сразу после старта клиентского терминала и подгрузки исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта и после смены счёта.

В скриптах специальная функция init() вызывается (и исполняется) сразу после прикрепления к графику финансового инструмента.

В пользовательских индикаторах специальная функция init() вызывается (и исполняется) сразу после старта клиентского терминала, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor и после смены входных параметров из окна настройки пользовательского индикатора.

 

Специальная функция start().

 

Собственные свойства специальной функции start() отличаются в зависимости от вида исполняемой программы.

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

На возможность вызова и исполнения специальной функции start() влияет состояние кнопки "Разрешить/запретить советников". Если указанная кнопка находится в состоянии запрета, то клиентский терминал не будет вызывать для исполнения специальную функцию start() вне зависимости от поступления новых котировок. Вместе с тем, перевод этой кнопки из разрешающего состояния в состояние запрета не прерывает текущий сеанс работы специальной функции start().

Специальная функция start() не вызывается клиентским терминалом на выполнение при открытом окне свойств эксперта. Окно свойств эксперта может быть открыто для внесения изменений только в период, когда специальная функция start() находится в состоянии ожидания нового тика. Это окно не может быть открыто в момент текущего сеанса выполнения специальной функции start() эксперта.

В скриптах специальная функция start() вызывается (и исполняется) один раз сразу после выполнения инициализации программы в специальной функции init().

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

 

Прекращение текущего сеанса выполнения специальной функции start() для программ всех видов может осуществляться по причине отсоединения программы от графика, смены финансового инструмента и/или периода графика, смены счета, закрытия графика, а также в результате завершения работы клиентского терминала. Если специальная функция start() выполнялась в момент команды на завершение работы, то время, отпущенное терминалом для завершения исполнения функции составляет 2,5 секунды. Если после поступления команды на завершение работы специальная функция start() продолжит работу более указанного лимита времени, то она будет принудительно остановлена клиентским терминалом.

 

Специальная функция deinit().

 

Собственным свойством специальной функции deinit() является её исполнение при закрытии (деинициализации) программы. Если в программе есть описание специальной функции deinit(), то она будет вызвана (и исполнена) в момент закрытия программы. Если в программе нет специальной функции deinit(), то при закрытии программы не выполняется никаких действий.

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

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

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

Время исполнения специальной функции deinit() ограничено периодом 2,5 секунды. В случае, если код, заложенный в специальную функцию deinit(), выполняется дольше указанного времени, то клиентский терминал принудительно завершит работу специальной функции deinit() и программы в целом.

 

Требования к специальным функциям

 

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

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

Специальные функции init() и deinit() должны по возможности максимально быстро завершать свою работу и ни в коем случае не зацикливаться в попытке начать полноценную работу раньше вызова функции start().

 

Порядок использования специальных функций

 

Разработчики предоставили в распоряжение программистов очень удобный механизм: при включении программы в работу прежде всего исполняется init(), после этого вся основная работа (так долго по времени, сколько нужно пользователю) осуществляется с помощью функции start(), а когда пользователь завершил работу программы, то ненадолго перед выгрузкой программы будет запущена функция deinit().

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

В случае, если программист не предполагает использовать какую-то из специальных функций, то он может отказаться от её применения в программе. В этом случае клиентский терминал её вызывать не будет. Абсолютно нормальной следует считать программу, содержащую все три специальные функции. Нормальной также можно считать программу, в которой отсутствуют функции init() или deinit() или одновременно обе эти функции.

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

Нежелательно из специальной функции init() вызывать специальную функцию start() или совершать торговые операции, так как в момент инициализации модуля могут быть не готовы значения параметров информационного окружения (данные графиков, рыночные цены и пр.).

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

Выполнение программы

 

Развитие навыков программирования происходит лучше всего, если в распоряжении программиста есть небольшая работающая программа. Для того, чтобы она стала в полной мере понятной, необходимо внимательно рассмотреть все её составляющие и по шагам проследить как она работает. Обратите внимание, свойства специальных функций прикладных программ разных видов (эксперт, скрипт, индикатор) имеют отличия. Здесь мы рассмотрим как работает простой эксперт.

Пример простого эксперта (simple.mq4)

//--------------------------------------------------------------------

// simple.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

int Count=0; // Глобальная перемен.

//--------------------------------------------------------------------

int init() // Спец. ф-ия init()

{

Alert ("Сработала ф-ия init() при запуске"); // Сообщение

return; // Выход из init()

}

//--------------------------------------------------------------------

int start() // Спец. ф-ия start()

{

double Price = Bid; // Локальная перемен.

Count++; // Счётчик тиков

Alert("Новый тик ",Count," Цена = ",Price);// Сообщение

return; // Выход из start()

}

//--------------------------------------------------------------------

int deinit() // Спец. ф-ия deinit()

{

Alert ("Сработала ф-ия deinit() при выгрузке"); // Сообщение

return; // Выход из deinit()

}

//--------------------------------------------------------------------

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

1. В момент присоединения программы к окну финансового инструмента клиентский терминал передаст управление программе, в результате чего программа начнёт исполняться. Исполнение программы начнётся с головной части. В головной части программы указана всего одна строка:

int Count=0; // Глобальная перемен.

В этой строке объявлена глобальная переменная Count, инициализированная нулевым значением. (Локальные и глобальные переменные подробно рассматриваются в Виды переменных. Здесь только нужно отметить, что алгоритм, используемый в этой конкретной программе, предполагает обязательное объявление переменной Count как глобальной, поэтому она не может быть объявлена внутри какой-либо функции, а должна быть объявлена за пределами описаний функций, т.е. в головной части; в результате этого значение глобальной переменной Count будет доступно из любого места программы.)

2. После исполнения головной части программы будет запущена на исполнение специальная функция init(). Обратите внимание, вызов этой функции на исполнение нигде в коде программы не содержится. Запуск на исполнение специальной функции init() эксперта в момент присоединения программы к окну финансового инструмента является собственным свойством этой функции. Клиентский терминал вызовет на исполнение специальную функцию init() просто потому, что в коде программы имеется её описание. В рассматриваемой программе описание специальной функции init() такое:

int init() // Спец. ф-ия init()

{

Alert ("Сработала ф-ия init() при запуске"); // Сообщение

return; // Выход из init()

}

В теле функции содержится всего два оператора.

2.1 Функция Alert() выводит окно сообщения:

Сработала ф-ия init() при запуске

2.2 Оператор return заканчивает работу специальной функции init()

В результате исполнения функции init() будет напечатано сообщение. В реально используемых программах такой алгоритм встречается редко, потому что от такого применения init() мало пользы. В самом деле, нет никакого смысла использовать функцию, которая просто уведомляет трейдера о том, что она исполняется. Здесь этот алгоритм применён лишь для того, чтобы проиллюстрировать факт исполнения специальной функции init(). Обратите внимание: специальная функция init() будет исполнена в программе всего один раз. Исполнение указанной функции произойдёт в начале работы программы, сразу после обработки головной части. В момент, когда в специальной функции init() исполнится оператор return, программа передаст управление клиентскому терминалу.

3. Клиентский терминал обнаружил в программе описание специальной функции start():

int start() // Спец. ф-ия start()

{

double Price = Bid; // Локальная перемен.

Count++;

Alert("Новый тик ",Count," Цена = ",Price);// Сообщение

return; // Выход из start()

}

31. Управление удерживается клиентским терминалом. Клиентский терминал ждёт новый тик и до прихода нового тика не запускает на исполнение ни одну из функций программы. Это значит, что некоторое время программа не работает, т.е. в программе не производится никаких действий. Возникает пауза, хотя нигде в программе нет прямого или косвенного указания на выполнение этой паузы. Необходимость ожидания тика является собственным свойством специальной функции strart() эксперта, и не существует возможности программно повлиять на это свойство (например, отключить). Программа будет находиться в ожидании управления до тех пор, пока не придёт новый тик. В момент прихода тика клиентский терминал передаст управление программе, а именно специальной функции start() (в данном случае в соответствии со свойством функции start() эксперта), в результате чего начнётся её исполнение.

32 (1). В строке

double Price = Bid; // Локальная переменная

производятся следующие действия:

32.1(1). Объявление локальной переменной Price (см. Виды переменных). Значение этой локальной переменной будет доступно из любого места специальной функции start().

32.2(1). Выполнение оператора присваивания. Переменной Price будет присвоено значение текущей цены Bid. Новое значение цены появляется всякий раз с приходом очередного тика (например, на первом тике цена финансового инструмента может оказаться равной 1.2744).

33(1). Далее будет выполняться строка:

Count++;

Эта, несколько непривычная, запись является полным аналогом записи Count=Count+1;

На момент, когда управление передаётся в эту строку, значение переменной Count равно нулю. В результате выполнения оператора Count++ значение Count будет увеличено на единицу. Таким образом, к моменту передачи управления в следующую строку, значение Count будет равно 1.




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


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


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



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




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