Как сделать советник в мт5
Как установить советник в MetaTrader 5
Здравствуйте, дамы, господа, товарищи форекс трейдеры! В статье мы разберем такую тему, как установка советников в терминал MetaTrader 5.
У многих советники (иначе, торговые роботы) вызывают ассоциацию с каким-то невероятным инструментом, который в мгновение ока способен вас озолотить, не прилагая никаких особых усилий.
На самом деле, советник – это ничто иное, как автоматический алгоритм. То есть, это такая же торговая стратегия, как и любая другая, но все торговые действия выполняются автоматически. Вам не нужно вручную открывать сделки, автоматический робот делает это за вас. Само собой, робот можете как зарабатывать, если в его основе лежит хорошая стратегия, так и сливать, если стратегия не столь продумана. Поэтому, к советникам стоит относиться точно так же, как и к обычным ручным системам, трезво оценивая именно идею, лежащую в основе робота.
Установить советник в MT5 можно либо из Маркета (встроенный в терминал онлайн-магазин), либо вручную, скачав файлы робота из интернета.
Рассмотрим оба варианта.
Установка из Маркета
В стандартном терминале у вас уже есть предустановленные советники. Однако это лишь совсем базовые примеры, вроде того же советника по MACD или Moving Average.
Все советники можно найти в разделе Советники в окне Навигатор в левой части терминала.
Есть два способа для установки советника в MetaTrader 5. Первый способ – это установка через Маркет.
Нас же интересует раздел “Эксперты“. Кто еще не понял, эксперты – это еще одно название для торговых роботов.
2. Когда вы выбрали подходящего робота, нажимаете на иконку советника, затем на странице советника нажимаете “Скачать” для загрузки робота в терминал. Перед установкой внимательно прочитайте описание робота. В описании могут быть рекомендации по тестированию, подходящим символам или временным периодам.
После того, как вы скачали советник, в навигаторе появится новая папка “Market“, куда будут попадать все советники, скачанные из магазина.
Конечно же, вероятность того, что вы скачаете из Маркета очередной грааль равняется нулю. Большая часть продуктов, как платных, так и бесплатных является обыкновенным хламом. Поэтому, грааль в Маркете искать не стоит. Тем не менее, устанавливать таким образом советники достаточно просто. Нажали на “Скачать” и советник автоматически появляется в папке “Маркет“.
Установка файлов советника
Теперь рассмотрим ситуацию, когда вам нужно установить советник, скачанный с сайта или форума, который находится в папке, либо архиве. Как правило, в архиве находится папка MQL5 и, возможно, инструкция к советнику. В самой папке MQL5 может находится как сам эксперт, так и индикаторы, библиотеки, сеты и другие файлы.
Файлы советника могут быть уже распределены по папкам, а могут просто лежать кучкой.
2. Далее, нужно открыть каталог данных терминала. Для этого заходим в МТ5, затем в Файл –> Открыть каталог данных.
4. Дальше перезагружаем терминал, и скачанный советник появится в списке советников в навигаторе терминала.
Однако, не все советники скачанные из интернета рассортированы по каталогам.
Аналогично тому, как мы делали перед этим, открываем каталог терминала, только в этом случае нам нужно распределить файлы советника вручную.
В первую очередь нас интересует непосредственно исполняемый файл советника. В большинстве случаев, это будет файл с названием советника с расширением ex5 – этого файла будет достаточно для установки советника в терминал.
Также, в папке может находится исходный код советника – файл с расширением mq5. Для работы советника он не нужен, но если файла с расширением ex5 нет, подойдет и файл mq5, который при запуске терминала будет автоматически скомпилирован в ex5. Если в папке есть оба файла, то копируем сразу два файла.
Далее, вставляем скопированные файлы в Каталог данных терминала – MQL5 – Experts – Advisors.
Также, вместе с советником могут быть файлы библиотек с расширениями dll или dat. Данные файлы тоже копируем, и переносим в папку MQL5 – Libraries.
Еще с советником часто идут наборы оптимальных настроек в виде сет-файлов (расширение set). Если такие файлы имеются, их можно скопировать в папку MQL5 – Presets. Если такой папки нет, можете ее создать вручную с помощью контекстного меню Правая кнопка мыши– Создать новую папку.
В комплекте с советником также могут идти дополнительные индикаторы. Индикаторы имеют такое же расширение, как и советники. Данные файлы, если имеются, копируем в папку MQL5 – Indicators. Теперь перезапускаем терминал, и все установленные советники должные появится в соответствующем каталоге навигатора.
Настройка терминала
Перед запуском советника нужно произвести некоторые настройки терминала.
Для этого внутри терминала проходим в Сервис – Настройки и выбираем вкладку “Советники“. Здесь нужно установить галочку напротив “Разрешить автоматическую торговлю” и “Разрешить импорт DLL“. Также, если советнику необходим доступ к какому либо сайту, дополнительно установите галочку напротив “Разрешить WebRequest для следующих URL“, и введите в поле нужных адрес, начиная с “http://“.
Также, нужно разрешить авто-торговлю на тулбаре терминала. В противном случае, советник не будет торговать. Просто нажмите на кнопку, чтобы она стала зеленой.
Установка советника на график
2. Далее просто перетягиваем советника из навигатора на график торгового инструмента.
3. В открывшемся окне, во вкладке “Общие“, устанавливаем галочки, если те еще не установлены.
4. Во вкладке “Входные параметры” можете изменить параметры советника по своему усмотрению. Как правило, здесь находятся настройки используемых индикаторов и мани-менеджмента.
Также, следует установить уникальный для советника Magic Number, если такой параметр имеется. Это позволяет советнику отличать свои ордера от ордеров, открытых другими советниками. То есть, если вы захотите установить два советника на одну и ту же валютную пару, то вам понадобится два графика, и два советника с разным значением Magic Number. В большинстве же случаев этот параметр можно оставить без изменений.
По нажатию на кнопку “Загрузить” вы можете загрузить набор заранее предустановленных настроек (файл с расширением set), который мы устанавливали ранее. Также, вы можете сохранить собственные настройки для использования в будущем по нажатию на кнопку “Сохранить“. Чтобы сбросить настройки советника к исходным нажмите “Сброс“. После того, как все параметры настроены, нажимаете “ОК” и советник будет прикреплен к текущему графику.
5. После этого обратите внимание на появившийся значок в правом верхнем углу графика. Если он зеленого цвета, значит все в порядке и советнику разрешено торговать. Если значок красный – проверьте настройки терминала (см. выше)
Обратите внимание, что советник не обязан сразу же открывать ордера. Некоторые советники вообще могут торговать раз в неделю и это абсолютно нормально. Если в комплекте с советником шли индикаторы, то наносить на график их не обязательно. Вы конечно можете это сделать, но на работу советника это никак не повлияет.
А вот на одном графике одновременно может работать только один советник. Если вы хотите запустить еще один, вам нужно открыть для него еще один график и повторить ту же процедуру установки советника на график.
Ответы на частые вопросы по работе с советниками
В. Я установил советник, уже 2 часа прошло, а он не открывает позиций. Что не так?
О. Все так. Советник откроет ордер тогда, когда появятся подходящие условия. Наберитесь терпения.
В. Советник закрыл сделку в минус. Я в панике! Может в настройках что-то надо исправить?
О. Ничего исправлять не нужно. Советник – это не волшебная машина, которая знает куда пойдет рынок. Отрицательные сделки будут и это нормально. Нас интересует, чтобы количество прибыльных сделок превышало количество убыточных, и в итоге робот давал положительный прирост баланса на счету.
В. В комплекте с советником идут индикаторы. Что с ними делать? Ставить на график?
О. Если в работе советника используются дополнительные форекс индикаторы, их нужно поместить в папку Каталог данных/MQL5/Indicators. Вешать их на график не обязательно, достаточно прикрепить только один советник.
В. Можно ли на одном счету запустить сразу 2 разных советника?
О. Да, конечно. Для каждого эксперта должно быть открыто отдельное окно с графиком и ни в коем случае не должны совпадать MagicNumber.
В. А как запустить одновременно два терминала одного ДЦ? Я хочу чтобы и демо и реал одновременно торговали.
О.Нужно установить второй терминал в папку с другим названием. Например Metatrader4-2. Подробнее см. тут
В. А можно торговать руками на том счету, где работает советник?
О. Да. Советник не тронет ваши ордера.
В. А могу я вручную закрывать ордера, открытые роботом?
О. Можете. Но будьте внимательны, – не все боты воспринимают адекватно закрытие ордера вручную. Например, после закрытия вами сделки, советник может вновь открыть такую же.
В. Скачал советник, а он не тестируется, в чем дело?
О. Если в советнике есть параметр AutoGmT,его нужно отключить и выставить вручную для работы в Тестере Стратегий.
В. А как можно протестировать советник на исторических данных?
О. Посмотрите видеоурок “Как тестировать советник в MT5”.
В. У меня счет в рублях. Какие настройки ставить в мани-менеджменте советника?
О. Советник не знает что такое рубли. Он будет думать, что у вас на счету доллары и открывать большие позиции. Т.е. если у вас счет в рублях, то не стоит использовать автоматический мани-менеджмент, – только фиксированный лот. Или же откройте счет в долларах.
Создание готового советника
Мастер MQL4/MQL5 позволяет создавать полностью работоспособных советников на основе стандартной библиотеки, поставляемой вместе с торговой платформой. Для этого выберите пункт «Советник (сгенерировать)» на первой странице Мастера MQL4/MQL5.
Общие параметры
Заполните следующие поля:
Ниже отображается набор обязательных параметров, созданных по умолчанию:
Советник не будет запускаться на графиках с символом или периодом, отличных от указанных в его настройках. О неверном символе и периоде в журнал платформы выводится соответствующее сообщение.
Сигналы #
На этом этапе выберите модули сигналов. На основе данных, полученных от них, советник будет принимать торговые решения. Всего доступно 64 модуля. В советник можно добавить любую их комбинацию, а также несколько одинаковых модулей с разными настройками.
Механизм принятия торговых решений описан в справочнике по MQL5.
Чтобы перейти к добавлению или изменению настроек модуля, нажмите «Добавить» или «Изменить».
Укажите параметры модуля сигналов:
Для каждого модуля сигнала существует определенный набор встроенных параметров:
Трейлинг #
На этом этапе выберите тип перемещения торговых уровней стоп-лосс и тейк-профит.
В поле «Имя» выберите тип трейлинга. Файлы исходных кодов данных функций расположены в папке [каталог данных платформы]\MQL5\Include\Expert\Trailing\. Для каждого типа трейлинга предусмотрен свой набор параметров.
Управление капиталом #
На этом этапе выберите тип управления капиталом для советника.
В поле «Имя» выберите тип управления капиталом. Файлы исходных кодов данных функций расположены в папке [каталог данных платформы]\MQL5\Include\Expert\Money\. Для каждого типа управления капиталом предусмотрен свой набор параметров.
В качестве модулей сигналов, трейлинга и управления капиталом используются специальные классы из Стандартной библиотеки. В дополнение к ним вы можете написать собственные классы (в том числе создать их на основе существующих). Чтобы они стали доступны в Мастере MQL5, разместите их в следующих каталогах:
Подробнее о создании собственных модулей читайте в статье «Мастер MQL5: Новая версия».
Пошаговое руководство по написанию MQL5-советников для начинающих
Введение
Эта статья предназначена для начинающих, для тех, кто хочет научиться написанию простых советников на новом языке MQL5. Сначала мы определимся с тем, что требуется от нашего советника, а затем приступим к написанию того, каким образом он будет это делать.
1. Торговая стратегия
Что будет делать наш советник:
Это называется торговой стратегией. Перед тем, как писать советник, сначала нужно разработать стратегию, которую вы хотите автоматизировать в советнике. Давайте конкретизируем нашу стратегию, которую будем применять в советнике.
Стратегия разработана, теперь время начать писать код.
2. Пишем советник
Начнем с запуска редактора MetaQuotes Language Editor 5. Затем нажимаем Ctrl-N или на кнопку «Создать» в панели инструментов.
Рисунок 1. Создание нового документа MQL5
В окне Мастера MQL5 выбираем «Советник» и нажимаем «Далее», как показано на рис. 2:
Рисунок 2. Выбор типа создаваемой программы
В следующем окне в поле «Имя» напишите имя, которое вы хотите дать вашему советнику, я написал «My_First_EA«. Вы можете указать свое имя в поле «Автор» и адрес в виде ссылки на ваш сайт или e-mail (если есть).
Рисунок 3. Общие параметры советника
Поскольку мы хотим иметь возможность менять некоторые параметры нашего советника, для того, чтобы найти лучшие, мы добавим их при помощи кнопки «Добавить».
Рисунок 4. Входные параметры советника
В нашем советнике нам нужно иметь возможность изменять Stop Loss, Take Profit, ADX Period and Moving Average Period, так что укажем их здесь.
Дважды кликнем мышкой по колонке «Имя» в параметрах и напишем наименование параметра, аналогично в колонках «Тип» и «Начальное значение» укажем тип данных параметра и начальные значения.
После этого, результат будет примерно следующий:
Рисунок 5. Типы данных входных параметров советника
Как видно, мы выбрали тип integer (int) для всех параметров. Рассмотрим подробнее типы данных.
Как видно из описания различных типов данных, беззнаковые целые (uint) не предназначены для хранения отрицательных значений, любые попытки установить отрицательные значения могут привести к непредсказуемым результатам. Например, если вы хотите хранить отрицательные значения, нельзя для них использовать переменные типа uchar, uint, ushort, ulong.
Вернемся к нашему советнику. Для значений, меньших 127 или 255, для экономии памяти можно использовать значения типа char or uchar, соответственно, однако для удобства мы зададим их значения как тип int.
После того, как закончено определение необходимых входных параметров индикатора, нажмем на кнопку «Finish» и MetaQuotes Editor5 создаст шаблон кода, представленный ниже:
Для лучшего понимания, рассмотрим отдельно различные секции кода.
В верхней части кода (заголовок) определяются свойства советника. Как видно, это значения, которые были установлены в Мастере MQL5 на рис. 3.
В этой части кода также можно задать дополнительные параметры, например description (текст с кратким описанием советника), определить константы, включить дополнительные файлы или импортируемые функции.
Для выражений, начинающихся с символа «#», не нужно ставить точку с запятой в конце строки, это директивы препроцессора. Другой пример:
#define ABC 100
#define COMPANY_NAME «MetaQuotes Software Corp.»
В данном случае COMPANY_NAME будет означать строку «MetaQuotes Software Corp.», вместо ABC будет подразумеваться число, равное 100.
Более подробнее о директивах препроцессора можно прочитать в руководстве по MQL5. Идем далее.
Здесь мы задаем входные параметры, которые будут использоваться в советнике как переменные, они могут быть использованы во всех функциях нашего советника.
Переменные, определенные на этом уровне, называются глобальными переменными, поскольку они доступны из любой функции советника. Входные параметры могут быть изменены только вне кода советника при запуске. Также мы можем определить другие переменные, которые будем использовать в нашем советнике, они не будут доступны для модификации извне.
Далее идет функция инициализации советника. Это функция вызывается первой после запуска советника или смены графика и вызывается только один раз.
Например, можно проверить, достаточно ли баров на графике для работы нашего советника и т.п.
Также это лучшее место для получения хэндлов технических индикаторов, которые будут использоваться (в нашем случае это индикаторы ADX и Moving Average ).
Функция OnDeinit вызывается при удалении советника с графика.
В нашем советнике, в данной функции мы будем освобождать хэндлы индикаторов, созданных в разделе инициализации.
Данная функция производит обработку события NewTick, которое генерируется при приходе новой котировки для символа.
Большая часть кода, отвечающего за реализацию нашей торговой стратегии будет содержаться в данной функции.
Отметим, что советник не сможет производить торговые операции, если в авто-трейдинг не разрешен в клиентском терминале:
Рисунок 6. Торговля советником разрешена
Теперь, когда мы рассмотрели разделы кода нашего советника, начнем добавления кода в шаблон.
2.2. Раздел входных параметров
Как видно, мы добавили новые параметры. Перед тем, как обсудить их предназначение, посмотрим на код. При помощи двойного слэша «//» в код можно помещать комментарии. При помощи комментариев мы можем описывать предназначение наших переменных или производимые нами действия. Комментарии позволяют улучшить понимание кода. Существуют два основных способа написания комментариев :
Это однострочный комментарий.
Это многострочный комментарий
При компиляции кода комментарии игнорируются компилятором.
Использование однострочных комментариев для входных параметров позволяет описать предназначение входных параметров. В этом случае вместо наименования параметров будут показаны комментарии, как показано ниже:
Рисунок 7. Входные параметры советника
Вернемся к нашему коду.
Мы решили добавить дополнительные параметры в наш советник. Параметр EA_Magic (Magic Number) будет использован для всех ордеров нашего советника. Минимальное значение ADX задано как переменная типа double. Значения типа double используются для констант, которые, наряду с целой частью, также могут содержать и дробную часть.
double mysum = 123.5678 ;
Количество лотов для торговли (Lot) представляет собой объем финансового инструмента, который мы хотим торговать.
С другой стороны, для статических массивов их размер определяется при объявлении.
Переменная p_close будет использоваться для хранения численного значения цены Close для бара, который мы собираемся отслеживать в процессе проверки торговых сигналов на покупку и продажу.
Переменные STP и TKP нужны для установки значений Stop Loss и Take Profit ордеров нашего советника.
2.3. Секция инициализации советника
Далее мы получаем хэндлы индикаторов, используя соответствующие функции индикаторов.
Хэндл индикатора ADX получаем при помощи функции iADX. В качестве аргументов ей передается символ графика symbol ( NULL также означает символ текущего графика), период/таймфрейм ( 0 означает таймфрейм текущего графика ), период индикатора ADX, который будет использоваться для вычисления индикатора (ADX_Period мы определили в разделе входных параметров индикатора):
Хэндл индикатора Moving Average получаем при помощи функции iMA. Аргументы этой функции следующие:
Для получения более подробной информации, посмотрите справку по этим индикатным функциям в документации по MQL5. Это даст лучшее понимание того, как использовать этот индикатор.
Мы проверяем результат выполнения функций на наличие ошибок, в случае неудачи можем получить ошибку INVALID_HANDLE. В этом случае выводим сообщение об ошибке и ее код, используя функцию GetlastError и завершаем работу советника.
Мы решили хранить значения Stop Loss и Take Profit в определенных ранее переменных STP и TKP. Почему мы это сделали?
Это сделано потому, что значения входных параметров не могут быть модифицированы, они только для чтения.
Мы должны быть уверены в том, что наш советник будет корректно работать со всеми брокерами. Для определения точности цены котировок по текущему символу графика можно воспользоваться
2.4. Раздел деинициализации советника
Поскольку эта функция вызывается при прекращении работы советника или удалении советника с графика, здесь мы освобождаем хэндлы индикаторов, созданные в процессе инициализации. Мы создали два индикатора, ADX и Moving Average.
Для их удаления мы используем функцию IndicatorRelease(). Эта функция имеет лишь один параметр ( хэндл индикатора ).
Функция удаляет хэндл индикатора и освобождает расчетную часть индикатора, если ею больше никто не пользуется.
2.5 Раздел OnTick советника
При количестве баров на графике менее 60, наш советник не будет работать и выйдет из функции OnTick. Функция Alert показывает сообщение в отдельном окне. Эта функция выводит значения аргументов/параметров, разделенных запятыми. В нашем случае выводится только одно значение в виде строки и завершается работа функции OnTick.
Наш советник должен производить торговые операции только при начале нового бара, поэтому нужно решить задачу определения факта появления нового бара. Другими словами, советник не будет работать на каждом тике, проверка условий и торговля будет производиться только после окончания формирования бара.
Мы начнем с объявления статической переменной Old_Time, в которой будем хранить время бара. Мы определили ее статической, поскольку нам нужно, чтобы ее значение сохранялось при новом вызове функции. Тогда у нас будет возможность проверять ее значение с переменной New_Time, которая также объявлена типа datetime, но в виде массива из одного элемента, она будет использоваться для хранения времени текущего бара. Также мы объявляем переменную IsNewBar типа boolean, и устанавливаем ее значение в false. Ее значение будет установлено в true только в случае определения факта появления нового бара.
Для получения времени бара используется функция CopyTime. Она копирует время бара в массив New_Time, состоящий из одного элемента. В случае успеха, мы сравниваем значение времени бара с сохраненным ранее временем предыдущего бара. Если они различны, это означает, что появился новый бар и переменная IsNewBar устанавливается в true, а значение текущего времени бара сохраняется в переменной Old_Time.
Таким образом, переменная IsNewBar будет указывать на факт появления нового бара. Если ее значение равно false, мы завершаем выполнение функции OnTick.
Обратите внимание на строчку:
здесь проверяется исполнение советника в режиме отладки, если он запущен в отладчике, будет выводится сообщение о значениях времен баров, режим отладки мы рассмотрим позже.
Мы хотим быть уверены в том, что наш советник работает корректно.
Следует отметить, что функция OnInit вызывается только один раз при присоединении советника к графику, а функция OnTick вызывается каждый раз при поступлении нового тика (ценовой котировки).
Как можно видеть, мы это делаем по-другому. Мы сохраняем общее количество баров в истории в новой переменной Mybars, определенной внутри функции OnTick:
Этот тип переменной является локальной переменной, в отличие от переменных, декларированных в разделе входных параметров нашего кода.
Глобальные переменные доступны для всех функций советника, локальные переменные определяются внутри функций, их видимость ограничена лишь функцией, внутри которой они декларированы. Они не могут быть использованы вне функции.
Далее мы определили несколько переменных типа структур MQL5, которые будут использованы в данном разделе нашего советника. В языке MQL5 есть множество готовых структур, что значительно облегчает жизнь разработчикам советников. Давайте последовательно рассмотрим их.
Эта структура используется для хранения последних цен по символу.
struct MqlTick
<
datetime time ; // Время последнего обновления цен
double bid ; // Текущая цена Bid
double ask ; // Текущая цена Ask
double last ; // Текущая цена последней сделки (Last)
ulong volume ; // Объем для текущей цены Last
>;
Любая переменная, объявленная типа может быть легко использована для получения текущих значений цен Ask, Bid, Last и Volume, достаточно вызвать функцию SymbolInfoTick.
Мы объявили переменную latest_price как структуру MqlTick, так что мы можем использовать ее для получения цен Bid и Ask.
Эта структура используется в запросах на проведение торговых операций. Она содержит все поля, необходимые для заключения торговых сделок.
struct MqlTradeRequest
<
ENUM_TRADE_REQUEST_ACTIONS action ; // Тип выполняемого действия
ulong magic ; // Идентификатор magic number эксперта
ulong order ; // Тикет ордера
string symbol ; // Имя торгового инструмента
double volume ; // Запрашиваемый объем сделки в лотах
double price ; // Цена
double stoplimit ; // Уровень StopLimit ордера
double sl ; // Уровень Stop Loss ордера
double tp ; // Уровень Take Profit ордера
ulong deviation ; // Максимально приемлемое отклонение от запрашиваемой цены
ENUM_ORDER_TYPE type ; // Тип ордера
ENUM_ORDER_TYPE_FILLING type_filling ; // Тип ордера по исполнению
ENUM_ORDER_TYPE_TIME type_time ; // Тип ордера по времени действия
datetime expiration ; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
string comment ; // Комментарий к ордеру
>;
Любая переменная, объявленная как структура MqlTradeRequest может быть использована для отправки запросов на совершение торговых операций. В нашем случае мы объявили переменную mrequest как структуру MqlTradeRequest.
Результат выполнения торговой операции возвращается в специальную предопределенную структуру типа MqlTradeResult. Любая переменная типа MqlTradeResult может быть использована для доступа к результату выполнения торгового запроса.
struct MqlTradeResult
<
uint retcode ; // Код результата операции
ulong deal ; // Тикет сделки, если она совершена
ulong order ; // Тикет ордера, если он выставлен
double volume ; // Объем сделки, подтверждённый брокером
double price ; // Цена в сделке, подтверждённая брокером
double bid ; // Текущая рыночная цена Bid
double ask ; // Текущая рыночная цена Ask
string comment ; // Комментарий брокера к операции (по умолчанию заполняется расшифровкой)
>;
В нашем случае переменная mresult объявлена как структура тип MqlTradeResult.
Цены (Open, Close, High, Low), время, объем каждого бара, и спред символа хранятся в этой структуре. Любой массив, определенный как массив типа MqlRates может быть использован для хранения значений цен, объемов и спредов по символу.
struct MqlRates
<
datetime time ; // Время начала периода
double open ; // Цена открытия
double high ; // Наивысшая цена за период
double low ; // Наименьшая цена за период
double close ; // Цена закрытия
long tick_volume ; // Тиковый объем
int spread ; // С пред
long real_volume ; // Биржевой объем
>;
Здесь мы устанавливаем индексацию как в таймсериях для всех массивов, которые будут использоваться нами. Это позволит нам быть уверенными в том, что скопированные массивы будут иметь нумерацию как в таймсериях (справа налево т.е. 0, 1, 2, 3 и т.д.). Это производится при помощи функции ArraySetAsSeries().
Следует отметить, что это можно сделать однократно в функции инициализации советника. Тем не менее, для последовательности изложения я решил рассмотреть этот вопрос здесь.
Затем, при помощи функции CopyRates мы копируем информацию последних трех баров в массив типа MqlRates. Функция CopyRates используется для получения исторических данных по указанному символу, периоду и запрашиваемому количеству данных, которые затем помещаются в массив типа MqlRates.
Массив mrate[] теперь содержит все данные по ценам, времени, объемам и спредам для баров 0, 1 и 2. Поэтому для того, чтобы получить нужное свойство любого бара, мы используем выражение типа:
например, для каждого из этих баров:
mrate[1].time // время начала бара 1
mrate[1].open // цена открытия бара 1
mrate[0].high // наибольшая цена бара 0 (текущий бар), и т.д.
В этом коде мы убеждаемся в том, что дальнейшие условия проверки условий для проведения торговых операций производятся только при начале формирования нового бара. Новый бар характеризуется величиной тикового объема, равной 1, если он больше 1, то выполнение функции OnTick завершается.
Далее, используя функцию CopyBuffer, мы копируем значения индикаторов в динамические массивы:
В качестве хэндла индикатора указывается хэндл, полученный в функции OnInit. Что касается номеров буферов индикатора, то индикатор ADX имеет 3 (три) буфера:
Индикатор The Moving Average имеет только 1 (один) буфер:
Начиная с текущего бара (0), мы копируем также еще два бара. Таким образом, полное количество баров равно 3 (бары 0-й,1-й и 2-й). Массив buffer[] в параметре функции CopyBuffer, это массив, куда будут помещены данные. В нашем случае это динамические массивы adxVal, plsDI, minDI и maVal.
Как видно, мы должны отслеживать любые ошибки, которые могут произойти в процессе копирования, вывести соответствующее сообщение и завершить работу функции в случае ошибки, поскольку в таком случае нет смысла продолжать исполнение функции.
Теперь мы должны проверить, есть ли в данный момент открытые позиции, иными словами, мы не будем открывать новых позиций на покупку в случае наличия длинной позиции, и позиции на продажу, если короткая позиция уже открыта.
Для того, чтобы реализовать это, сначала объявим две переменные типа boolean (Buy_opened и Sell_opened), которые будут установлены в TRUE в случае наличия соответствующих открытых позиций.
Для того, чтобы узнать наличие открытой позиции, мы использовали функцию PositionSelect, которая возвращает TRUE в случае наличия открытой позиции по указанному символу и FALSE при отсутствии открытой позиции.
В качестве основного аргумента функции передается наименование символа, наличие позиции по которому следует проверить. Здесь для имени символа мы использовали предопределенную переменную _Symbol.
В случае, если функция вернула TRUE (позиция существует), мы хотим проверить ее тип (покупка или продажа). Для этого мы используем функцию PositionGetInteger, она возвращает тип открытой позиции, в случае, если в качестве параметра задан запрос свойства POSITION_TYPE. В результате возвращается одно из значений перечисления ENUM_POSITION_PROPERTY_INTEGER: POSITION_TYPE_BUY или POSITION_TYPE_SELL.
В нашем случае, мы используем это для того, чтобы определить факт наличия уже открытой позиции. Если открыта позиция на продажу, мы устанавливаем значение переменной Sell_opened в TRUE, если открыта позиция на покупку, мы устанавливаем значение переменной Buy_opened в TRUE. В дальнейшем мы используем значения этих переменных при проверке условий открытия позиций.
Теперь пришло время поместить цену закрытия бара в переменную, которую мы будем использовать для проверки условий торговли. Вспомним, что переменная p_close была определена ранее.
После того, как это сделано, перейдем к следующему шагу.
Рассмотрим условия покупки.
Отметим, что выражения, приведенные выше, соответствуют стратегии, которая обсуждалась ранее. Мы объявили переменные типа bool для каждого из условий, которые должны быть выполнены перед установкой ордера. Переменные типа bool могут принимать только одно из значений: TRUE или FALSE.
Здесь мы проверяем значение скользящей средней MA-8 на барах 0, 1 и 2. Если значение MA-8 на текущем баре больше, чем на предыдущем (бар 1), и при этом значение MA-8 на баре 1 больше, чем на баре 2, это означает, что скользящая средняя MA-8 возрастает. Это одно из условий покупки.
Теперь мы хотим проверить, является ли значение ADX (ADX для бара 0), больше, чем минимальное значение, указанное во входных параметрах советника. Если это условие выполнено, это означает, что текущее значение ADX больше минимального необходимого, также нам нужно убедиться в том, что значение plusDI больше, чем minusDI. Это производится следующим выражением:
После отправки ордера, мы теперь используем значение переменной mresult для проверки результата. Если наш ордер был успешно выполнен, нужно дать об этом знать, также в случае ошибки также нужно информировать о результате. Доступ к коду ошибки и номеру ордера можно получить, используя поля mresult.retcode и mresult,order соответственно.
Точно так же, в разделе выше, мы объявили переменные типа bool для каждого из условий, которые должны удовлетворяться для помещения ордера на продажу. Поэтому торговая стратегия для продажи также состоит из четырех условий. Если условие выполняется, соответствующая переменная устанавливается в TRUE, иначе FALSE. Как и для случая с покупкой, рассмотрим их подробней.
Здесь мы проверяем значения MA-8 для баров 0, 1 и 2. Если значение MA-8 текущего бара (0) меньше, чем значение предыдущего бара 1, а также MA-8 для бара 1 меньше, чем значение для бара 2, это значит, что MA-8 падает. В этом случае одно условий для продажи удовлетворяется.
В этом выражении проверяется условие того, что цена закрытия меньше чем значение MA-8 соответствующего бара (бара 1). Если цена закрытия меньше значения скользящей средней, это значит второе условие удовлетворяется. Затем проверяются следующие условия.
Здесь проверяется условие того, что текущее значение ADX (бара 0) больше чем значение, указанное во входных параметрах советника. Также нужно проверить условие того, что значение MinusDI больше, чем plusDI. Это делается следующим образом:
Если одновременно выполняются все эти условия, подготавливаем запрос на продажу тем же способом, как и в случае покупки.
Так же, как и для ордеров Buy, мы должны проверить результат торгового запроса. Мы используем тот же код, как и для случая покупки.
3. Отладка и тестирование советника
В этом разделе мы разберем, как можно проверить работает ли наша стратегия или нет. Также возможно, что в коде советника могут быть и ошибки, есть возможность отлаживать работу программ на MQL5.
Режим отладки позволяет нам увидеть построчное исполнение нашего кода (если мы установили точки останова, breakpoints) и затем, в случае ошибок быстро сделать необходимые правки перед тем, как использовать его в реальной торговле.
Далее мы рассмотрим процесс отладки советника, сначала без установки точек останова, затем с ними. Для этого, нужно в редакторе выбрать таймфрейм, на котором будет производится отладка нашего советника. В меню «Сервис» главного меню нужно выбрать «Настройки. «:
Рисунок 8. Настройка параметров отладки
После появления окна «Параметры», выберите валютную пару, нужный период/таймфрейм и нажмите кнопку OK:
Рисунок 9. Установка параметров отладки
Перед тем, как начать отладку установим точки останова. Точки останова позволяют нам следить за работой определенных строк кода. В отличие от обычного запуска программы, при отладке в случае наличия точек останова отладчик остановит работу, ожидая дальнейших действий. Таким образом мы способны проанализировать работу нашего кода и следить за текущими значениями переменных в каждой из точек останова для того, чтобы проверить, работает ли все так, как следует.
Рисунок 10. Ставим точку останова
В нашем коде мы собираемся установить точки останова на 5 различных строк кода.
Для удобства описания, они пронумерованы от 1 до 5.
Установим эти 5 точек останова на строки, указанные на рис. 11. Точку останова 1 мы установили ранее.
Рисунок 11. Установка дополнительных точек останова
Мы закончили установку точек останова, теперь время начать отладку нашего кода.
Для начала запуска режима отладки, нажмите клавишу F5 или зеленкую кнопку в панели инструментов редактора MetaEditor:
Рисунок 12. Запуск отладчика
Сначала редактор откомпилирует код, если при компиляции не возникло ошибок, он покажет их в отчете во вкладке «Ошибки»:
Рисунок 13. Отчет компиляции
Имейте ввиду, что факт успешной компиляции не означает отсутствия ошибок в коде. В зависимости от того, как написан ваш код, могут возникать ошибки времени выполнения (runtime errors). Например, некоторые выражения могут компилироваться правильно, но работать неверно. Давайте лучше посмотрим режим отладки в работе.
После того, как компиляция кода завершена, отладчик передает управление клиентскому терминалу и присоединяет советник к графику, который был указан в настройках отладчика MetaEditor. В то же время, он показывает входные параметры советника. Поскольку нашей целью не является улучшение параметров, нажмем кнопку OK.
Рисунок 14. Установка входных параметров советника для отладки
В левом верхнем углу графика видно, что советник присоеден к графику.
При запуске функции OnTick(), произойдет остановка работы советника, он остановится в точку останова 1.
Рисунок 15. Режим отладки: остановка работы советника в первой точке останова
Об этом свидетельствует зеленая стрелка в строке. Она говорит нам о том, что предыдущая строка была выполнена, теперь будет выполнена текущая строка.
Перед тем, как продолжить, имеет смысл познакомиться с командами отладчика. Если посмотреть на панель инструментов редактора MetaEditor, можно увидеть, что теперь стали доступны три кнопки, которые ранее были серого цвета. Причина этого в том, что теперь мы находимся в режиме отладки. Эти три команды используются для исполнения в режиме отладки (Step into, Step over, Step out)»
Рисунок 16. Режим отладки: команда «Step into» (Шаг с заходом)
Команда Step Into (Шаг с заходом) переходит к следующему шагу, при этом производится заход внутрь любой вызываемой функции в коде. Для исполнения данной команды, нажмите эту кнопку или клавишу F11. Далее мы будем использовать данную команду при пошаговой отладке нашего кода.
Рисунок 17. Режим отладки: команда «Step over» (Шаг с обходом)
Команда Step over (Шаг с обходом), в свою очередь, не производит заход отладчика в функции, которые вызываются в коде. Для исполнения данной команды нужно нажать эту кнопку или клавишу F10.
Рисунок 18. Режим отладки: команда «Step out» (Шаг наружу)
Для перехода к выполнению одного шага программы на один уровень выше есть команда Step Out (Шаг наружу), которая вызывается нажатием на соответствующую кнопку или комбинацией клавиш Shift+F11.
В нижней части редактора, вы видите окно «Инструменты»(Toolbox). Вкладка «Отладка» содержит следующие колонки:
Вернемся к процессу отладки.
Следущий шаг, который мы хотим сделать, указать переменные/выражения нашего кода, за которыми мы хотели бы провести наблюдение. Мы будем смотреть за значениями следующих переменных:
Также можно добавить в мониторинг и другие переменные, например значения технических индикаторов ADX, MA-8 и т.д.
Для добавления выражения/переменной в список наблюдаемых, дважды щелкните на колонке «Выражение» или используйте пункт «Добавить» контекстного меню и укажите наименование переменных или выражения, которые нужно включить в режим наблюдение
Рисунок 19. Монитор выражений
Укажите переменные/выражения для наблюдения:
Рисунок 20. Добавление выражений или переменных для наблюдения
Рисунок 21. Конманда «Step into» (Шаг с заходом) в действии
Нажмите кнопку Шаг с заходом или клавишу F11, и посмотрим, что происходит. Нажимая эту кнопку или клавишу F11, пройдите последовательно по точкам останова и понаблюдайте за значениями выражений в окне мониторинга выражений.
Рисунок 22. Наблюдение за выражениями или переменными
Рисунок 23. Наблюдение за выражениями или переменными
Рисунок 24. Наблюдение за выражениями или переменными
При наступлении нового тика, мы заходим в функцию OnTick(). В случае объявления переменных статическими, переменные останутся декларированными, их значения сохраняться.при новом вызове функции OnTick мы будем наблюдать следующее:
Рисунок 25. Значения переменных при новом вызове функции OnTick
Теперь запустим программу снова, на этот раз без точек останова.
Рисунок 26. В режиме отладки при новом баре советник выводит сообщение
При каждом баре программа будет проверять условия на покупку/продажу, при наступлении условий будет производиться торговля и выводиться сообщение о результатах выполнения торговой операции:
Рисунок 27. Торговля советника
Я думаю, можно оставить советник поработать еще несколько минут и попить кофе. Вернувшись обратно и сделав немного денег (шутка), нажмите красную кнопку Stop в MetaEditor для остановки процесса отладки.
Рисунок 28. Остановка режима отладки
Мы убедились, что наш советник работает, однако отметим, что клиентский терминал должен быть подключен к Интернет, в противном случае, он не будет работать.
3.2 Тестируем стратегию нашего советника
Теперь мы хотим проверить нашего советника используя встроенный Тестер стратегий клиентского терминала. Для запуска Тестера Стратегий нажмите клавишу Ctrl-R или выберите пункт «Тестер стратегий» в меню «Вид» главного меню, как показано на рисунке 26:
Рисунок 29. Запуск Тестера стратегий
Окно тестера стратегий появится в нижней части клиентского терминала. Для того, чтобы увидеть настройки Тестера стратегий, нужно увеличить его окно. Для этого передвиньте указатель мыши в точку, отмеченную на рисунке 27:
Рисунок 30. Окно Тестера стратегий
Указатель мыши изменит свой вид, превратившись в двойные стрелки, удерживая мышь, нужно увеличить окно Тестера до высоты, при которой все его настройки видны.
Рисунок 31. Вкладка «Настройки» Тестера
Перед тем, как нажать кнопку «Старт», посмотрим на другие вкладки Тестера.
В процессе тестирования могут использоваться агенты (локальные и удаленные), их количество определяется количеством ядер процессора (если другие компьютеры не используются) и настройками удаленных агентов, если используются сетевые компьютеры.
Рисунок 32. Вкладка «Агенты» Тестера стратегий
Для одного агента в процессе тестирования вкладка «Агенты» имеет вид:
Рисунок 33. Агенты Тестера стратегий в процессе тестирования
В этой вкладке показываются все события, которые происходят в течение процесса тестирования.
Рисунок 34. Вкладка «Журнал» Тестера стратегий показывает активность советника при тестировании
Вкладка «Входные параметры»
Здесь можно указать входные параметры советника.
Рисунок 35. Вкладка «Входные параметры» советника в Тестере стратегий
Если используется оптимизация параметров при тестировании, нужно указать значения переменных, выделенных на рис. 31.
Тем не менее, в нашем советнике мы не будем производить поиск оптимальных параметров, поэтому нам они не нужны.
После ознакомления с содержимым вкладки «Журнал» можно посмотреть на новую вкладку «График», которая появилась в процессе тестирования. При переключении на вкладку «График» вы увидите график, показывающий увеличение и уменьшение баланса, в зависимости от результатов торговли в истории.
Рисунок 36. График результатов тестирования
После завершения тестирования появится другая вкладка, называемая «Результаты» тестирования. Переключившись во вкладку результаты, вы увидите отчет о проведенном тестировании.
Рисунок 37. Отчет результатов Тестера стратегий
Видны чистая прибыль, общая прибыль, общее количество сделок, кол-во убыточных сделок и другие.
Нажав правую кнопку мыши во вкладке «Результаты», вы увидите контектное меню. Выберите пункт «Сохранить как отчет«:
Рисунок 38. Сохранение результатов тестирования
Появится диалог сохранения файла, напишите имя файла для отчета (если хотите, можно использовать имя, преложенное по умолчанию) и нажимте кнопку «Сохранить». Полный отчет будет сохранен в файле формата HTML.
Для того, чтобы увидеть результаты торговли на графике, выберите пункт «Открыть график» и увидите график вида:
Рисунок 39. График с результатами тестирования на истории
Мы успешно написали и протестировали наш советник на истории и теперь имеем заготовку для дальнейшей работы. Можно опять вернуться во вкладку «Настройки» Тестера стратегий и протестировать его на другом временном интервале.
Интересно посмотреть, как он покажет себя на различных парах и таймфреймах, буду рад, если вы поделитесь со мной результатами.
Выводы
В этом пошаговом руководстве мы смогли рассмотреть основные шаги, необходимые для написания простого советника, основанного на заданной торговой стратегии. Мы рассмотрели, как можно проверить работу советника на наличие ошибок с использованием отладчика. Также мы обсудили, как протестировать результаты торговли нашего советника, используя Тестер стратегий. Мы смогли увидеть мощь и робастность нового языка MQL5.
Полученный в результате советник пока не является безупречным или завершенным, многие улучшения еще предстоит сделать для его использования в реальной торговле.
Еще многому необходимо научиться, я рекомендую еще раз прочитать эту статью вместе с документацией по MQL5, попробуйте все, чему вы научились в статье, и смею вас заверить, что вскоре в недалеком будущем вы сможете сами писать торговых советников.