Как написать советника
Здравствуйте! Настало время выложить еще одну статью на форекс блоге 4exlab.ru Тему решили посвятить написанию вашего первого торгового робота. Тема не такая уж и трудная, как кажется на первый взгляд. На самом деле написать советника дело не хитрое. Но будет ли торговать этот советник прибыльно? Вопрос риторический.
Наша же задача – научить вас написанию робота советника. И я совсем вам не обещаю, что он будет приносить прибыль, разве что совершать различные операции по открытию и закрытию торговых позиций.
Итак, приступим к написанию нашей первой программы робота. На протяжении всего времени существования проекта Группа Авторов описывала только работу скриптов и индикаторов. Сейчас будем писать первого советника, поэтому некоторые шаги я объясню заново, а какие моменты не понятны, отвечу на них в комментариях.
Первое, что у нас должно быть при написании торгового робота – это стратегия. Сильно сложную стратегию я брать не стал, а взял самую простую на основе Moving Average.
Стратегия:
У нас имеется линия Moving Average. Если цена данного инструмента поднялась выше линии Moving Average, то мы выставляем позицию на покупку с определенным TakeProfit и StopLoss. В нашем случае функцию StopLoss и TakeProfit поставим в 250 пунктов. Пока есть какая–либо открытая позиция, новых позиций мы не открываем.
Согласитесь, довольно простая стратегия работы торгового робота.
Второй шаг будет промежуточным, между стратегией и непосредственно программированием на языке MQL. Открываем редактор MetaEditor сразу же заходим в мастер создания советников. В нем выбираем кнопочкой radio «Советник».
Жмем «Далее», попадаем в следующее окно, где прописываем общие параметры советника. В окошке «Параметры» на данном этапе я не рекомендую Вам что–либо вписывать. Потому, как кое–что может поменяться и трудно будет новичку уже что-то объяснить. Поэтому я советую Вам оставить это поле незаполненным и двигаться дальше. «Готово». Теперь мы подошли к следующему и самому главному шагу написания торгового робота.
Третий шаг. Он будет состоять из написания непосредственно кода советника на MQL. Перед нашими глазами сейчас находится подготовленный к работе редактор кода со специальными функциями int init (), int deinit (), int start (). Теперь остается только запрограммировать нашу стратегию.
При инициализации int init () мы ничего указывать не будем. Также пропустим блок int deinit (), так как мы пишем самый простой эксперт и будем придерживаться такого мнения «Лишь бы торговало».
Итак, у нас остается только специальная функция int star (), в которой мы и будем задавать весь алгоритм нашего первого советника.
Воспользуемся готовой торговой функцией OrderSelect (), которая и будет проверять, есть ли у нас уже какие–либо открытые позиции в терминале или нет. По нашей задуманной стратегии, советник должен соображать так: «Если открытые позиции имеются в терминале, то будем ждать и ничего не предпринимать, пока сделки самостоятельно не закроются по действием TakeProfit или StopLoss. Если же открытых позиций нет, то можно проверять дальнейшие условия».
Выглядеть это будет так
Из описанного кода видно, что в фигурных скобочках пусто. Туда мы впишем наши условия для покупки и продажи.
Вспомним из описанной выше стратегии торговли нашего торгового робота, что единственным сигналом для совершения сделки является линия Moving Average. Для восходящего тренда правильным будет условие – «Если текущая цена выше линии Moving Average, то открываем сделку на покупку». Зеркальным методом составим условие на открытие сделки для нисходящего тренда. В общем случае блок специальной функции примет вид описанный ниже.
В принципе это и есть наш торговый робот. Удивлены? А вы попробуйте его скомпилировать и протестировать на любой валюте. Этот советник будет торговать, вот только приблизительный доход будет почти нулевым 50%/50%.
Помните, я попросил Вас пропустить во втором шаге заполнение поля настроек нашего торгового робота? Сейчас самое время это сделать!
После ниже приведенной строки мы будем прописывать наши настройки, только сначала определимся с ними.
В принципе, я бы хотел видеть в настройках параметры TakeProfit, StopLoss и объем сделки. Думаю, этого будет достаточно.
Если мы так все оставим, то наши настройки работать не будут, согласитесь. Теперь необходимо в коде, где присутствуют наши параметры произвести замену. Таким образом, код советника примет уже немного другой вид, который позволит производить изменение параметров скомпилированного кода не внося изменение в сам код, работая с торговым советником прямо из торгового терминала.
Думаю, написанный вариант кода будет намного удобнее использовать в работе с советником. Теперь смело можем компилировать этот код. После чего можно пробовать тестировать Ваш первый советник в торговом терминале, что я сейчас и сделаю.
Чтобы протестировать советник, необходимо зайти в торговый терминал и перейти в «Тестер стратегий», нажав предварительно CTRL+R. Затем в открывшемся окне необходимо выбрать только что написанный торговый робот, инструмент и период равный 1H (1 час). Нажимаем кнопку «Старт» и переходим на вкладку тестера «График». Здесь вы увидите изменение вашего виртуального баланса.
Как видите из результата, данный эксперт довольно трудно назвать прибыльным, тем не менее, он не перестает быть работающим! Основная цель выполнена, поздравляю Вас!
После окончания тестирования, загляните во вкладку отчет. Там хранятся параметры нашего советника, о которых я расскажу в других постах. Прошу обратить внимание на прибыльность нашего советника, она равна 0,14 – это очень мало. Это почти ничего!
Помните, мы прописывали параметры нашего советника? Я представил их на картинке выше. Теперь для изменения объема сделки, StopLoss, TakeProfit вовсе не обязательно изменять код эксперта, компилировать заново и опять тестировать. Благодаря написанному нами блоку можно изменять все эти параметры в терминале, ничего не компилируя. И это замечательно!
В принципе это все, что я хотел рассказать Вам про язык программирования MQL. Теперь вы стали умнее. Надеюсь, что я зажег в Вашей голове такую невидимую лампочку, которая подскажет Вам самую прибыльную стратегию. Профита Вам!
Код советника можно скачать здесь
Домашние задание: Изменить код советника, используя оператор–переключатель SwitchСтатья подготовлена Группой Авторов
·
Связанные записи








