В прошлых уроках «Первые шаги по MQL», мы разобрались как работает терминал MetaTrader: что и где находится, как в терминале MT4 запускаются советники. Теперь можно переходить собственно к изучению языка MQL.
Давайте взглянем на типичную программу написанную на MQL4:
//+——————————————————————+
//| Tester.mq4 |
//| Copyright c 2010. |
//| http://strategy4you.ru |
//+——————————————————————+
#property copyright «Copyright c 2010.»
#property link «http://strategy4you.ru»
//+——————————————————————+
int init() {return(0);}
//+——————————————————————+
int deinit() {return(0);}
//+——————————————————————+
int start() {return(0);}
//+——————————————————————+
Как видно из примера, программа представляет собой обычный текст состоящий из ключевых слов. Давайте разберемся что они означают:
Давайте удалим комментарии и посмотрим что получиться:
#property copyright «Copyright c 2010.»
#property link «http://strategy4you.ru»
int init() {return(0);}
int deinit() {return(0);}
int start() {return(0);}
У нас осталось всего 5 строк. Что же еще можно удалить из программы, написанной на MQL, не нарушая ее работоспособности?
У каждой MQL4 программы можно указать дополнительные специфические параметры #property, которые помогают клиентскому терминалу Metatrader 4 правильно обслуживать программы без необходимости их явного запуска.
Идентификатор
| Тип
| Описание
|
link | string | ссылка на сайт компании-производителя |
copyright | string | название компании-производителя |
stacksize | int | размер стека для рекурсивных вызовов |
library | библиотека; не назначается никакой стартовой функции, не удаляются функции, которые не вызываются из других функций | |
indicator_chart_window | void | выводить индикатор в окно графика |
indicator_separate_window | void | выводить индикатор в отдельное окно |
indicator_buffers | int | количество буферов для расчета индикатора, максимум до 8 |
indicator_minimum | double | нижнее ограничение шкалы отдельного окна индикатора |
indicator_maximum | double | верхнее ограничение шкалы отдельного окна индикатора |
indicator_colorN | color | цвет для вывода линии N, где N от 1 до 8 |
indicator_widthN | int | толщина линии N, где N от 1 до 8 |
indicator_styleN | int | стиль линии N, где N от 1 до 8 |
indicator_levelN | double | горизонтальный уровень N в отдельном окне индикатора, где N от 1 до 8 |
indicator_levelcolor | color | цвет горизонтальных уровней индикатора |
indicator_levelwidth | int | толщина горизонтальных уровней индикатора |
indicator_levelstyle | int | стиль горизонтальных уровней индикатора |
show_confirm | void | выводить окно подтверждения перед запуском скрипта |
show_inputs | void | выводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения |
Как видно из таблички, в нашей программе указаны необязательные параметры «ссылка на сайт» и «название компании-производителя». Удалим и их из нашей программы:
int init() {return(0);}
int deinit() {return(0);}
int start() {return(0);}
Осталось всего 3 строчки. Можно ли еще упростить?
В MQL4 существуют 3 функции с предопределенными именами:
init() — функция, вызывающаяся в процессе инициализации модуля. В случае ее отсутствия при инициализации не вызывается никакой функции.
start() — основная функция. У экспертов вызывается после прихода очередного тика. У пользовательских индикаторов вызывается при пересчете после прикрепления индикатора к графику, при открытии клиентского терминала (если индикатор прикреплен к графику), а также после прихода очередного тика. У скриптов выполняется сразу после прикрепления к графику и выполнения инициализации. В случае отсутствия в модуле функции start() этот модуль (эксперт, скрипт или пользовательский индикатор) не может быть запущен.
deinit() — функция, вызывающаяся в процессе деинициализации модуля. В случае ее отсутствия при деинициализации не вызывается никакой функции.
Как видно из описания функции init() и deinit() можно тоже опустить при написании. Удалим их из нашей программы:
int start() {return(0);}
Осталась всего 1 строка. Это описание функции start() которую будет вызывать терминал MT4. Если откомпилировать данную программу — не будет никаких ошибок.
А можно ли еще сократить программу? Да можно. Можно убрать оператор return.
Получим:
int start() {}
При компиляции опять не будет ошибок. Но больше сокращать нечего.
Вот мы и получили минимально возможную программу на языке MQL4.
Когда советник мультивалютный, а тем более на нескольких ТФ работает (а ещё может быть несколько версий одного советника стоять) — тогда комментарии очень важны, а то замучаешься определять на каком Тф сделка открыта.
Очень полезная статья, спасибо!
Супер блог!
Хочу создать свой советник. Есть идейка для форекс-а.
Очень прошу скинуть книжечку с инфой как это сделать.
Заранее благодарен, и кстати, пока-что прочту полнлстью блог, может поможет 😀
Сайт просто крутняк-крутняцкий. Уже добавил в bookmark