понедельник, 23 февраля 2015 г.

Строим простейшего торгового робота

Всем привет! Думаю, достаточно теории, давайте сегодня сделаем первого робота. Пока очень простого, просто оболочку, без внутренностей, для освоения среды разработки. А в другой раз добавим в него торговую логику.

Самый первый и самый простой робот на языке MQL

Открываем редактор кода

Чтобы из основного окна платформы Metatrader попасть в редактор программного кода просто жмем F4, ну или идем в меню “Сервис” и выбираем “Редактор MQL”:


Скрин 1


Создаем советника из шаблона

В редакторе клацаем “Создать”, открывается мастер:


Скрин 2


Оставляем выбор на первом пункте. Напомню, “роботы”, “советники”, “эксперты” - все это синонимы. В следующем окне задаем имя нашего робота. Я назвал его коротко, но емко - fake, ну в смысле пустышка :)
Кстати, что вы напишете в полях “Автор” и “Ссылка” не имеет никакого значения. Я их всегда просто стираю. Параметры тоже на этом этапе не задаю, позже в самом коде задам.
Итого, получилось:


Скрин 3


Жмем “Далее” до упора, по дороге никакие опции не устанавливаем, у нас ведь пока простейший случай. Жмем “Готово” и … я вас поздравляю, вы только что написали свой, возможно первый в жизни, советник! Ну не совсем сами написали, по сути вы просто открыли шаблон советника, но мы ведь никому об этом не расскажем. Сам написал и никаких гвоздей! ;)


Программный код, который вы увидите, может по началу смутить, но мы его сейчас упростим и быстренько освоим. Итак, после нажатия “Готово” вы видите следующий код:




Сенокос

Аж целых 36 строк. И это робот, который ровным счетом ничего не делает! :) У новичка могут разбежаться глаза, но ведь мы за простоту, поэтому берем косу, образно конечно, и смело “косим”, то есть удаляем, следующие строки:
  1. Все пустые строки.
  2. Все строки, начинающиеся с двойного слэша (две наклонные черты “//”).
    Это просто текстовый комментарий к коду, который вы можете добавлять в любых количествах и в любом месте программы. Очень полезная вещь, когда у вас сложный робот и “без поллитры не разберешься”. Но пока у нас простейший робот, обойдемся без комментариев.
  3. Все строки, начинающиеся с “#property”.


После “сенокоса” все резко упростилось. Даже с учетом того, что я оставил “для красоты” пару пустых строк, их все равно стало в 3 раза меньше:

Первая компиляция

Нажмите “Компилировать” или F7. Если “сенокос” был сделан аккуратно и вы не зацепили нужные строки, то после компиляции редактор скажет вам:


Скрин 4


Тут самое главное - отсутствие ошибок (“0 errors”). Это значит, что ваш код не содержит ни одной ошибки, и ваш робот только что превратился из набора текстовых строчек (файл fake.mq4) в настоящий исполняемый файл (fake.ex4). А где он собственно? Давайте найдем.


Идем в “Файл - Открыть” и проваливаемся в папку “Experts”. В фильтре файлов выбираем “All Files”, то есть отключаем фильтр:


Скрин 5


И вот теперь видим и исходный файл с расширением MQ4, и исполняемый EX4:


Скрин 6


Все, этот fake.ex4 можно запускать на исполнение, тестировать на истории и вообще делать с ним что захочется, вот только толку от этого ноль покуда мы не добавим в робота хоть какую-нибудь торговую логику. Но перед этим давайте еще раз взглянем на текущий код и обсудим что там сейчас есть и зачем оно нужно.


Как это работает?

Если пока мысленно скрыть строку “return(INIT_SUCCEEDED);” мы увидим 3 практически одинаковые конструкции вида:


название_функции()
{
}


Пока в нашем коде только 3 функции: OnInit, OnDeinit, OnTick.
В принципе, даже из названий можно догадаться для чего нужна каждая из них.


OnInit

Название функции происходит от слова “инициализация”. Эта функция срабатывает единожды в момент запуска робота на исполнение, она производит подготовительные действия для дальнейшей работы советника.


OnDeinit

Наверно по аналогии вы уже догадались, эта функция также выполняется единожды, но в момент выключения робота.


OnTick

Это самая важная для нас функция! Это функция-охотник, опять таки образно :)
Она как бы сидит в засаде и ждет каждый новый тик по валютной паре, на графике которой вы запустили на исполнение своего робота.
Как только терминал видит новый тик, то есть новые значения котировок валютной пары, функция OnTick выскакивает из засады и выполняет все те команды, которые расположены между ее фигурными скобками {...}.


Теперь вы понимаете, почему наш робот пока ничего не делает - ведь ни одной команды внутри функции OnTick пока нет.


Продолжаем упрощать

Хорошая новость! Очень часто функции OnInit и OnDeinit остаются пустыми, и нам они тоже пока не нужны. Удалять их не будем, пусть пока просто мозолят нам глаз. Но умозрительно их можно игнорировать, а все внимание нужно сконцентрировать на функции OnTick.


Итак, из исходных 36 строк достойными внимания оказались всего три! Да и их на самом деле можно записать в одну:


void OnTick() {}


Не верите? Сделайте так и нажмите “Компилировать” еще раз. Опять получите “0 errors”.


Вот и вся премудрость. В следующий раз будем добавлять нашему роботу “мозги”, научим его анализировать рынок, принимать и исполнять торговые решения.


Счастливо!


С уважением,

Игорь Шепелев

Комментариев нет:

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