Урок №3 «Минимально возможная программа на MQL4»

В прошлых уроках «Первые шаги по 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 правильно обслуживать программы без необходимости их явного запуска.

#property идентификатор значение
 

Идентификатор

 

 

Тип

 

 

Описание

 

linkstringссылка на сайт компании-производителя
copyrightstringназвание компании-производителя
stacksizeintразмер стека для рекурсивных вызовов
libraryбиблиотека; не назначается никакой стартовой функции, не удаляются функции, которые не вызываются из других функций
indicator_chart_windowvoidвыводить индикатор в окно графика
indicator_separate_windowvoidвыводить индикатор в отдельное окно
indicator_buffersintколичество буферов для расчета индикатора, максимум до 8
indicator_minimumdoubleнижнее ограничение шкалы отдельного окна индикатора
indicator_maximumdoubleверхнее ограничение шкалы отдельного окна индикатора
indicator_colorNcolorцвет для вывода линии N, где N от 1 до 8
indicator_widthNintтолщина линии N, где N от 1 до 8
indicator_styleNintстиль линии N, где N от 1 до 8
indicator_levelNdoubleгоризонтальный уровень N в отдельном окне индикатора, где N от 1 до 8
indicator_levelcolorcolorцвет горизонтальных уровней индикатора
indicator_levelwidthintтолщина горизонтальных уровней индикатора
indicator_levelstyleintстиль горизонтальных уровней индикатора
show_confirmvoidвыводить окно подтверждения перед запуском скрипта
show_inputsvoidвыводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения

Как видно из таблички, в нашей программе указаны необязательные параметры «ссылка на сайт» и «название компании-производителя». Удалим и их из нашей программы:

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.

Похожие статьи:

2 комментария

  1. Когда советник мультивалютный, а тем более на нескольких ТФ работает (а ещё может быть несколько версий одного советника стоять) — тогда комментарии очень важны, а то замучаешься определять на каком Тф сделка открыта.
    Очень полезная статья, спасибо!

  2. Супер блог!
    Хочу создать свой советник. Есть идейка для форекс-а.
    Очень прошу скинуть книжечку с инфой как это сделать.
    Заранее благодарен, и кстати, пока-что прочту полнлстью блог, может поможет 😀

    Сайт просто крутняк-крутняцкий. Уже добавил в bookmark

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *