Строим МТС на Метатрейдере

  • Автор темы Автор темы FXWizard
  • Дата начала Дата начала

FXWizard

Гуру форума
Строим МТС на Метатрейдере

Начнем создавать своего робота. Обратимся к тому, как и где он «живет». Ближе к делу, то есть посмотрим рисунок 1.

attachment.php

Рисунок 1

Красная стрелка указывает, где из Метатрейдера можно вызвать поле Метаэдитора, то есть программу, где советник и пишется. Поскольку язык MQL4 специально создавался так, чтобы разобраться в нем мог любой человек, то и Метаэдитор открывается сразу с шаблона, который задает правильную структуру будущей программы. Впрочем, мы свободно можем там все стереть и написать по-своему, либо поменять местами вторую и третью части. Особого смысла, правда, в этом нет.

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

Когда робот создан и запущен в рабочем листе, это выглядит так, как показано на рисунке 1 в правом верхнем углу. При этом не важно, начерчены ли индикаторы, по которым он работает. Все равно с каждым тиком робот всю процедуру будет повторять с начала.

Поэтому нужно стараться писать логически оптимальную программу. То есть с одной стороны, мы должны в своей МТС учесть все нюансы использования индикаторов, которые взяли для работы, с другой стороны это нужно сделать без лишних этапов: если логика ведет к открытию позиции вверх, то условия на открытие вниз в этой же строке мы не прописываем. Создавая МТС, можно на первых порах логику программы рисовать в виде схемы на бумаге. И ничего не забудете и робота своего не запутаете.

Лучше сразу учиться все писать правильно, чтобы потом не ломать голову, почему же робот не скомпилировался.

Интересно также и то, что если в программе робота вы указали какую-то функцию, но не задали команду ее вызова (то есть не предусмотрели вариантов, при каких условиях она будет использована), то при компиляции эта часть кода просто будет удалена. Зачем козе баян, если она играть на нем не будет?

Поскольку робот работает с каждым тиком, то насколько быстро он успеет провести проверку условий очень важно. Он не Цезарь. 10 дел сразу не делает. Он педант без фантазии – пока с одним тиком всю процедуру не проведет, за следующий тик не возьмется.

Поэтому в коде программы не лишней будет команда RefreshRates(), которая позволяет добиться того, что робот работает со свежими данными.

Удобно то, что нам по-прежнему не надо знать, как выглядит формула индикатора. Большая их часть уже есть в Метатрейдере, и робот просто будет к ним обращаться.

Также важно понимать, что МТС загружается именно в Метатрейдер. То есть автоматическая торговля становится возможной только тогда, когда компьютер включен, Метатрейдер открыт и на рабочем листе загружен робот. Автозапуск робота какой-либо дополнительной программой здесь целенаправленно запрещен.

Вообще, для торговли в Метатрейдере можно создать три вида программ. Кроме МТС, можно написать скрипт (программу для какого-то разового действия, например, открытия позиции) либо пользовательский индикатор.

При этом если у Вас есть разные версии одной МТС (у меня, например, по GBP тестируются два робота, отличающиеся лишь по способу взятия прибыли), то на одном рабочем листе возможно открыть только одну версию. Если нужно запустить аналогичную программу по такому же инструменту, то клонируем лист. Если ту же торговую систему нужно применить, например, к евро, то в роботе нужно будет сделать соответствующие изменения там, где мы прописываем валюту, с которой советник должен работать.

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

Удобно также сделано и то, что, например, в пятницу, когда торговля уже закончена, можно просто выключить Метатрейдер. Когда в начале новой недели вы его откроете, все роботы так и останутся подключенными к тем листам, где были прикреплены ранее. То есть лишних телодвижений по загрузке МТС каждый вечер в воскресенье не нужно, если только вы не решили проверить какую-то другую версию своего советника.

Что еще нам важно при написании робота? Четко разобраться в смысле всех понятий, которыми оперирует MQL4. В учебнике по MQL4 нет сложных слов, и все понятия используются на первый взгляд знакомые («оператор», «функция» и т. п.), но употреблены они немного в других значениях, чем мы привыкли. И если эти новые значения не освоить, то робота своего мы никогда не напишем. Все вроде бы будет просто, но что делать дальше, так и не станет понятным и вдохновляющим к действию.

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

А пока представим, что определенная программа у нас уже есть. Посмотрим, как свое создание можно протестировать на истории силами Метатрейдера.

На рисунке 1 синяя стрелка указывает на значок тестера стратегий. Мы нажимаем туда и под окном с ценой и индикаторами открывается поле тестера стратегий. Смотрим рисунок 2.

attachment.php

Рисунок 2.

Когда мы создавали робота, Метатрейдер мудро поинтересовался какой род программы мы сохраняем: советник, скрипт или пользовательский индикатор. Мы, естественно, честно отвечаем, кого ваяем и программа сохраняет информацию в определенный каталог. Из этого каталога тестер и предлагает выбрать советника, работу которого проверяем на истории.

Я выбираю ту МТС, которая прикреплена к рабочему листу на первом рисунке, версию 1-6 по GBP, закрытие по индикатору Parabolic SAR.

В поле «Символ» выбираю тестируемую пару, то есть к архиву ее котировок будет обращаться тестер, «Модель» - «все тики», ставлю галочку «Использовать дату» и мне становится доступным диапазон периода, на котором я хочу провести тест. Например, июль 2011 (можно взять и больше). Далее нажимаем кнопку «Cтарт».

Если до начала теста внизу мы видели только две вкладки «Настройки» и «Журнал», то после теста появляются еще вкладки «Результаты», «График», «Отчет».

Во вкладке «Отчет» вы видим резюме теста: сколько сделок, какова их прибыльность и т. д. Смотрите сами на рисунке 3.

attachment.php

Рисунок 3.

Мы видим тот случай, когда в слове «матожидание» первая часть происходит вовсе не от слова «математика». С 10000 депозита за месяц получить 15 с половиной баксов – это что-то! Смотрим, почему такой «вдохновляющий» итог.

Для этого открываем вкладку «Результаты» и анализируем, как открывались и закрывались позиции, особенно обращая внимание на убыточные сделки. Там будет перечень всех ордеров с ценами, временем и результатами позиций по подобию реальной работы терминала.

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

К сожалению, не всегда ошибки связаны с тем, что в коде допущена какая-то ошибка. Иногда некорректно срабатывает тестер, потому что, во-первых, тики он генерирует сам, опираясь на минутки в указанном периоде, а во-вторых, может неверно обрабатывать некоторые команды, но все же это помощь. Общую картину мы получим.

Понятно, что при таком недостатке тестера, проверка МТС на демосчете на реальных графиках и тиках становится неизбежной.
 

Вложения

  • 1.jpg
    1.jpg
    53,7 КБ · Просмотры: 84
  • 2.jpg
    2.jpg
    52,6 КБ · Просмотры: 81
  • 3.jpg
    3.jpg
    48,1 КБ · Просмотры: 82

FXWizard

Гуру форума
Трейдер трейдеру – друг, брат и запасная торговая система.
Джон Спарк.​

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

Для нашего с вами робота я взяла RSI (3) и уровни 25 и 70. При пересечении линией индикатора уровня 25 снизу вверх открывается позиция вверх. При пересечении уровня 70 сверху вниз открывается позиция вниз. Закрытие длинной позиции на максимуме индикатора выше уровня 70, закрытие короткой позиции на минимуме индикатора ниже уровня 25. Естественно, я не говорю, что это прибыльная ТС. Нам сейчас это не важно. Мы даже тренд определять не будем.

Напишем также робота так, что он будет торговать на том интервале, который будет установлен на листе, где мы его запустим, то есть конкретизировать тайм-фрейм не будем. Учитывайте при этом, что если захочется на выбранном листе сменить размерность отображения цены, например, перейти с М5 на М30, то робот воспримет новые данные, и будет работать по ним. Так что если вы привыкли отслеживать тенденции, переключаясь во время анализа на разные масштабы, придется заводить привычку – каждому нужному таймфрейму свой лист.

Как я и советовала в прошлой статье, сначала желательно нарисовать схему того, что будем делать. При этом помним, что робот похож на новорожденного ребенка – все нужно объяснять с нуля. Видели, как грудничка носят по комнате, привлекают его внимание к разным предметам и называют их: «уточка», «цветочек» и т. д.? Если ребенку никогда не покажут уточку и цветочек, в его мире таких понятий не будет. Тут точно также. При этом ваше право назвать стул сапогом, а сапог столом. Как назовете переменные, с которыми он будет работать, так он и будет их использовать.

Попробуйте сначала сами начертить схему описанной системы. Посмотрите на указанную ТС глазами робота. И сразу привыкаем оперировать теми понятиями, что заложены в MQL4. Текущий период отображается как 0, предыдущая свеча 1, свеча до нее 2 и т. д. В учебнике по MQL4, который легко и бесплатно можно скачать в Интернете, приведены таблицы указанных обозначений.

Моя схема отображена на рисунке 1.

attachment.php

Рисунок 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.
 

Вложения

  • 1 (1).jpg
    1 (1).jpg
    22,1 КБ · Просмотры: 78
Верх