Комментарии Вконтакте
64 комментария
Всем привет!
Самый доступный материал из того что я видел.
Парни, дайте еще пищи для ума.
Например, как сделать тоже самое, но открывать ордера когда цена находится на определенное кол-во пунктов выше/ниже скользящей средней.
Каким образом можно создавать отложенные ордера...
Очень здорово написано, очень хороший пример для изучения. Спасибо!
Добрый день.
когда цена находится на определенно количество пунктов вверх / вниз от moving average можно и нужно открывать ордера (я это называю учет погрешностей MA). В коде выше я уже упомянул об этом, но подробно не объяснил:
в строчке открытия ордера
OrderSend (Symbol (),OP_BUY,0.1,Ask,0,Ask-250*Point,
Ask+250*Point,0,0,0,Green);
я использовал 250*Point
это и есть отступление от реальной цены. 250 это количество пунктов, а Point это функция устанавливающая это значение. Например значение после запятой у разных валютных пар может быть 3 или 4. Point устанавливает автоматические это значение. Это очень удобно.
Отложенные ордера открываются с помощью команды
int cmd должна принимать значения
OP_BUY 0 Покупка
OP_SELL 1 Продажа
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT
OP_BUYSTOP 4 Отложенный ордер BUY STOP
OP_SELLSTOP 5 Отложенный ордер SELL STOP
Парни — это не корректно. Среди нас есть и 2 девушки. Мы трейдеры.
Группа Авторов!
Спасибо за статью. советник работает. хоть и криво, но все равно спасибо. Даже не предполагал, что это так просто
проще не куда. но это опять же только на первый взгляд. я же привет пример самого простого советника. прибыльный советник все же придется писать очень долго, потому как в таком советнике будут учтены многие нюансы, чтобы депозит был в сохранности. такие эксперты имеют очень высокую стоимость.
А реально сделать советник с такими пораметрами как:
В bay каждый пункт с тп с минимальным значением(3-5пунтков), если цена уходит на 5 пунтков в противоположную сторону то sell с минимальныйм профитом(3-5) пунтков. На цене в bay и sell где уже открты сделки ранее новые не совершались, например где открыта в bay там сделка может быть только в sell, если ранее сработал тп то сделка может совершится и в bay (главное чтобы в настоящее время небыло на данной цене сделки в bay) ну и таже схема с sell.
Короче нужно что бы советник открывал сделку каждый пункт. Но без ордеров
Конечно можно. Эта стратегия называется «качели». В интернете много и без моих добавлений материала на эту тему, поэтому прошу загуглить. Скажу Вам только одно, что большого профита от подобной стратегии вы не получите, хотя данная стратегия действительно считается прибыльной. Данный советник я тоже писал, очень давно... это один из первых советников моих. От применения советника, торгующего по данной стратегии на реальном долларовом счете, пришлось все же отказаться. Эту стратегию можно использовать только в качестве тренировки в программировании на языке MQL.
Как сделать, что бы советник синхронно работал с двумя парами. Если в первой открывает в бай, то во второй сэл.
и период между открывающимися сделками был по времени, но на основе стратегии?
Здравствуйте, Андрей
Чтобы советник работал синхронно, в этом нет ничего сложного, тем более ту задумку, которую вы хотите воплотить. Вам необходимо использовать две функции datetime Time[] и int OrderSend () с разными symbol. Всю подробную информацию по ссылке.
другой же момент, который необходимо рассмотреть в вашем советнике — это учет депозита и предельно допустимой маржи. так как у вас будут разные валютные пары, то поддержание маржи будет являться чуть ли не первостепенной задачей. успехов в написании советника.
Если я напишу всю стратегию, Вы составите код?
Здравствуйте, Андрей.
мы не заинтересованы в любительском программировании. мы такие же люди, как и вы, у нас тоже есть свое время, которое ценим. Поэтому писать просто так советник никто из нас не будет (+ сегодня выходной, а завтра торги). для этого существует множество ресурсов, на которых вам напишут любой советник по заказу.
Сколько это будет стоить?и напишите Ваш емейл, если возьмётесь...
Я отправил Вам письмо. Там все условия.
Здравствуйте.
Подскажите что означают цифры(21,0,1,4,0) в стоке
Bid>iMA (Symbol (),PERIOD_H4,21,0,1,4,0
И как задать самому кол-во пунктов после которых произойдет покупка(продажа) при пересечении цены скользящей средней
цифры в этой строчке означают
21 — Период усреднения для вычисления скользящего среднего
0 — Сдвиг индикатора относительно ценового графика
1 — Метод усреднения
4 — Используемая цена
0 — сдвиг относительно текущего бара на указанное количество периодов назад
а задать самому количество пунктов после которых произойдет покупка или продажа Bid>iMA (Symbol (),PERIOD_H4,21,0,1,4,0)+[цифра кол.ва пунктов]* Point
Здравствуйте. Спасибо большое за статью! Скажите пожалуйста, а как менять используемые МА, чтоб проверить советник и с SMA, и c EMA, weMA?
добрый день. Venka,
в прошлых статьях я подробно описал как изменять данные настройки.
если для данного советника, то изменения коснутся
iMA (Symbol (),PERIOD_H1,21,0,1,4,0) цифра 21, обозначает период.
вообще, лучше конечно же вывести эту цифру в extern, чтобы она поддавалась оптимизации. Но хочу подметить, что мы описывали первый советник, он самый примитивный, но зато рабочий.
более совершенный советник, разберем в следующих уроках. договорились?
Привет всем.
Интересная статья.
А можете написать программу на основе 3-ех скользящих средних. А то я так и не разобрался как это сделать из вашего примера. Т к я вообще не программист.
Вот смотрите.
Опишу условия на ПРОДАЖУ.
1. цена ниже МА 320
2. когда МА5 пересекает сверху вниз МА8 — открывается сделка на продажу.
3. Здесь ставим Тейк Профит — 60; Стоп Лосс — 30; трейлинг Стоп — 20
4. Таймфрейм M15
Условия на ПОКУПКУ обратные.
MA — Moving Average
MA320 — экспоненциальная, период 320, close
MА5 — экспоненциальная, период 5, median
MA8 — simple, период 8, median
Вот и все. Спасибо. Жду ответа!
Здравствуйте. В написании подобного советника нет ничего сложного. Я даже такой писал и достаточно долго оптимизировал.
Прибыльность такого советника оказалась крайне мала.
Писали говорите?
А исходный код в mql не дадите?
Это один из первых моих советников. там достаточно кривой код
но советник рабочий. я постараюсь написать комментарии к настройкам, затем вышлю Вам на Email этот советник.
Хорошо. Жду.
Спасибо.
Здравствуйте.Если советник серого цвета он рабочий или есть в нем ошибки?
Это вполне торгующий советник. Обозначение серым цветом советника говорит о том, что для этого советника нет исходного кода, есть только ex4 . таким образом торговля идет только посредством «черного ящика». вы не сможете отредактировать данный советник, но вполне сможете его протестировать и оптимизировать. доступно ответил? спасибо за вопрос
Не подскажите где можно скачать на русском языке редактор MetaEditor
Андрюша, ну Вы хоть в свои установленные программы у себя иногда посматривайте. В MetaEditor устанавливается вместе с MetaTrader, в одну папку. Тем более MetaEditor можно вызвать прям из терминала торгового терминала. вот ссылка на предыдущий пост. там все расписано
Я спрашивал за MetaEditor на русском языке так как у Вас скрин сделан на русском.Если Вы пишите советники пришлите пожалуйста на мою почту условия.
открываете MetaEditor и следуете по пути View-language-russian . А вообще язык можно выбрать в начале установки торгового терминала
А не подскажете как в этот советник добавить трелингстоп?
Заранее благодарю.
да, пожалуйста
bool OrderModify ( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
Спасибо большое. Буду пробовать:-)
Здравствуйте! Скажите пожалуйста как присвоить заданной переменной значение «iMA (Symbol (),PERIOD_H1,21,0,1,4,0)» (из вашего примера)?
сначала производите инициализацию переменной. допустим ее имя будет RA. тогда выражение примет вид
int RA = iMA (Symbol (),PERIOD_H1,21,0,1,4,0);
далее вставляете куда Вам необходимо значение скользящей средней с параметрами в виде переменной RA, но подразумеваться будет не RA , а сама iMA (Symbol (),PERIOD_H1,21,0,1,4,0)
Спасибо!
не подскажете как сделать так чтобы вместо МА был ZIGZAG? и условия были только на покупку от последнего сформированного хая с выставлением стопов?
Использованию советником различных индикаторов будет посвящен урок. Следите за обновлениями блога
Подскажите как написать условие, такое чтобы ордер не открывался, если имеется уже открытый по данной валютной паре. Если среди открытых ордеров нет нужной нам валютной пары, то проверяем условие на открытие. Спасибо.
Скажите у меня есть два пользовательских индикатора можно ли из них на основе их алгоритма сделать советник?
без проблем
Вы не могли бы на примере показать как написать советника из двух индикаторов??
Я пробую сам учится программировать своего советника но у меня ещё мало что выходит. По поводу пользовательских индикаторов их в алгоритме нового эксперта надо как-то обозначить и какое выражение поставить в функцию не могли ли вы показать на каком-нибудь лёгком примере?
Андрей, я с радостью объяснил бы Вам, как присоединять советников на примерах, но у меня катастрофически нет времени. Мне очень приятно, что вы читаете мой блог и интересуетесь программированием на языке MQL. Как вы заметили на блог я новости не добавляю уже целый месяц. Обещаю исправиться и где-то через еще один месяц возобновить выпуск новостей в блог. Андрей, у меня есть для Вас предложение — Какие вопросы у вас будут в изучении языка программирования MQL, обращайтесь ко мне через форму «Контакты» и я по Вашей «проблемке» буду выпускать новости в блог. Таким образом, Вы просто предлагаете мне тему для будущего поста.
С уважением, Группа Авторов.
Есть протестированный готовый советник с определенной ТС. К сожалению, я не программист. Научите формировать из него реального торгового робота с определением ошибок, проверкой связи с сервером, разрешением торговли и т.д. Спасибо.
Здравствуйте. Используйте функцию int GetLastError ( ) / про ее описание можно почитать в справке по программированию на языке MQL , она находится в MetaEditor. Как я сообщал комментарием выше, у меня сейчас катастрофически не хватает времени на ведение блога. я обещаю исправить ситуацию приблизительно через месяц. и выпуск уроков по программированию войдет в свое прежнее русло.
Классный материал. Отличное начала для изучение программирования!
Если бы еще была статейка по поводу использования пользовательских индикаторов (в MetaEditore отображаются только стандартные индикаторы), а также торговля по стрелочкам индикатора было бы вообще замечательно.
А что может быть не понятно в пользовательских индикаторов?
какая торговля? по каким стрелочкам? у каждого индикатора имеется свое название. поясните конкретней, что именно вы хотите видеть в блоге!
Я вот не могу понять какой момент. Мой советник удачно торгует на периоде H4, на других сливает (на демо счёте). В реальных условиях тоже можно период выбрать для торговли?
Ни в коем случае! Ваш советник сольет этот счет обязательно. Торговля зависит от того, как вы оптимизировали данный советник. Отправьте мне через ссылку «контакты» отчет о тестировании вашего советника. Интересно посмотреть, как вы тестируете его.
Здравствуйте, вы сможете написать маленький советник на основе MACD и прокомментировать его подробно? Я хочу понять как можно полностью описать процесс получения сигнал от MACD на торговлю и использовать дальше...
Ребята, как сделать, что бы советник контролировал что по каждой паре не открывалось более одной позиции?
Здраствуйте, подскажите пожалуста, а как это так — советник без исходного кода?
если у вас на руках имеется скомпилированный файл .ex4 (этот файл не поддается редактированию) , это и есть готовый советник. А исходник это файл расширением .mq4 (он редактируется). После того, как вы его дописали вы компилируете файл (преобразовываете) в .ex4 (с него то и идет торговля)!
Здравствуйте, у меня есть интересная идея для советника с использованием МА, но реализовать её в советник не получается. Кто-нибудь сможет мне помочь?? White_Cat_@mail.ru
Обещать ничего не могу, т.к. сейчас мало времени на разработки. Но вы всегда можете поделиться с нами своими идеями, мы их вместе обсудим и проанализируем. Договорились? Пишете стратегию в личку
Здравствуйте!
Блин помогите.
Коротче мне нужен советник под определенную торговую стратегию. Я немного интересовался програмированием в MQL4 но не могу врубиться как подключить сигналы Торговой Стратегии под собственный советник.
Подскажите пожалуйста или возможно вы напишите этот Советник он очень мал. Ниже опишу что за ТС и что я хочу в Советнике:
Советник для МТ4 на базе торговой стратегии: Exclusive System v.2.0
У меня задача простая , как только ТС дает сигнал на покупку советник покупает но при этом больше не выставляет никаких стопов и тейк-профитов он ждет когда ТС даст сигнал на продажу, в этот момент советник автоматически закрывает ордер, тоесть продает то что купил и открывает следующий но уже на продажу и ждет когда опять будет сигнал на покупку ну и все тем же макаром. Если ТС дает два подряд сигнала на покупку или продажу то пусть он их исполняет пусть значит два раза покупает или два раза продает.
Еще очень важно чтобы советник работал на всех ТаймФреймах но что бы было конкретно если я выставляю например на Н1 то значит он должен учитывать только часовые периоды и по ним вел торговлю, возможно есть смысл просто добавить скрипт где можно было перед торговлей задать этот параметр.
Желательно пара: EUR/USD.
Я думаю стоит добавить скрипты типа СтопЛоса и ТейкПрофита, так же обязательно размер лота который я должен указывать при торговле, сделать функцию что бы эти скрипты можно было отключать и включать а так же ставить собственные значения.
Пожалуйста ответе.
Очень жду!
Здравствуйте подскажите пожалуйста как сделать так чтобы советник после закрытия всех сделок переставал работать? Breake не подходит я уже пробовал. Какую команду и где нужно прописать?
встречный вопрос: «Если Вам не нужны действия советника, тогда зачем вам советник?»
Доброго времени суток! Очень полезная информация у Вас на сайте. Подскажите, а нет ли возможности привети пример с описанием по созданию советника, ТС которого основана на 5 индикаторах?
Здравствуйте! Можно ли написать советника по простому мувингу со стопом +1 пункт и как это прописать? (Допустим цена пересекает мувинг,открывается позиция, набирается 1 пункт и там ставится стоп) Спасибо, буду очень благодарен за ответ.
Со стороны программирования, конечно можно. Получится скальпер. Сомниваюсь, что он будет приносить реальную прибыль, ведь каждую сделку придется отбивать спред, которые значительно больше профита.
Со стороны ДЦ — нет. ДЦ просто на просто не даст делать Stop так близко к Open, хотя тут все зависит от ДЦ (некоторые устанавливают этот предел 15 п, некоторые 10 п.)
Здравствуйте!
Прочитал Вашу статью и попробовал сделать все как тут написано, т.к. в этом деле я еще полный ноль.
В результате компиляции выдалось 9 ошибок и 1 предупреждение.
Значит все-таки вы сделали не так, как написно в уроке. Будьте внимательными, ищите ошибку у себя в коде!
Пожалуйста напишите как будет выглядеть условие : закрыть продажу если цена выше МА, и закрыть покупку если цена ниже МА
отправил на Email