Справочник MQL4 Программы MQL4 Выполнение программ
Выполнение программКаждый скрипт и каждый эксперт работает в собственном отдельном потоке. Все индикаторы работают в одном интерфейсном потоке терминала. Обработка тиков и синхронизация истории также производится в интерфейсном потоке. Если пользовательский индикатор вызван при помощи функции iCustom(), то этот индикатор работает в потоке вызвавшей его программы. Библиотечные (импортируемые) функции также работают в потоке вызывающей программы. При запуске эксперта ему необходимо обеспечить актуальное торговое окружение, доступность истории по данному символу и периоду, а также произвести синхронизацию между терминалом и сервером. На эти процедуры терминал предоставляет эксперту отсрочку запуска не более чем в 5 секунд, по истечении которых эксперт будет запущен с теми данными, что удалось подготовить. Поэтому при отсутствии связи с сервером это может привести к задержке запуска эксперта. Краткая сводка по программам на MQL4 приведена в таблице:
Сразу после присоединения программы к графику производится ее загрузка в память клиентского терминала и инициализация глобальных переменных. Если какая-либо глобальная переменная типа класса имеет конструктор, то этот конструктор будет вызван в процессе инициализации глобальных переменных. После этого программа находится в состоянии ожидания события от клиентского терминала. У каждой mql4-программы должна быть хотя бы одна функция-обработчик события, в противном случае загруженная программа выполняться не будет. Функции-обработчики событий имеют предопределенные имена, предопределенные наборы параметров и предопределенные типы возврата.
Клиентский терминал отсылает возникающие события в соответствующие открытые графики. Также события могут генерироваться графиками (события графика) либо mql4-программами (пользовательские события). Генерацию событий создания и удаления графических объектов на графике можно включать и отключать заданием свойств графика CHART_EVENT_OBJECT_CREATE и CHART_EVENT_OBJECT_DELETE. Каждая mql4-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события. Программа получает события только от графика, на котором она запущена. Все события обрабатываются одно за другим в порядке поступления. Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql4-программы не ставится. Аналогично, если в очереди mql4-программы уже находится событие ChartEvent или такое событие обрабатывается, то новое событие такого типа не ставится в очередь. Обработка событий таймера производится по такой же схеме – если в очереди находится или уже обрабатывается событие Timer, то новое событие таймера не ставится в очередь. Очереди событий имеют ограниченный, но достаточный размер, поэтому переполнение очереди для корректно написанной программы маловероятно. При переполнении очереди новые события отбрасываются без постановки в очередь. Крайне не рекомендуется использовать бесконечные циклы для обработки событий. Исключением из этого правила могут быть только скрипты, которые обрабатывают одно единственное событие Start. Библиотеки не обрабатывают никаких событий.
Запрет на использование функций в индикаторах и экспертахИндикаторы, скрипты и эксперты являются исполняемыми программами на MQL4 и предназначены для различных типов задач. Поэтому существует ограничение на использование определенных функций в зависимости от типа программы. В индикаторах запрещены следующие функции:
В свою очередь, в экспертах и скриптах запрещены все функции, предназначенные для индикаторов: Библиотека не является самостоятельной программой и выполняется в контексте вызвавшей её MQL4-программы: скрипт, индикатор или эксперт. Соответственно, на вызванную библиотеку распространяются указанные выше ограничения.
Загрузка и выгрузка индикаторовИндикаторы загружаются в следующих случаях:
Индикаторы выгружаются в следующих случаях:
Загрузка и выгрузка экспертовЗагрузка эксперта производится в следующих случаях:
Выгрузка эксперта, прикрепленного к графику, производится в следующих случаях:
При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются. Для лучшего понимания работы эксперта рекомендуется скомпилировать код приведенного в примере эксперта и произвести действия по загрузке/выгрузке экспертов, смене шаблона, символа, таймфрейма и так далее: Пример:
Загрузка и выгрузка скриптовСкрипты загружаются сразу после прикрепления к графику и выгружаются сразу после окончания своей работы. При выгрузке программы (удалении программы с графика) происходит деинициализация глобальных переменных и уничтожение очереди сообщений. В этом случае деинициализация означает освобождение переменных типа string, освобождение объектов динамических массивов и вызов деструкторов при их наличии. Скрипты загружаются сразу после прикрепления к графику и выгружаются сразу после окончания своей работы.
Входные параметры и компиляция исходного кода программЕсли исходный код запущенной на графике программы будет успешно перекомпилирован, то старая ее версия будет выгружена с графика, а вместо нее будет загружена новая скомпилированная копия. В случае если после перекомпиляции состав входных параметров не изменился, будут применены те значения параметров, которые были до этого установлены. Если же состав параметров изменился, будут применены значения по умолчанию. Состав входных параметров программы считается измененным при правке исходного кода в следующих случаях:
Изменение значения по умолчанию любого из параметров не считается изменением состава входных параметров. Состав входных параметров однозначно идентифицирует программу в исполнительной системе терминала, и при неизменности этого состава новые версии исполняемого файла считаются сохранившими всю логику и функциональность уже запущенной программы. В случае изменения состава входных параметров терминал воспримет новый исполняемый файл как несовместимый по функционалу с ранее запущенной на графике программой. Поэтому новая перекомпилированная программа будет загружена с набором входных параметров со значениями по умолчанию. В остальных случаях (в том числе при изменении значения по умолчанию любого из параметров) после перекомпиляции будут применены предыдущие параметры, которые были использованы до перекомпиляции. При любой компиляции будет вызвана предопределенная функция OnInit(), назначение которой состоит в правильной инициализации всех глобальных и статических переменных программы. Именно в обработчике OnInit() необходимо правильным образом получать значения входных параметров программы. Смотри также События клиентского терминала, Функции обработки событий |