Блог им. AlgoTrader1
Господа, всех приветствую. Продолжаем изучение mql4. В прошлый раз мы познакомились с «Мастером MQL4», а так же программами и файлами, которые в нём можно создавать и разобрались, чем они друг от друга отличаются и какие задачи выполняют.
Сегодня я расскажу о трёх основных функциях, которые у Вас будут в каждом советнике. Эти функции называются OnInit(), OnDeinit(), OnTick() и являются обработчиками событий: инициализация, деинициализация и новый тик.
Если Вы попробуете создать шаблон советника в «Мастере MQL4», Вам будет предложено добавить и другие имеющиеся обработчики событий, но перечисленные функции являются базовыми, о них Вас даже не будут спрашивать. После получения пустой заготовки для советника, эти 3 функции уже будут в исходнике, после чего Вы можете их наполнить программным кодом.
В этом посте разберёмся, что следует размещать в каждой из функций и когда каждая из них выполняется.
Функция OnInit() выполняется первой, когда торговый терминал посылает событие init (инициализация). А делает он это в следующих ситуациях: запуск советника на графике, смена торгового символа или таймфрейма, перекомпиляция советника в MetaEditor’e, если его копия установлена на графике, изменение входных параметров советника из окна его настроек, а так же при смене счёта.
Инициализация – это процесс подготовки советника к работе. Поэтому внутри функции OnInit() имеет смысл выполнить все проверки готовности к работе или сразу прекратить её, если условия не выполнены. Например, если в советнике используются индикаторы, их настройки должны быть заданы корректно. Например, указанный период индикатора может превышать количество доступных баров в истории и его значение не будет посчитано. В этом случае имеет смысл вывести соответствующее сообщение и закончить работу советника сразу же. Или может быть указано нулевое или отрицательное значение, что так же не корректно. Поэтому, если перед запуском советника требуются какие-то подготовительные работы, подготовка данных, проверка корректности ввода настроек, всё это нужно вынести в функцию OnInit().
Деинициализация – противоположный процесс. Если инициализация – это подготовка к работе, то деинициализация – это её завершение. Событие Deinit генерируется при завершении работы торгового терминала, при закрытии графика, перед сменой финансового инструмента или периода графика, при удачной перекомпиляции программы, при смене входных параметров советника или типа счёта. В общем, каждый раз когда работа советника прекращается, даже для того чтобы просто сменить параметры, финансовый инструмент или таймфрейм.
Функция OnDeinit() срабатывает, когда происходит событие Deinit. В ней необходимо высвободить память от объектов, которые требовались для работы советника, удалить следы его работы на графике, если он осуществлял вывод информации на график и производил какие-либо построения. Причём, на выполнение всех задач функции OnDeinit() выделяется не более 2,5 секунд, после чего программа будет выгружена с графика принудительно.
Ну и под конец рассмотрим событие NewTick и функцию, которая его обрабатывает OnTick(). Событие NewTick генерируется, когда по торговому инструменту поступает новая котировка. В этот момент начинает выполняться функция OnTick(). Именно в ней и необходимо прописывать весь аналитическо-торговый алгоритм советника, т.е. то, что отвечает за поиск торговых сигналов и реагирование на них в виде торговых операций. Если новые котировки приходят в процессе выполнения функции OnTick, они не прерывают её выполнение. Функция отработает весь свой алгоритм до конца, прежде чем будет готова срабатывать на новые тики. Если отключить возможность автоматической торговли (кнопкой «Разрешить/запретить Авто-торговлю»), то события NewTick не прекращают генерироваться. Запрет распространяется только на совершение советником торговых операций.
На сегодня у меня всё, кому лень читать, можно посмотреть видео-версию. Благодарю за внимание.