Русский

Учебник по MQL4  Программа на MQL4  Специальные функции

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


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

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