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

Для того, чтобы программа, написанная на языке MQL4 могла работать, прежде всего она должна быть откомпилирована (кнопка «Компилировать» или клавиша F5). Процесс компиляции должен пройти без ошибок (допускаются предупреждения, их необходимо анализировать). При этом в соответствующем каталоге, terminal_dir\experts, terminal_dir\experts\indicators или terminal_dir\experts\scripts, должен быть создан выполняемый файл с тем же именем и расширением EX4. Именно этот файл может быть запущен на выполнение.

Торговые советники, индикаторы и скрипты прикрепляются к одному из открытых графиков путем перетаскивания мышью из окна «Навигатор» клиентского терминала на соответствующий график (технология Drag’n’Drop). MQL4-программы могут работать только при включенном клиентском терминале.

Для того, чтобы эксперт прекратил работать, его необходимо удалить с графика при помощи выбора «Советники — Удалить» из контекстного меню графика. На работу советника также влияет состояние кнопки «Разрешить/запретить советников». Для завершения работы пользовательского индикатора его необходимо удалить с графика при помощи контекстного меню «Список индикаторов-Удалить».

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

На одном графике могут работать максимум по одному эксперту и скрипту и неограниченное количество индикаторов

Запуск программы на выполнение

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

Каждая присоединенная к графику программа завершает работу функцией OnDeinit(). Функция OnDeinit() запускается также при завершении работы клиентского терминала, при закрытии графика, непосредственно перед сменой финансового инструмента и/или периода графика, при удачной перекомпиляции программы, при смене входных параметров, а также при смене счета. Причину деинициализации можно получить, используя функцию UninitializeReason() при выполнении функции OnDeinit(). Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно. Исключение составляют скрипты, которые как правило, самостоятельно завершают свою работу без команды извне. Если же скрипт работает долго (например, по причине бесконечного цикла), то его можно завершить командой извне (при удалении скрипта из контекстного меню графика, при присоединении к графику нового скрипта, при закрытии графика, при смене финансового инструмента и/или периода графика). В этом случае OnDeinit() также ограничивается 2.5 секундами.

При поступлении новых котировок выполняется функция OnTick() у присоединенных советников и пользовательских индикаторов. Если при поступлении новой котировки выполнялась функция OnTick(), запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником. Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции OnTick(). После этого функция OnTick() будет запущена только после прихода очередной новой котировки. У пользовательских индикаторов функция OnTick() запускается для пересчета также после смены символа или периода текущего графика вне зависимости от поступления новых котировок. Функция OnTick() не запускается при включенном запрете использования советников (кнопка «Разрешить/запретить советников»). Однако запрещение работы советников путем нажатия на указанную кнопку не прерывает текущее выполнение функции OnTick(). Функция OnTick() не запускается на выполнение при открытом окне свойств советника. Окно свойств не может быть открыто в момент выполнения советника.

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

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