Трейдер трейдеру – друг, брат и запасная торговая система.
Джон Спарк.
Джон Спарк.
Пора приступать к практике. В прошлый раз я обещала, что мы вместе построим простенького робота. На самом деле «простенько» не получилось, потому что хотелось показать вам торгующего робота, чтобы он открывал и закрывал ордера. Простенькая программа из трех строк могла бы, например, посчитать разницу между ценами покупки и продажи и вывести полученное значение на экран. На мой взгляд, этого мало, чтобы научиться делать советников.
Для нашего с вами робота я взяла RSI (3) и уровни 25 и 70. При пересечении линией индикатора уровня 25 снизу вверх открывается позиция вверх. При пересечении уровня 70 сверху вниз открывается позиция вниз. Закрытие длинной позиции на максимуме индикатора выше уровня 70, закрытие короткой позиции на минимуме индикатора ниже уровня 25. Естественно, я не говорю, что это прибыльная ТС. Нам сейчас это не важно. Мы даже тренд определять не будем.
Напишем также робота так, что он будет торговать на том интервале, который будет установлен на листе, где мы его запустим, то есть конкретизировать тайм-фрейм не будем. Учитывайте при этом, что если захочется на выбранном листе сменить размерность отображения цены, например, перейти с М5 на М30, то робот воспримет новые данные, и будет работать по ним. Так что если вы привыкли отслеживать тенденции, переключаясь во время анализа на разные масштабы, придется заводить привычку – каждому нужному таймфрейму свой лист.
Как я и советовала в прошлой статье, сначала желательно нарисовать схему того, что будем делать. При этом помним, что робот похож на новорожденного ребенка – все нужно объяснять с нуля. Видели, как грудничка носят по комнате, привлекают его внимание к разным предметам и называют их: «уточка», «цветочек» и т. д.? Если ребенку никогда не покажут уточку и цветочек, в его мире таких понятий не будет. Тут точно также. При этом ваше право назвать стул сапогом, а сапог столом. Как назовете переменные, с которыми он будет работать, так он и будет их использовать.
Попробуйте сначала сами начертить схему описанной системы. Посмотрите на указанную ТС глазами робота. И сразу привыкаем оперировать теми понятиями, что заложены в MQL4. Текущий период отображается как 0, предыдущая свеча 1, свеча до нее 2 и т. д. В учебнике по MQL4, который легко и бесплатно можно скачать в Интернете, приведены таблицы указанных обозначений.
Моя схема отображена на рисунке 1.
Рисунок 1.
В языке MQL4 есть константы и переменные. Константы – это все, что не меняется в процессе работы робота. Например, в нашей схеме, константами являются значения уровней RSI 70 и 25. Чтобы ни произошло на рынке, эти значения не изменятся, пока мы сами не внесем вместо них другие.
Мы в основном дело будем иметь с переменными. В рассматриваемого нами робота я ввела такую переменную, как flag (имя могло быть любым, хоть тапочек). Так у меня называется условие, которое должен проверить робот.
Мы видим, что в конце схемы слева, после открытия позиции, значение переменной flag меняется с 0 на 1. Соответственно, когда со следующим тиком робот обнаружит значение переменной 1, он уже будет работать по правой стороне алгоритма.
Каждая переменная должна иметь имя, написанное слева от знака «=». Название достаточно дать один раз. При этом для MQL4 имеет значение как это имя написано. То есть я могу задать четыре разных переменных и назвать их «Flag», «flag», «FLAG», «fLaG» . Для робота – это разные названия.
Те, кто внимателен, думаю, заметили, что в указанной схеме лишь половина ТС. Схема открытия вuy и закрытие sell будет аналогична. Только вместо уровня 70 мы будем ориентировать советника на порог 25, а минимум будем описывать как 3>2<1.
Также, прежде чем переведем нашу схему ТС в робота, нужно разобрать еще типы данных. Они указываются в начале советника и этап этот опускать нельзя.
Итак, в работе мы сталкиваемся с такими величинами, которые нельзя разделить на части ни при каких условиях. Например, ордеров может быть 1, 2, 3, но не 1,5, 2,635 и 3,06 ордера. Этот тип данных называется int. Речь идет, как вы понимаете, о целых числах.
Далее. Число, которым, например, отображается цена открытия на форексе, является типом данных double, то есть имеет целое число в начале и числа после запятой (действительные числа). Также, если мы будем вычислять среднее значение из данных типа int, получим тип double. Например, среднее число пунктов прибыли, получаемое в среднем за каждую сделку в месяце. Сделок за месяц мы можем совершить 1, 13, 20, 10 027 – это целые числа типа int. За месяц мы получили, например 10 000 пунктов. Это тоже int. Но 10 000/13 = 769,23 тип данных double. Даже если при делении 10000/20 получится целое с математической точки зрения число, у нас это 500, полученное значение все равно остается типом данных double.
Это важно понимать, так как, если мы не правильно укажем тип данных, робот не скомпилируется. Поэтому продолжаем. Типов данных 6. Правда, подробно все 6 мы рассматривать не будем. В учебнике почитаете. Это интересно. На некоторые вещи в компьютере раскрываются глаза (говорю как обычный user).
Есть тип данных bool. Это логический тип данных, который может иметь лишь две вариации: правда (true) или ложь (false). «Правду» также можно отобразить единицей, «ложь» нулем. Например, у нас открыт ордер. Пришло время его закрыть. Если он закрылся, это true. Пойдет один алгоритм заложенных действий, например, обнуление нашего флага. Если ордер не закрылся, то это false. И мы на этот случай заложим, например, вывод окна алерта (предупреждения) на экран с кодом ошибки. То есть этим типом данных мы учим нашего робота распознавать, что для нас правильно, а что нет.
Несмотря на то, что мы пытаемся в МТС все изложить математическим языком, все-таки рабочая среда робота – это не только математика. Нам может понадобиться строковый тип данных, который называется string. Пример этого типа данных – название валюты.
Еще два типа: colour, значением которых является цвет, и datetime, значение которых дата и время. Например, с помощью datetime велим советнику работать с 8 GMT до 17 GMT. Или еще круче: можно отслеживать время новостей и, например, поджимать стоп-лосс на это время либо использовать другой алгоритм открытия и закрытия ордеров.
Теперь мы почти готовы начать писать робота. Нужно только понять, что и куда в шаблоне Метаэдитора мы вставляем.
В прошлой статье я упоминала, что шаблон состоит из трех частей. В первой части мы задаем все константы, переменные, их тип данных. Эта часть называется init.
Вторая часть start. Здесь мы пишем те условия, отслеживая которые робот будет торговать. То есть это основная часть, тело советника.
Третья часть deinit. Здесь указывается, что робот должен сделать после выполнения всех основных действий (закрыть все внешние файлы, к которым обращался, обнулить внешние переменные и т.п.) Это равносильно тому, как если бы мы требовали от своих детей убирать со стола учебники после того, как они закончили делать уроки. Этой части может не быть. У нас ее и не будет J
Интересно, что start и deinit можно поменять местами. Робот не запутается. А вот если часть init лишить ее первого места, то программа не скомпилируется. Нельзя заставить кого-либо читать, не показав алфавита и не рассказав основных правил чтения и произношения.
Необходимый минимум, нужный для написания первого робота, мы с вами разобрали. Можно, наконец-то открывать Metaeditor.
Правда, по законам жанра, когда начинается самое интересное, показывают либо рекламную паузу, либо вообще
To be continued… J Чем я хуже Спилберга?
Автор статьи: Евгения Мацина, специально для Русского Трейдера
(с) www.russian-trader.ru
Аннотация:
Продолжение цикла статей о создании торгового робота на Форексе с помощью Метатрейдера. Часть 2.