Как написать торгового робота mt4

Головной мозг трейдера функционирует не совсем обычным образом. Человек, далекий от финансовых рынков, действует рационально и предсказуемо. Когда же в дело вступает индивид, мыслящий исключительно свечными комбинациями, последствия предсказать гораздо сложнее. Как частное, сбитые жизненные приоритеты и повышенная импульсивность – известные пороки трейдеров. Сам процесс торговли становиться самоцелью, и биологический компьютер в недрах черепной коробки входит в бесконечный цикл, зависая на абстрактной идее идиллического существования и собственной яхты, пришвартованной у пирса набережной особняка.

progr

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

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

1. Разработку форекс робота начинаем с идеи

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

Собственно, на этом рассказ можно было бы закончить. Если идеальный советник уже существует, зачем продолжать поиски? Но следом возникает второй вопрос: почему, если идеальный советник уже найден, в Африке до сих пор существует дефицит питьевой воды? Если ответ для вас очевиден, поздравляю, вы прошли первый этап становления трейдера разумного, преодолев уровень новичка или алгофанатика, не видящего перспектив своего развития, и нацеленных лишь на результат.

Написать форекс советника

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

2. 4 важных вопроса перед разработкой

Но перед этим попытайтесь ответить себе на следующие вопросы:

  • В чем состоит ваша торговая идея?
  • Какие задачи будет решать советник, и какое объективное преимущество это может дать в торговле?
  • Возможно, вам нужен графический индикатор или вспомогательный скрипт?
  • Насколько идея реализуема технически, и можете ли вы самостоятельно оценить ее сложность?

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

[info_block align=»right» linkText=»Форекс советники» linkUrl=»https://fortrader.org/forex-ea-testing/» imageUrl=»http://files.fortrader.org/uploads/2016/08/robot.jpg»]Исследование торговых роботов с возможностью скачать советника.[/info_block]

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

3. Конструктор советников – не проходим мимо!

У новичков на валютном рынке часто возникает множество вопросов, ответы на которые бывают не совсем очевидны, либо являются лишь вопросом неопытности оного. Будучи начинающим трейдером, достаточно прочитать одну книгу Билла Вильямса, чтобы на всю жизнь подменить понятие торгового хаоса торговым порядком. Затем такие люди удивляются, почему вот здесь да не купить, а вот здесь да не продать, и заказывают у программистов советник по пересечению двух скользящих средних. А ведь на начальных этапах обучения это вполне можно отдать на откуп готовым инструментам разработки. Одной из таких как раз является MQL5 Wizard – мастер по созданию советников для MetaTrader 5.

Для реализации простых вещей Мастер идеален. Вам не нужно обладать никакими магическими способностями – навыки программирования здесь не требуются. Несколько простых шагов, и советник готов. Уже готовый советник можно протестировать в том же терминале MetaTrader. Держите комбайн по производству простецких Граалей.

4. MQL5 Wizard. Сделать советник за 5 минут

Итак, для начала запускаем MetaTrader 5 и переходим в редактор приложений (кнопка F4). На верхнем меню жмем кнопку «Создать» и в появившимся диалоге выбираем генерацию нового советника.

Мастер советников MetaTrader

Дальше нужно указать название советника и основные входные параметры.

Мастер советников MetaTrader

Добавляем модули торговых сигналов. Модули могут быть как стандартные, так и разработанные сообществом (вы тоже можете поучаствовать в данном процессе).

Параметры сигналов советника

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

Варианты торговых сигналов советника

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

параметры модуля сигналов

Обычный трейлинг стоп или закрытие сделки по значениям индикатора – на ваш выбор.

Также на выбор предлагается фиксированный лот, либо объем сделки в процентах от депозита. Для самых рискованных новоявленных программистов также есть мартингейл с его геометрической прогрессией лота, способной принести вам миллионы за пару лишних проходов в тестере стратегий.

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

5. Хочу программировать непростого советника? Написание технического задания

Итак, вы уже обладаете некоторым торговым опытом, вы проверили свою идею в торговле или имеете точное представление о том, как она будет работать на реальном рынке. Значит, пора переходить к написанию формальных правил вашей стратегии. Часто на этом шаге начинаются проблемы у большинства последователей гуманитарных наук – люди сталкиваются с непреодолимой стеной непонимания, когда абсолютно идеально отработанная в голове схема перестает работать при переводе на технический язык.

Написание ТЗ для робота

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

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

6. Напишите мне советник по индикатору

Пример плохого задания для создания торгового советника – его отсутствие. Само намерение заказчика может быть и понятно: есть индикатор, нужно написать торгового робота, ну а дальше что?

[info_block align=»right» linkText=»Вникайте в процесс!»]»Старайтесь вникать в процесс работы и всего, что непосредственно касается реализации идеи вашего советника»[/info_block]

Как закрывать сделку? Как ее сопровождать? Какие выбирать объемы? Что делать с проскальзываниями и реквотами? Нужно понимать, что программист не обладает экстрасенсорными способностями. Если вы такого найдете, обязательно дайте знать, такие люди не должны пропадать.

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

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

7. Выбор исполнителя

Если у вас нет опыта работы с фриланс-биржами, попробуйте представить себе субэкваториальную версию ада. На самом деле, не все так страшно, но некоторые нюансы все же стоит учитывать.

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

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

Реализация торгового советника

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

[info_block align=»right» linkText=»Все в ваших руках»]»В ваших интересах контролировать процесс создания советника вашей мечты. Просите проводить промежуточные этапы работ, участвуйте в бета-тесте и не брезгуйте узнавать технические подробности.»[/info_block]

Один из типичных примеров – недопонимание форматов файлов и их значения. Вроде: «У меня тут есть .dll библиотека (.exe файл или .ex4 программа), не могли бы вы быстренько поправить то и то, а я вам за это копеечку закину? Нет? А почему? Василий мне сделал советника за 5 баксов, а вы плохой разработчик значит!».

Мораль: старайтесь вникать в процесс работы и всего, что непосредственно касается реализации вашей идеи. Это не только поможет лучше разобраться в работе робота самому, но и в дальнейшем упростит процесс общения с исполнителями. В работе всегда принимают участие, как минимум, две стороны, и если вы намерены сделать трейдинг своей основной профессией, терпение нужно беречь – и свое, и окружающих.

8. Сдача советника – включайтесь в работу!

Этап сдачи работы – самый сложный. Будьте уверены, каждый исполнитель с горя пьет успокоительный отвар, черным маркером отмечая день календаря, когда его в очередной раз просят поправить и без того исчерпавший все сроки заказ. Как и вселенной, совершенству нет предела, но в определенный момент нужно собраться и сказать – задача завершена.

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

Принять участие в разработке своего робота

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

Если задача небольшая, исполнитель вполне может пойти на уступки, и исправить работу в соответствии с новым ТЗ. Если работа проделана масштабная – что-либо менять уже поздно. Частая проблема – тотальная отрешенность в процессе разработки, например, отказ от участия в бета-тестировании: «Зачем вы мне скинули советника с ошибками, я что за вас тестировать еще должен?» или: «Откуда я знаю, как этот ваш тестер запускать, я программист что-ли?».

[info_block align=»right» linkText=»Безопасный Мартингейл» linkUrl=»https://fortrader.org/learn/forex-trader/bezopasnyj-martingejl-kak-otdelnymi-elementami-martingejla-uvelichit-pribylnost-strategii.html» imageUrl=»http://files.fortrader.org/uploads/2016/07/coins-730×487.jpg»]Как отдельными элементами Мартингейла увеличить прибыльность стратегии?[/info_block]

Для адекватного человека такие заявления режут слух, исполнитель же впадает в депрессию. Разработка торгового робота – это, в первую очередь, работа. Если вы ищете готовое решение, существует магазин готовых советников, где советника за вас и протестируют, и вымоют до блеска, попутно документируя его историческую успешность. В таком случае, обращаться на фриланс-биржу не имеет смысла.

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

Заключение

Великие деятели, как Альберт Хофманн, не дадут соврать. Опыт создания своего продукта бесценен. Если же вы пришли на валютный рынок по собственному желанию, поверьте, это надолго.

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

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

Вам также будет интересно

  • Как из запаздывающего индикатора сделать работающий Грааль?
  • ECN или MTF – выбираем агрегатор ликвидности
  • Сетка ордеров на форекс: 2 варианта популярной стратегии

Все мы знаем, что основное достоинство терминала Metatrader 4 – это возможность создания роботов и торговля с их помощью. 

Далеко не все трейдеры владеют программированием на mql4/5. Разработчики программы Forex Tester смогли решить эту проблему. Теперь можно создать робота или реализовать торговую идею в виде индикатора на ресурсе «Визуальный конструктор стратегий» (Visual Strategy Builder). Без навыков программирования.

Как это сделать, плюсы и минусы бесплатного (на текущий момент) конструктора роботов – в нашем материале.

Visual Strategy Builder — Автоматизируем Стратегии без программирования

Постоянные читатели нашего сайта знакомы с Forex Tester 4 – уникальным симулятором торгов, выступающим в роли тренажера, тестера и анализатора. Программа имела функцию написания на заказ индикаторов и советников, совместимых с Metatrader. Теперь разработчики платформы решили дать каждому трейдеру шанс самостоятельно создать собственные стратегии. 

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

Сервис Visual Strategy Builder расположен по адресу: https://tools.forextester.com/

Зачем нужен Visual Strategy Builder?

Visual Strategy Builder (VSB) представляет собой программную оболочку с набором инструментов теханализа, которые хорошо знакомы пользователям Metatrader 4. В отличие от этой торговой платформы VSB позволяет задавать в индикаторах правила открытия позиции и установки ордеров тейк-профит и стоп-лосс.

Любой новичок может выбрать сигнал на открытие позиции из набора готовых опций (кроссоверы, пересечения уровней, больше/меньше и т. д.). Эти настройки открывают недоступную для Metatrader 4 возможность протестировать работу одного или нескольких индикаторов. 

Например, можно получить реальный торговый результат по стратегии пересечений скользящих средних линий. Такой советник создается в VSB за 5 минут, потом его можно экспортировать в Metatrader 4 или Forex Tester.

Разобравшись с созданием одного индикатора в Visual Strategy Builder, трейдер может в несколько кликов создать рабочую автоматизированную стратегию и тоже проверить ее в тестере. Если советник показывает положительные результаты, то по его сигналам можно торговать на реальном счете через Metatrader 4.

Кстати, тестировать стратегию однозначно лучше через Forex Tester – там точнее котировки и можно быстро эмулировать сессию за любой торговый день. Например, выбрав какой-нибудь «черный вторник», чтобы воочию понять, как аномальная волатильность повлияет на настройки мани менеджмента.

Профессиональные трейдеры могут экспортировать код советников прямо в VSB, соединять его с созданными там программами или редактировать в Metaeditor и отправлять обратно в Metatrader 4.

Visual Strategy Builder будет полезен тем, кто ищет новые идеи – программа поддерживает библиотеку стратегий пользователей. Любой желающий без навыков программирования сразу поймет «внутренности алгоритма» по составу индикаторов и описанным правилам торговых сигналов. Тут же можно самостоятельно убедиться в результативности торговой системы.

Как работать на платформе Visual Strategy Builder

Сервис Visual Strategy Builder расположен по адресу: https://tools.forextester.com/

Использование VSB требует регистрации – это быстрая и несложная процедура. Введите адрес электронной почты и придумайте пароль для входа. Он должен быть не менее 8 символов, содержать буквы разного регистра, почтовый ящик лучше указать gmail.

После заполнения вышеуказанных строк программа сразу открывает окно конструктора стратегий, автоматически переходя на русскоязычную версию.

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

Платформа удобно сохраняет их под выбранным пользователем именем с кратким описанием сути системы. На странице предусмотрена кнопка возврата, если трейдер допустил ошибку на предыдущем этапе.

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

  • Уровни (Ценность);
  • Конкретная цена;
  • Диапазон (цены открытия, закрытия, максимумы и минимумы свечей);
  • Открытие по дням недели, месяца (опция время);
  • По конкретному объему или его абстрактному критерию;
  • Таймфрейм.

Перечисленные опции можно объединять друг с другом, накладывая различные условия выполнения сделки, например, пробой уровня только до американской сессии и т. д. Определитесь с главным инструментом своей стратегии и перетащите его в окно «Состояние 1».

Как только он там отобразится, можно приступать к редактированию параметров. Наведите курсор на поле присоединенного Bollinger Bands (BB), чтобы увидеть эту опцию.

После ее нажатия появится таблица со стандартными настройками линий BB. Стоит отметить одну особенность: для каждой из них сигналы на открытие позиций прописываются отдельно.

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

Теперь конкретизируем тип позиции и условия мани менеджмента с помощью пункта меню на левой панели «Действия». Перетаскиваем в поле ордер на продажу и редактируем его параметры.

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

Остальные опции понятны, следует только внимательно отнестись к пунктам: 25 – это для четырехзначной системы котировок. При пяти знаках умножайте значения пунктов на 10.

Для нижней линии Боллинджера потребуется создать второе правило, опцию можно выбрать слева вверху, повторив все вышеописанные операции со следующими изменениями:

  • В настройках индикатора выбираем нижнюю линию;
  • Кроссовер – снизу вверх;
  • Тип ордера, открываемого по рынку – «Покупка».

Полученную стратегию можно сохранить и экспортировать в ForexTester или Metatrader 4. В последнем случае используйте латинские буквы в названии файла. Стратегия сохраняется в файл ex4 в папку, выбранную трейдером.

Запустить написанный советник можно сразу после его установки в Metatrader 4. Это делается обычным способом, описанным на нашем сайте.

Заключение

Основной плюс Конструктора стратегий от Forex Tester – простота интерфейса и функциональность шаблонов. Это позволяет трейдеру частично автоматизировать стратегии или дополнить ручную торговлю дополнительными сигналами, которые приходилось искать визуально на графике.

Любителей сеток особо порадует наличие опции «Мартингейл», а также команд на закрытие всех ордеров по условию. Среди минусов VSB следует отметить баги бета-версии и будущую запланированную плату за опцию. Так что спешим писать и экспортировать советников, пока платформа имеет открытую лицензию.

На ней можно попробовать создать прототип своей торговой идеи и, если она окажется прибыльной, обратиться к программистам для полноценной ее реализации.

Тема на форуме

С уважением, Алексей Вергунов
Tlap.com

Come to my page!

Чтобы создать торгового робота, нужна торговая система

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

Как создать торгового робота и не потерять время

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

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

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

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

Торговые роботы и Forex

Считается, что рынок Forex обладает огромной ликвидностью и позволяет торговать 24 часа в сутки в отличие от многих других рынков. Поэтому многие трейдеры пытаются создать торговые роботы именно для торговли на валютном рынке, ведь он представлен достаточно большим количеством инструментов.

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

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

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

Как приступить к созданию торгового робота?

Встречается множество подходов к построению автоматической торговой системы. Выделим только несколько основных из них.

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

Зачастую сторонники такого подхода знают слишком много математики и совсем не знают/не интересуются рынком. Рынок для них — чистая абстракция, одна из разновидностей интеллектуальной игры. Такой подход обычно ведет к многолетним изучениям и разработкам, результат в виде работающей автоматической торговой системы сам по себе не является важным.

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

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

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

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

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

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

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

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

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

Главный недостаток такого подхода проистекает из его достоинств – вы не знаете, как работает данный торговый робот и на каких принципах он построен. И если даже продавец предоставил вам подробное описание заложенной в нем торговой системы, вы никогда не будете в ней уверены до конца.

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

Какой путь в автоматический трейдинг выбрать трейдеру?

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

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

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

Первые шаги по созданию торгового робота

Для написания автоматической торговой системы требуются навыки программирования и знание всех тонкостей обработки торговых запросов. Но вы можете на первом этапе начать знакомство с уже готовыми экспертами – торговыми роботами из бесплатной библиотеки Code Base.

Скачайте любой эксперт (торговый робот) и запустите его в тестере стратегий клиентского терминала MetaTrader 4 или MetaTrader 5. Выберите один участок истории с ярко выраженным трендом и второй участок, на котором цена находится в диапазоне/флете. Проведите оптимизацию входных параметров эксперта и посмотрите, как они отличаются на этих двух участках.

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

Желательно таким путем исследовать несколько классических торговых стратегий на разных участках истории и на разных инструментах. Такая обкатка в тестере может оказаться хорошей прививкой на будущее от подгонки торговой системы под конкретную историю и поможет лучше понимать суть трендовых и контртрендовых систем.

Следующим шагом может стать создание более сложных торговых систем на основе комбинации уже существующих простых сигналов из набора Мастера MQL5. Вы можете, еще не прибегая к программированию, проверить и развивать свою торговую интуицию, отсеивая плохие сигналы одной системы с помощью фильтра на основе другой системы.

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

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

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

Программирование торгового робота

Вы изучили/изучаете язык программирования MQL4 или MQL5 и готовы написать свой первый советник для клиентского терминала MetaTrader. Здесь тоже возможно несколько вариантов.

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

Во-вторых, вы можете задавать вопросы на форуме MQL4.community или MQL5.community, если самостоятельно не смогли разобраться в каких-то моментах. Обычно остальные участники сообщества охотно помогают новичкам, если видят их искреннюю заинтересованность в изучении предмета.

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

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

«Всё украдено до вас»

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

Как найти собственную торговую систему или хотя бы знать, в каком направлении нужно сосредоточить поиски?

Военные во всех странах склонны к чрезмерному уровню секретности, и не зря на этот счет существует множество анекдотов, среди которых есть и такой: «Военная тайна заключается не в том, что вы это знаете» — говорит инструктор курсантам военного училища, — «а в том, что это знаете именно вы». С торговыми системами ситуация примерно такая же: большинство трейдеров используют простые известные торговые идеи, только с небольшими доработками, например, в виде использования трейлинг стопа (Trailing Stop) или подтверждения сигналов от трендовых индикаторов.

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

Поэтому вы можете смело брать доступные в исходном виде коды торговых роботов и пытаться найти правильное их использование на тех или иных инструментах и таймфреймах. Тут на память сразу приходит другая избитая поговорка: «Вы не любите кошек? Вы просто не умеете их готовить!» В это трудно поверить, но вероятность того, что вы придумаете что-то принципиально новое, очень мала. Тут главное всё правильно сделать самому из доступных ингредиентов и не думать, что кто-то сверхумный пользуется какими-то секретными разработками из лабораторий NASA. В этом и заключается секрет Грааля.

Редкая птица долетит до середины Днепра…

«Если торговые идеи лежат буквально под ногами, то почему ими никто не пользуется?» — возникает резонный вопрос. Ответ на него кроется, вероятно, в человеческой психологии. Многие банки и крупные инвестиционные фонды содержат в своих штатах трейдеров, которые торгуют по расписанным правилам и в объемах, которые им позволены. Но почему-то редко когда институциональные трейдеры уходят на вольные хлеба и начинают торговать на свои деньги.

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

Отклоняясь немного от темы, приведем в пример легендарную группу «Черепахи», которая успешно торговала на множестве рынков в конце 20-го века. Почитайте «Путь черепах», и вы поймете, что главное в профессии трейдера именно железная внутренняя дисциплина, а не какая-то суперсекретная система. Увы, большинство не сможет торговать по прибыльной стратегии, даже если получит её даром.

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

Именно для борьбы с подгонкой в тестере терминала MetaTrader 5 существует возможность форвардного тестирования на найденных при оптимизации параметрах системы. Если результаты форвард-тестирования торговой стратегии не сильно отличаются от результатов, полученных на участке оптимизации, то есть надежда, что торговый робот будет достаточно стабилен некоторое время после его запуска в онлайн-торговлю. Длина интервала для проведения оптимизации параметров и длительность этого «некоторого времени» зависят от конкретной торговой системы.

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

Иллюстрацией для такого примера могут служить результаты Чемпионата по автоматической торговле Automated Trading Championship, проводимого уже в течение многих лет. Все участники перед началом соревнований проходят автоматические проверки присланных экспертов — торговых роботов на интервале с января по конец июля. Главным требованием для прохождения такой проверки является полученная прибыль за восемь месяцев тестирования. Но менее половины допущенных к Чемпионату роботов остаются в плюсе после трехмесячной автономной работы.

Вы также можете попробовать свои силы в создании и правильной настройке своего торгового робота, чтобы принять участие в Чемпионате и получить результаты форвард-тестирования своего детища. Тем более что участие является бесплатным, а призы ощутимыми. Как говорится  — «Welcome»!

Заключение

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

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

Мы не даем здесь конкретных рекомендаций по изучению языка MQL4 или MQL5, на эту тему написано много других полезных статей. Цель данной публикации состояла в том, чтобы дать начальное представление о том, как и с чего начать создание собственного торгового робота для терминалов MetaTrader 4 и MetaTrader 5.

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

Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.

Как написать торгового робота: инструменты для начинающих

Время на прочтение
4 мин

Количество просмотров 28K

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

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

Варианты создания роботов

Существует несколько вариантов создания роботизированного софта для торговли на бирже:

  • Создание роботов для работы на прямом подключении – такие системы работают «в обход» торговой системы брокера, отправляя заявки напрямую в «движок» торговой системы биржи. Этот вариант используют уже опытные трейдеры, которые готовы платить в том числе и за такой способ подключения.
  • Подключение к брокерской торговой системе по API. Некоторые брокеры позволяют подключать внешний торговый софт к своим торговым системам по специальным интерфейсам. Клиенты ITI Capital могут делать это с помощью API SMARTcom. В этом случае роботы могут быть достаточно сложными.
  • Автоматизация операций напрямую в торговом терминале. Наиболее простой, подходящий для новичков способ, заключается в том, чтобы автоматизировать торговлю напрямую в базовой программе любого трейдера – терминале.

Сегодня мы будем рассматривать третий вариант, поскольку он наиболее прост.

Как это работало раньше

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

Меню для подключения Excel в одном из торговых терминалов прошлого поколения

Также распространенной практикой среди трейдеров было подключение к своим терминалам мощных систем технического анализа и разработки роботов вроде WealthLab и MetaStock. В таких случаях интеграция обычно осуществляется с помощью дополнительных библиотек.

В перечисленных случаях трейдер получал возможность автоматизации, и, в случае MetaStock и WealthLab, создания довольно сложных торговых систем, но связки с внешними программами часто оказывались ненадежными. С течением времени эта проблема была решена – в некоторых торговых терминалах появились встроенные языки программирования.

Как это работает теперь: изучаем язык TradeScript

В наши дни на российском рынке самый простой способ создать несложного торгового робота, работающего с системой брокера, это использование терминала SMARTx.

В нем есть специальный плагин с конструктором торговых роботов TradeScript. С помощью простого, но довольно мощного скриптового языка трейдеры могут создавать механические системы различного уровня сложности. Язык был изначально создан для разработки торговых роботов, он довольно прост в изучении, а многие алгоритмы схожи по написанию с Metastock, что облегчает работу пользователям, знакомым с этим программным пакетом.

Плюсом TradeScript по сравнению с Wealth-Lab и тем же Metastock является отсутствие необходимости создания сложных конструкций и использования различных коннекторов для передачи приказов в торговый терминал. Конструктор роботов встроен в SMARTx, что позволяет добиваться значительно более высокой надежности и быстродействия.

Вот пример торговой стратегии, записанной на TradeScript:

Buy Signals 

# Покупаем, если момент и инерция имеют однонаправленный тренд 

TREND(EMA(CLOSE, 20), 15) = UP AND 

TREND(MACD(13, 26, 9, SIMPLE), 5) = UP 

Sell Signals 

# Продаем, если момент и инерция имеют однонаправленный тренд 

TREND(EMA(CLOSE, 20), 15) = DOWN AND 

TREND(MACD(13, 26, 9, SIMPLE), 5) = DOWN 

Exit Long Signal 

# Выходим, если тренд инерции и момента имеет противоположное направления 

TREND(EMA(CLOSE, 20), 15) = DOWN OR 

TREND(MACD(13, 26, 9, SIMPLE), 5) = DOWN 

Exit Short Signal 

# Выходим, если тренд инерции и момента имеет противоположное направления 

TREND(EMA(CLOSE, 20), 15) = UP OR 

TREND(MACD(13, 26, 9, SIMPLE), 5) = UP

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

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

Что еще: отладка на тестовом доступе

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

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

Полезные ссылки по теме инвестиций и биржевой торговли:

  • Открыть брокерский счет онлайн
  • Тестовый счет с виртуальными деньгами
  • Софт для торговли на бирже: торговый терминал, мобильные приложения
  • Структурные продукты
  • Модельные портфели

Если вы задавались вопросом «Как написать советник на языке программирования MQL4», то данный пост создан именно для вас. Сегодня мы будем создавать самый простой из всевозможных советников для МТ4, который будет определять незамысловатое условие на вход, открывать ордер и модифицировать его цели.

Алгоритм программирования советника на MQL4

Выше представлена схема процесса работы торгового робота, который мы планируем написать. Любой советник должен иметь как минимум три функции обработки событий:

OnInit()

Она генерируется только один раз за время работы советника в самом начале. Нужна, чтобы внутри нее определить, рассчитать и задать те переменные и массивы данных, которые не нуждаются в дальнейшей корректировке по мере обновления тиков. То же самое касается и графических объектов. В советнике раздел OnInit выполняет ту же роль, что мы проходили в теме создания первого индикатора.

OnDeinit()

Функция вызывается советником только один раз перед непосредственным удалением его с графика. Она используется также и в индикаторах. Раздел OnDeinit нужен, чтобы подчистить график после советника, обнулить глобальные переменные и выдать окончательный расчет или текст пользователю. Более подробно мы ее проходили при создании первого индикатора.

OnTick()

Данная функция новая в наших уроках. Раздел OnTick генерирует события исключительно для экспертов и не может быть вызвана в индикаторах или скриптах. Ее тип данных void и набор параметров отсутствует. По своей логике работы она схожа с функцией для индикаторов OnCalculate,  только она не возвращает никакого значения после завершения. Задача у нее одна — запускаться каждый новый тик и проходить циклом весь написанный код в ней от начала до конца. Так как любой советник должен проверять условия для входа/выхода из рынка, считать количество открытых ордеров и выполнять их сопровождение, то можно уверенно сказать, что функция OnTick является самой важной в коде любого эксперта.

Продолжим разбирать алгоритм работы. Вначале советник инициализируется. Далее запускается функция OnTick, в которой выполняются все дальнейшие действия. Для данного советника сначала необходимо проверить наличие уже открытых им ордеров. Если они есть — дальнейший расчет и поиск условия на вход не выполняются, потому что в рынке у нас должен быть только один ордер за раз. Если же открытых сделок нет, то идет определение направления будущей позиции. В зависимости от него запускается пользовательская функция на открытие Buy или Sell ордера. Если по какой-то причине сделка не смогла открыться, расчет возвращается назад в функцию OnTick, чтобы попробовать выставить ордер снова. Если же ордер открылся, то он модифицируется (выставляется Тейк-Профит и Стоп-Лосс). На этом алгоритм заканчивает свою работу по работе с ордерами, потому что счетчик новых ордеров уже будет учитывать этот открывшийся ордер, делая проверку каждый тик. И только после того, как ордер закроется по достижению своей цели (ТП или СЛ), цикл проверки условия на открытие ордера запустится снова. Функция OnDeinit запустится только тогда, когда вы удалите советник с графика.

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

Торговая система «Монетка»

форекс тс монетка

Когда перед нами стоит вопрос «как создать Форекс советник», то в первую очередь в голову приходит мысль о торговой системе, заложенной в нем, логике открытия ордеров. Так как в этом уроке не стоит цель создать так называемый на сленге «Грааль», то для получения опыта в написании первого эксперта мы возьмем на вооружение самую простую ТС, которую только можно выдумать.

Период советника установим М15. Мы будем входить в рынок по воле случая, или, если хотите, удачи. Мы начнем условно подкидывать монетку и смотреть на результат этого несложного действия. Орел или Решка — только два исхода событий будет у советника. Вариант «ребро» в данном случае не рассматривается 🙂

Зачем использовать такую простую систему? Чтобы понять, что произойдет в результате этого эксперимента и ответить себе на вопрос: можно ли заработать на Форекс входя в рынок наобум? Получится ли прибыльно торговать не имея четко спланированной торговой системы?

Проверка советника на ошибки: GetLastError()

При написании советника (как и при его использовании) очень важно следить за возможными ошибками в коде. Речь идет не об ошибках компиляции, их вы можете увидеть во вкладке «Ошибки» окна «Инструменты». Разговор о скрытых ошибках, которые проявляют себя во время тестирования или работы советника на реальном счете. Проверку на эти ошибки нужно делать как минимум один раз за тик в функции обработки событий OnTick. Как максимум — в каждой вашей пользовательской функции.

Чтобы получить номер возможной ошибки, нужно вызвать функцию GetLastError(). Она имеет тип int и возвращает целое число, значение системной переменной _LastError. Тут нужно обратить внимание, что на языке MQL4 после вызова функции GetLastError ее значение обнуляется и повторный вызов ее в том же месте кода вернет значение 0, поэтому ее значение нужно сохранять в отдельную переменную.

Язык MQL различает как минимум 150 разных ошибок. Соответственно каждый возвращаемый номер имеет свою расшифровку. Ноль значит это ошибки нет и все отлично, 134 значит, что недостаточно денег на счете и т.д.

Чтобы получить примерную расшифровку ошибки на английском языке, нужно обратиться ко встроенной библиотекой stdlib.mq4, которая находится в папке Libraries терминала. Для этого нужно воспользоваться препроцессором включение файлов #include. Для этого прописываем импорт данной библиотеке в самом начале кода вне функций.

#property copyright «Copyright (c) DaVinci FX Group»

#property link «https://www.davinci-fx.com/»

#property version «1.00»

#property strict

#include <..Librariesstdlib.mq4> //библиотека для расшифровки ошибок

Теперь осталось прописать проверку в самом конце функции обработки событий OnTick()

int Error = GetLastError(); //поиск ошибок по завершению тика

if(Error != 0) Print(«OnTick() Error «,Error,«: «,ErrorDescription(Error));

В этом коде вначале сохраняется значение ошибки в переменную Error, далее проверяется, чтобы ошибка точно была (значение не было равно нулю) и если это так, то выводится принт в журнал с номером ошибки и ее расшифровка.

Напиши в комментариях, если вы хотите видеть более подробную расшифровку ошибок на русском языке в будущих уроках.

Пишем свой первый советник

Чтобы создать советник, нажмите «Файл»  — «Создать». Затем выберите вариант «Советник (шаблон)», клик по кнопке Далее, придумываете ему имя, гордо записывая себя, как автора и добавляете ссылку на ваш (или наш) сайт. Параметры добавлять не нужно, мы их пропишем вручную, тык по кнопке Далее. Обработчики событий нам не нужны, поэтому еще раз клик на Далее. Функция OnTester полезная при оптимизации сов, но в этом уроке она не понадобится (мы рассмотрим ее в будущих статьях). Жмем Готово.

Программа создаст стандартный шаблон из описания и трех функций обработки событий: OnInit, OnDeinit и OnTick.

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

  • Lot — торговый лот, с которым будет открываться ордер. По умолчанию задаем его минимальным. Тип переменной будет double, т.к. это лот не может быть целым числом.
  • Slippage — максимально допустимое проскальзывание в пунктах, больше которого ордер не будет открыт.
  • Stop Loss — Стоп Лосс (ограничение убытка) для каждого ордера советника. По умолчанию задается в пунктах.
  • Take Profit — Тейк Профит нужен для закрытие ордера при достижении заданной прибыли. По умолчанию задается в пунктах.
  • Comments — текстовый комментарий, с которым будет открыт ордер. Его можно будет увидеть в окнах «Торговля» и «История Счета» в столбце «Комментарий». Он полезен, если на счете торгует несколько советников, либо используется ручная торговля. Некоторые брокеры в комментарий прописывают проскальзывания при открытии конкретного ордера. Также он хранит информацию, если ордер был частично закрыт.
  • MagicNumber — номер (целое число), который задается всем ордерам конкретного советника, открытым по текущему символу. Магик нужен для того, чтобы советник мог отличить свои сделки от чужих. Для каждой пары и советника рекомендуется задавать свой уникальный магик. Ордера, открытые вручную имеют нулевой магик. Магик также можно увидеть на мониторинге сервисов MyFxBook или FxBlue, и сделать по нему фильтрацию.

Данные шесть параметров являются необходимыми даже для самого простого советника. Чтобы их можно было видеть при настройке советника, воспользуемся классом памяти extern, который определит наши переменные как внешние. Данный блок кода прописывается в самом начале редактора.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//+——————————————————————+

//| 3.0 Coin EA |

//| Copyright (c) DaVinci FX Group |

//| https://www.davinci-fx.com/ |

//+——————————————————————+

#property copyright «Copyright (c) DaVinci FX Group»

#property link «https://www.davinci-fx.com/»

#property version «1.00»

#property strict

#include <..Librariesstdlib.mq4>

extern string s0 = «<== General Settings ==>»; //> > >

extern double Lot = 0.01;

extern int Slippage = 5;

extern double StopLoss = 20;

extern double TakeProfit = 20;

extern string Comments = «DaVinci EA»;

extern int MagicNumber = 123123;

Переходим к функции OnInit. Так как на Форекс до сих пор существуют типы счетов с котировками, у которых разное количество знаков после запятой, то необходимо добавить проверку для тех параметров, значение которых указываются в пунктах. Изначально мы задали значения проскальзывания, Стоп Лосса и Тейк Профита в старых пунктах. Если же у валютной пары три знака (для JPY) или пять (для остальных валют) после запятой, то нам необходимо перевести старые пункты в новые, умножив это значение на десять.

int OnInit() {

if (Digits == 3 || Digits == 5) {

Slippage *= 10;

StopLoss *= 10;

TakeProfit *= 10;

}

return(INIT_SUCCEEDED);

}

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

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

Мы дошли до функции OnTick. В ней дальнейший код будет совершать свой цикл каждый тик. В соответствии со схемой работы нашего алгоритма вначале мы должны проверить, что в рынке нет открытых ордеров у данного советника. Для этого напишем пользовательскую функцию анализа сделок CountOrder().

Данный код не сложный. Его цель — пройтись циклом по всем открытым ордерам, выделяя каждый по очереди и проверяя, чтобы ордер был открыт по текущей валютной паре, а также с заданным в настройках магик номером. Дополнительно тип ордера должен быть рыночным. Если эти условия соблюдены, то счетчик ордеров советника прибавляет единицу и так до конца цикла. Функция возвращает суммарное значение найденных ордеров.

int CountOrder() {

int orders=0;

for(int i=OrdersTotal()-1;i>=0;i—){

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;

if(OrderSymbol() !=_Symbol || OrderMagicNumber() != MagicNumber) continue;

if(OrderType() > 1) continue;

orders++;

}

return orders;

}

Теперь эту функцию нужно добавить в тело OnTick и проверить условие, чтобы открытых ордеров не было.

void OnTick() {

if(CountOrder() == 0) { //проверка, чтобы не было открытых ордеров

// дальнейший код

}

int Error = GetLastError();

if(Error != 0) Print(«OnTick() Error «,Error,«: «,ErrorDescription(Error));

}

Далее нам необходимо определиться с направлением сделки. Как говорилось выше, мы будем входить по системе «Монетка», т.е. нам нужно рандомно (наугад) определить направление входа. С этим поможет справиться функция MathRand(), она возвращает псевдослучайное целое число в диапазоне от 0 до 32767. Так как нам нужно получить только два значения: 0 (для покупок) или 1 (для продаж), то просто добавим знак %, с помощью которого получим остаток от деления на 2. Каждый тик результат будет случайно определяться между 0 и 1.

int TradeDirection = MathRand()%2; //поиск рандомного направления сделки

Пользовательская функция OpenTrade()

С условием на вход определились, осталось в зависимости от него осуществить покупку или продажу. Для этого введем еще одну пользовательскую функцию OpenTrade(). Ей будет передаваться один параметр — направление на вход. В зависимости от направления сделки нужно определить:

  • Price — цена открытия ордера. Рыночные ордера на покупку открываются по цене Ask, а закрываются по цене Bid. И наоборот, рыночные ордера на продажу открываются по цене Bid, и закрываются по цене Ask.
  • Цвет стрелочки да пометки открытия ордера на графике. По обычаю покупки имеют синий цвет, продажи красный.
  • Текст для открытия ордера.

Для упрощения работы мы воспользуемся условным оператором ? 

bool OpenTrade(int OP_Type) {

double price = (OP_Type == OP_BUY ? Ask : Bid);

color col_type = (OP_Type == OP_BUY ? clrBlue : clrRed);

string op_str = (OP_Type == OP_BUY ? «на покупку» : «на продажу»);

Print(«Открываем ордер « + op_str);

//дальнейший код

return(false);

}

Переходим к самой главной торговой функции OrderSend. Она и отвечает за открытие рыночного или отложенного ордера. Имеет тип данных int и возвращает тикет открытого ордера в случае успешного выполнения, либо же ноль в случае неудачи. Функция имеет ряд параметров, которые ей необходимо передать:

  • symbol — символ, по которому необходимо открыть ордер. Текущий символ задается как Symbol().
  • cmd — торговая операция, т.е. один из шести типов ордера, который нужно открыть: рыночные (buy или sell) и отложенные (buylimit, selllimit, buystop, sellstop).
  • volume — размер торгового лота.
  • price — цена открытия ордера. Для рыночных ордеров нами она рассчитана выше.
  • slippage — проскальзывание в пунктах, берется из внешней переменной.
  • stoploss — Стоп Лосс рассчитанный по цене котировок.
  • takeprofit — Тейк Профит рассчитанный по цене котировок.
  • comment — комментарий к ордеру, берется из внешней переменной.
  • magic — магик номер, берется из внешней переменной.
  • expiration — срок жизни ордера. Нужен только для отложенных ордеров, поэтому оставляется равный нулю.
  • arrow_color — цвет стрелочки на графике при открытии ордера.

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

int ticket = OrderSend(Symbol(), OP_Type, Lot, price, Slippage, 0, 0, Comments, MagicNumber, 0, col_type);

Пометка: после появления современных технологий торговли, таких как ECN, STP и NDD, цели для ордера нельзя выставлять сразу при подаче заявки на открытие ордера. Его нужно модифицировать только после успешного открытия сделки. Для старых типов счетов можно задать его сразу, но зачем, когда можно провести модификацию и после.

Ордер открылся, теперь ему необходимо выставить цели (Тейк Профит и Стоп Лосс) в случае, если он сработал без ошибок. Для этого данный ордер нужно выделить по номеру тикета с помощью функции OrderSelect.

Для расчета цены Стоп Лосса по текущим котировкам:

  • для покупок от текущей цены открытия ордера (OrderOpenPrice) вычитаем значение переменной StopLoss, умноженной на Point.
  • для продаж к текущей цене открытия ордера (OrderOpenPrice) прибавляем значение переменной StopLoss, умноженной на Point.

Для расчета цены Тейк Профит по текущим котировкам:

  • для покупок к текущей цене открытия ордера прибавляем значение переменной TakeProfit, умноженной на Point.
  • для продаж от текущей цены открытия ордера вычитаем значение переменной TakeProfit, умноженной на Point.

Модификацию выполняем с помощью торговой функции OrderModify. Она содержит почти такие же параметры, как и функция OrderSend, плюс ей передается номер тикета ордера, который нужно модифицировать.

Собрав все описанное выше вместе у нас получается готовая пользовательская функция для открытия и модификации ордера.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

bool OpenTrade(int OP_Type) {

double price = (OP_Type == OP_BUY ? Ask : Bid);

color col_type = (OP_Type == OP_BUY ? clrBlue : clrRed);

string op_str = (OP_Type == OP_BUY ? «на покупку» : «на продажу»);

Print(«Открываем ордер « + op_str);

int ticket = OrderSend(Symbol(), OP_Type, Lot, price, Slippage, 0, 0, Comments, MagicNumber, 0, col_type);

if(ticket > 0) { //Если ордер был открыт

if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) {

double SL = 0, TP = 0;

if(OP_Type == OP_BUY) {

SL = OrderOpenPrice()-StopLoss*Point;

TP = OrderOpenPrice()+TakeProfit*Point;

}

else {

SL = OrderOpenPrice()+StopLoss*Point;

TP = OrderOpenPrice()-TakeProfit*Point;

}

Print(«Модифицируем ордер « + op_str);

if(!OrderModify(ticket, price, SL, TP, 0, clrNONE)) {

int Error = GetLastError();

Print(«Ошибка модификации ордера «,Error,«: «,ErrorDescription(Error));

}

else return(true);

}

}

else {

int Error = GetLastError();

Print(«Ошибка открытия ордера «,Error,«: «,ErrorDescription(Error));

}

return(false);

}

Соответственно, у нас определяется цена открытия ордера, цвет и текст. Далее открывается ордер и, если его тикет больше нуля, тогда в бой вступает расчет целей для ордера в значении котировок на графике. Затем происходит попытка модифицировать ордер, и если все прошло гладко, то функция OpenTrade вернет true, иначе же выдаст принт об ошибке и ее номер с расшифровкой. Если же ордер не открылся — советник также выдаст принт об ошибке и попытается произвести открытие на следующем тике.

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

void OnTick() {

if(CountOrder() == 0) { //проверка, чтобы не было открытых ордеров

int TradeDirection = MathRand()%2; //поиск рандомного направления сделки

if(TradeDirection == OP_BUY) {

if(OpenTrade(OP_BUY)) Print(«Ордер на покупку открыт и модифицирован»);

}

else if(TradeDirection == OP_SELL) {

if(OpenTrade(OP_SELL)) Print(«Ордер на продажу открыт и модифицирован»);

}

}

int Error = GetLastError(); //поиск ошибок по завершению тика

if(Error != 0) Print(«OnTick() Error «,Error,«: «,ErrorDescription(Error));

}

Проверка советника в тестере

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

Хочу заметить, что раз вы взялись за изучение программирования на MQL4, то при тестировании самый основной режим для вас всегда будет режим визуализации. Только так можно найти и устранить основные ошибки в первоначальной логике кода. Визуализация плотно совмещается с работой с журналом. График и огромное количество ваших принтов смогут помочь найти большинство ошибок.

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

Все выглядит хорошо, значит делаем вывод, что код написан без ошибок. По крайней мере видимых.

Посмотрим на график тестирования системы «Монетка» и сделаем выводы.

Заключение

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

Одной из целей данного урока было доказать, что необдуманная торговля не в состоянии принести прибыль. В данном примере мы использовали рандомный вход с абсолютно одинаковыми ТП и СЛ, равными 20 пунктов каждый. Т.е. при таком раскладе, если 55% сделок были бы прибыльными, то график доходности шел вверх. В нашем случае кривая прибыли нацелена строго вниз, что говорит нам самую простую истину: вы никогда не заработаете на рынке, если у вас не будет четкой и строго сформулированной торговой системы. Форекс это далеко не казино и на волю случая тут нельзя полагаться. Без четких правил входа, сопровождения ордеров и выхода из сделки вас ждет неудача.

На этом все, код советника приложен ниже. Если пост был вам полезен, то вы знаете, что делать! Оставляйте комментарии и делитесь им в тематических сообществах. Всем профитов!

0. Начало работы

Блог для успешных трейдеров на рынке Форекс. Полезный сайт о Forex — DaVinci FX Group.

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

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

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

 Программы для создания советников на МТ4 и МТ5

Как можно создать советник?

Обзор начнем с краткого описания всех возможных способов (возможно, вам и не придется разбираться с программами). Создать торговый робот можно:

• написав его самостоятельно в Meta Editor – хардкорный вариант. Сюда же занесем и модификацию кода уже существующего робота;

• заплатив программисту – самый реальный вариант. Если бот сложный с множеством условий для входа, а у вас нет опыта в написании АТС, то лучше всего купить чужой опыт. Соответствующих объявлений полно на профильных форумах;

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

Перед тем как приступать к самостоятельной работе над советником рекомендуем еще раз все обдумать. Это не такая простая задача как кажется на первый взгляд даже если вы будете использовать специальную программу.

Краткий обзор программ для написания торговых роботов

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

торговые стратегии

Forex strategy builder

Мощный инструмент, программа платная, но в ознакомительных целях с сайта forexsb.com можно скачать демо-версию. На ознакомление дается всего 15 дней, повторно воспользоваться триальной версией можно будет только с другого ПК. Работать FSB будет только если у вас установлен МетаТрейдер, дело в том, что программа использует базу данных из МТ4.

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

 Программы для создания советников на МТ4 и МТ5

При создании советника рабочее пространство программы делится на 3 зоны:

• левая часть экрана – краткое описание стратегии;

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

 Программы для создания советников на МТ4 и МТ5

• правая часть экрана – результаты тестирования советника на исторических данных, импортированных из торгового терминала.

Находясь в Editor можно выделив каждый из блоков редактировать его значения. Например, изменить период скользящей средней, период индикатора, положение уровней и т. д. Можно добавить дополнительные условия для входа нажав на «Add an opening logic condition» и условия для выхода из рынка нажав на «Add a closing logic condition».

Программы для создания советников на МТ4 и МТ5

В разделе review вся информация по работе советника истории. Доступны такие пункты:

• overview – так как в примере рассматривается один из готовых советников, загруженных в базу программы, то здесь можно ознакомиться с подробным описанием советника;

• balance chart – график изменения депозита при тестировании алгоритма. В нашем примере видно, что робота неспособен обеспечить прибыль на тестовом участке истории;

 Программы для создания советников на МТ4 и МТ5

• indicator chart – график выбранного инструмента, на котором будут отображаться сделки, совершенные при тестировании. Примерно то же самое увидит трейдер при тестировании советника в МТ4/МТ5 при активированном параметре «Визуализация». Это полезно если вы хотите изучить в полной ли мере соответствует работа советника тому, что вы задумывали;

 Программы для создания советников на МТ4 и МТ5

• journal – в журнале записывается каждое действие робота при тестировании на исторических данных.

Есть пара полезных разделов и во вкладке Analysis:

• comparator – выбирается метод бэктеста. Здесь можно ничего не делать, оставить все как есть;

• multimarkets – в отличие от стандартного тестера в том же МетаТрейдере4 здесь можно выполнить тестирование сразу по нескольким парам. Результаты отображаются в виде графика в одном и том же окне;

 Программы для создания советников на МТ4 и МТ5

•monte carlo – еще один раздел, посвященный тестированию. Его можно не трогать.

Перед тем как тестировать робот на истории рекомендуем подгрузить историю из МетаТрейдера. Для этого перейдите в Market-Download History Data-MT4 HST Import.

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

 Программы для создания советников на МТ4 и МТ5

Что касается программы в целом, то для новичков она особо ценна по той причине, что не требует написания ни единой строчки кода. Даже блок-схему робота создавать не нужно как это сделано в ряде аналогов. С другой стороны, она все же платная, а это может многих отпугнуть, проще вложить деньги в толкового программиста, который напишет вам советник с нуля.

робот бесплатно

Ensed Cor

По сравнению с предыдущей программой Ensed Cor выглядит чуть менее удобной в использовании. Да и составить костяк советника так же просто как в FSB не получится. Как и в случае с FSB доступ к полному функционалу можно получить только оплатив подписку на сайте авторов. Но для ознакомления с возможностями программы подойдет и бесплатная версия Ensed Cor.

Из ограничений бесплатной версии отметим только невозможность работать с пользовательскими индикаторами, шаблонами. Не все файлы проектов программы будут доступными, но созданию индикаторов ничто мешать не будет.

Перед началом работы нужно будет указать каталог МТ4. Enser Cod будет использовать все индикаторы, которые на данный момент содержаться в папке Indicators (в демо-версии реализована поддержка только стандартного инструментария МетаТрейдера).

Работу в программе рассмотрим на примере создания простенького торгового робота:

• при первом запуске указываем каталог терминала МТ4;

 Программы для создания советников на МТ4 и МТ5

• после этого открывается окно программы и сразу можно приступать к созданию робота.

 

Сперва опишем принцип работы нашего советника текстом, для лучшего понимания работы алгоритма. Предположим, в работе будут использоваться только 2 индикатора – Стохастик и скользящая средняя. Покупки выполняем при условии, что осциллятор находится в зоне перепроданности, а ценовой график находится над мувингом. Продажи – при зеркальных условиях.

Составляем алгоритм:

• в основном поле программы будут отображаться условия, использующиеся в работе советника. Индикаторы находятся в правой части, добавить на график их можно просто перетащив нужный на основное поле. Откроется окно с настройками, изменить параметры индикаторов можно и позже. На скриншоте ниже записаны условия для покупок, не забывайте только объединять их в одно целое;

 Программы для создания советников на МТ4 и МТ5

• по той же схеме записываем условия для открытия коротких позиций. Теперь мувинг должен быть над ценой, а Стохастик находится в зоне перекупленности;

 Программы для создания советников на МТ4 и МТ5

• теперь нужно указать условия для выхода из сделок. Предположим, что наш робот будет закрывать покупки при выполнении одного из 2 условий: Параболик со стандартными настройками переходит под график, цена пересекает скользящую среднюю сверху-вниз. Достаточно выполнение одного из этих условий, поэтому используем условие «или»;

 Программы для создания советников на МТ4 и МТ5

• по той же схеме задаем и условия для закрытия коротких позиций. Правила зеркальные – Параболик должен быть под ценой либо график должен пересечь мувинг по направлению снизу-вверх;

 Программы для создания советников на МТ4 и МТ5

• настройки робота – здесь задаются такие параметры как стоп-лосс, тейк-профит, будет вестись торговля фиксированным лотом либо будет использоваться мартингейл. Можно отметить пункт «автоучет знаков после запятой», в таком случае разрядность котировок советником будет определяться автоматически. Также задаются настройки мартингейла, будет ли переноситься стоп-лосс в безубыток и на каком уровне.

 Программы для создания советников на МТ4 и МТ5

Теперь можно сохранить робота, причем автоматически при сохранении будет выбрана папка Experts в нужном каталоге. После перезапуска терминала наш советник появляется в перечне роботов в МетаТрейдер4. В MetaEditor при желании можно просмотреть код робота.

 Программы для создания советников на МТ4 и МТ5

В целом, программа хотя и выглядит намного проще, чем FSB, но со своей задачей справляется. Создавать простые советники действительно легко. Проблема только в том, что функционал бесплатной версии ограничен, а продажу доступа к полноценной версии авторы временно ограничили. Можно поискать крякнутые версии Enser Cod, но нет гарантии, что работать она будет нормально.

Expert Advisor Visual Wizard

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

Процесс создания робота выглядит так:

• после открытия программы нужно будет указать путь к корневому каталогу МТ5, это ПО предназначено именно для создания ботов для МетаТрейдера5. Благодаря этому программа сможет работать не только со стандартными индикаторами, но и со всеми пользовательскими алгоритмами, которые трейдер сам установил в терминал;

• на график нужно будет добавить 2 кнопки Technical Analysis – для задания условий на покупку и продажу. Двойным щелчком по кнопке открывается окно, в котором выбираются нужные индикаторы, задаются условия для входа. Например, можно выбрать вход в рынок на пересечении 2 мувингов, выхода Стохастика из зон перепроданности/перекупленности и т. д.;

 Программы для создания советников на МТ4 и МТ5

• потом добавляются блоки купить/продать, в них задаются параметры сделок – величина лота, стоп-лосс и тейк-профит.

В конце концов алгоритм советника будет выглядеть примерно так – обычная блок схема, но в ней каждый блок отвечает за определенные условия торговли. Например, за покупку/продажу и т. д.

 Программы для создания советников на МТ4 и МТ5

На скриншоте выше – пример примитивнейшего советника на основе Стохастика. Его можно сохранить в нужном для МТ5 формате, загрузить в терминал и тут же испытывать на истории. В самой программе для создания возможности протестировать советник нет.

Недостатки программ для создания советников

Такое ПО можно сравнить с костылями, ходить то они позволят, но это будет нечто далекое от ходьбы нормального человека. Такое ПО неспособно на 100% заменить все те возможности, которые имеются в распоряжении программиста, когда он пишет код робота с нуля.

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

Например, если в советнике нужно применить ВВ к индикатору RSI, программы это реализовать не смогут. Есть проблема с использованием свечных паттернов, паттернов Price Action, уровней Фибо и т. д.

Заключение

Программы для создания советников хороши только в тех случаях, когда нужно написать простой советник на основе индикаторов. Если ваши требования выходят за пределы этого ТЗ, в алгоритме нужно использовать свечные и графические паттерны, то придется обращаться за помощью к специалистам. Иного способа пока что нет, даже лучшая программа такого типа (Forex strategy builder) существенно уступает возможностям программиста.

Программы для создания советников на МТ4 и МТ5

Возможно, Вам будут интересны следующие обзоры:

• Преимущества и недостатки принципов диверсификации в бизнесе

• Как мыслить, чтобы стать богатым

• Почему я считаю Форекс обучение – самым большим обманом в истории

• Какими бывают источники финансирования инвестиций

• Обзор брокера FinmaxFX – торговые условия нового форекс брокера

В этом руководстве по MQL4 вы научитесь программировать свой собственный торговый советник в MetaEditor.

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

  • int — это обычное число. Например: 1, 15, 521.
  • double — число с десятичным знаком. Например: 1,154, 0,0144, 255,145.
  • string — строка, слово, фраза. Например: «Ордер на покупку», «Ордер на продажу успешно размещен».
  • bool — принимает значения либо false, либо true.

Скоро вы увидите, как их можно использовать.

Торговый советник три белых солдата

Для того, чтобы создать свой собственный торговый советник, для начала вы должны переключиться на MetaEditor. Вы смоете сделать это, нажав на иконку MetaEditor. В MetaEditor нажмите «Создать» и выберите «Советник (шаблон)». В следующем окне напишем имя нашего эксперта, нажмем на кнопку «Далее» и добавим первые стандартные переменные, нажав на кнопку «Добавить».

Мы добавим TakeProfit, StopLoss, LotSize, Slippage и MagicNumber. Все они являются типом int, кроме LotSize. LotSize должен иметь тип double.

мой торговый советник

Затем нажимаем «Далее» и «Готово». Мы видим, что MetaEditor сгенерировал файл с вашими предопределенными переменными.

Вы можете увидеть 3 области. Области OnInit(), OnDeinit() и OnTick(). Весь код, который вы пишете, попадает в одну из этих областей.

Код, который мы хотим вызвать, если прикрепим советник к графику, выполняется в области OnInit(). Код в OnDeinit() выполняется, когда мы отсоединяем советник. И, наконец, область, в которой мы будем работать больше всего — область OnTick(). Функция OnTick() вызывается каждый раз, когда мы получаем от брокера новую цену (тик) торгового инструмента, к которому прикреплен советник.

Если вы скомпилируете советника с помощью F7 и вернетесь в Metatrader, вы сможете найти советника в «Навигаторе» MetaTrader (Crtl + N). Если вы попытаетесь присоединить его к графику и перейдете на вкладку «Входные параметры», вы сможете увидеть наши предопределенные переменные.

торговый советник: входные параметры

Мы научимся программировать советника, который торгует по паттерну 3 белых солдата. Это простая стратегия, когда советник открывает сделку на покупку, когда последние 3 свечи были бычьими. Давайте начнем!

Добавим следующие строчки кода:

void OnTick() { 
if(Close[1] &gt; Open[1] &amp;&amp; Close[2] &gt; Open[2] &amp;&amp; Close[3] &gt; Open[3]) { //Ордер на покупку } 
}

Для этой стратегии мы используем предопределенную переменную Close[], который является типом double. Close[] дает нам цену закрытия (например, 1.24577) для каждого свечи текущего графика. Close[0] означает текущую цену закрытия. Close[1] — предыдущую цену, и так далее. То же самое справедливо для предопределенных переменных Open[], Low[] и High[].

//Ордер на покупку — это подсказка для нас, что мы создали здесь функцию открытия ордера на покупку. Две обратных черты (//) означают, что эта строка закомментирована. Советник будет игнорировать ее при компиляции.

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

Далее мы используем функцию OrderSend, чтобы отправить ордер на покупку нашему брокеру. Добавим следующий код:

if(Close[1] > Open[1] && Close[2] > Open[2] && Close[3] > Open[3])
      {
         //Ордер на покупку
         OrderSend(_Symbol,OP_BUY,LotSize,Ask,Slippage,Ask-StopLoss*_Point,Ask+TakeProfit*_Point,"Покупка",MagicNumber);
      }

Что из себя представляет функция OrderSend?

  • _Symbol — возвращает текущий торговый инструмент, к которому прикреплен советник.
  • OP_BUY — мы хотим открыть ордер на покупку.
  • LotSize — размер лота, который мы определили в самом начале.
  • Ask — текущая цена Ask, по которой открываются ордера на покупку.
  • Slippage — размер проскальзывания.
  • StopLoss — это наш StopLoss. Или цена Ask за вычетом цены StopLoss. Запомните, что StopLoss — это целое число (500 пунктов), а Ask — это цена (например, 1.20521). Теперь, чтобы вычесть стоп-лосс из цены Ask, мы должны умножить его на 0,00001 или 0,001. Мы делаем это с помощью предопределенной переменной _Point, которая отражает текущие значением пунктов торгового инструмента.
  • TakeProfit — то же самое, как и StopLoss.
  • Комментарий — комментарий, который должен появиться в журнале, когда торговый советник разместит наш ордер.
  • MagicNumer — магическое число, которое было определено нами вначале.

Нажмите F7, чтобы скомпилировать советник и проверить результат его работы в тестере стратегий. Вы получите что-то вроде этого:

торговый советник открывает ордера на каждом тике

Наш торговый советник выставляет ордера на покупку на каждом тике, если 3 последних бара были бычьими. Это не то что мы хотим, но, по крайней мере, что-то происходит.

Мы должны запрограммировать новую функцию, которая позволит нашему советнику одновременно открывать только одну сделку. MQL4 уже имеет свои предопределенные функции, например, OrderSend(). Но мы также можем написать свою собственную функцию, в которой мы можем вызвать другие пользовательские или предопределенные функции.

Давайте перейдем к концу нашего файла и запрограммируем новую функцию под названием TotalOpenOrders. Эта функция будет иметь тип int. Она будет возвращать количество открытых ордеров.

int TotalOpenOrders()
{
   int total_orders = 0;
 
   for(int order = 0; order < OrdersTotal(); order++) 
   {
      if(OrderSelect(order,SELECT_BY_POS,MODE_TRADES)==false) break;
 
      if(OrderMagicNumber() == MagicNumber && OrderSymbol() == _Symbol)
         {
            total_orders++;
         }
   }
 
   return(total_orders);
}

Затем добавим данную функцию в область OnTick и добавим проверку на количество открытых ордеров. Если общее количество сделок равно 0, наш торговый советник продолжает свою работу с кодом внутри скобок.

   if(TotalOpenOrders() == 0)
   { 
      if(Close[1] > Open[1] && Close[2] > Open[2] && Close[3] > Open[3])
      {
         //Ордер на покупку         
OrderSend(_Symbol,OP_BUY,LotSize,Ask,Slippage,Ask-StopLoss*_Point,Ask+TakeProfit*_Point),"Покупка",MagicNumber);
      }
   }

торговый советник открывает только один ордер

Что из себя представляет функция TotalOpenOrders?

В этой функции у нас есть счетчик (total_orders), который в конце возвращает общее количество открытых ордеров. Также у нас есть цикл for, который перебирает все открытые ордера. Если советник найдет ордер, соответствующий вашему символу и MagicNumer, счетчик увеличится на 1 (это записывается с помощью ++).

Теперь у нас все еще есть проблема. Если свеча слишком длинная, советник открывает вторую сделку на покупку непосредственно после того, как первая сделка на покупку закрывается с помощью StopLoss или TakeProfit. Мы должны добавить вторую функцию «IsNewBar».

Эта функция будет представлять тип bool. Она вернет true, если в Metatrader сгенерирована новая свеча, иначе она вернет false.

Давайте поместим эту функцию прямо над функцией TotalOpenOrder и вызовем ее в области OnTick вместе с TotalOpenOrders().

void OnTick()
  {
//---
 
   if(TotalOpenOrders() == 0 && IsNewBar() == true)
   { 
      if(Close[1] > Open[1] && Close[2] > Open[2] && Close[3] > Open[3])
      {
         //Ордер на покупку
         OrderSend(_Symbol,OP_BUY,LotSize,Ask,Slippage,Ask-StopLoss*_Point,Ask+TakeProfit*_Point,"Покупка",MagicNumber);
      }
   }
 
  }
//+------------------------------------------------------------------+
 
//Проверка новой свечи
bool IsNewBar()   
{        
      static datetime RegBarTime=0;
      datetime ThisBarTime = Time[0];
 
      if (ThisBarTime == RegBarTime)
      {
         return(false);
      }
      else
      {
         RegBarTime = ThisBarTime;
         return(true);
      }
}   
 
// Возвращаем количество открытых ордеров
int TotalOpenOrders()
{
   int total_orders = 0;
 
   for(int order = 0; order < OrdersTotal(); order++) 
   {
      if(OrderSelect(order,SELECT_BY_POS,MODE_TRADES)==false) break;
 
      if(OrderMagicNumber() == MagicNumber && OrderSymbol() == _Symbol)
         {
            total_orders++;
         }
   }
 
   return(total_orders);
}

4-5 или 2-3 значные котировки

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

Сейчас мы используем предопределенную переменную _Point для преобразования TakeProfit и StopLoss. Но мы хотим создать функцию, которая предоставит нам одинаковое значение для 4 и 5 и соответственно 2-х и 3-х торговых инструментов. Для начала мы создаем глобальные переменные MyPoint и MySlippage. Поместим их прямо под нашими входными параметрами:

//--- глобальные переменные
double MyPoint;
int    MySlippage;

Теперь мы создаем функцию, которая сохраняет правильное значение в этих 2 переменных (MyPoint и MySlippage) и помещаем их в наши пользовательские функции:

//Получаем My Points   
double MyPoint()
{
   double CalcPoint = 0;
 
   if(_Digits == 2 || _Digits == 3) CalcPoint = 0.01;
   else if(_Digits == 4 || _Digits == 5) CalcPoint = 0.0001;
 
   return(CalcPoint);
}
 
 
//Получаем My Slippage
double MySlippage()
{
   double CalcSlippage = 0;
 
   if(_Digits == 2 || _Digits == 4) CalcSlippage = Slippage;
   else if(_Digits == 3 || _Digits == 5) CalcSlippage = Slippage * 10;
 
   return(CalcSlippage);
}

Мы должны рассчитать эти значения только один раз. Только когда мы прикрепляем наш торговый советник к графику. Поэтому мы вызываем эти функции в разделе OnInit():

int OnInit()
  {
//---
   MyPoint = MyPoint();
   MySlippage = MySlippage();
 
//---
   return(INIT_SUCCEEDED);
  }

Теперь мы можем возвратить наши TakeProfit, StopLoss и Slippage к номальным значениям:

//--- входные параметры
input int      TakeProfit=50;
input int      StopLoss=50;
input double   LotSize=0.1;
input int      Slippage=3;
input int      MagicNumber=5555;

Далее мы заменяем все Slippage и _Point в функциях OnTick нашими 2 новыми глобальными переменными MyPoint и MySlippage. Таким образом, функция OrderSend будут выглядеть следующим образом:

//Ордер на покупку
OrderSend(_Symbol,OP_BUY,LotSize,Ask,MySlippage,Ask-StopLoss*MyPoint,Ask+TakeProfit*MyPoint,"Ордер на покупку",MagicNumber);

Торговый советник и ECN брокеры

На ECN брокерах мы не можем отправить ордер с TakeProfit или StopLoss. Сначала нам придется отправить наш ордер без них, а затем изменить его.

Сначала мы сохраняем номер тикета из только что открытого ордера в переменной int ticket. Затем мы проверяем, получен ли мы данный ticket от нашего брокера. Далее мы вызываем функцию OrderModify. Функция OrderModify возвращает true или false, которые мы сохраняем в переменной bool res. Мы проверяем результат с помощью if (! Res) (так же, как if (res == false)) и выводим соответствующее сообщение.

   if(TotalOpenOrders() == 0 && IsNewBar() == true)
   { 
      // Buy Logic
      if(Close[1] > Open[1] && Close[2] > Open[2] && Close[3] > Open[3])
      {
         //Ордер на покупку
         int ticket = OrderSend(_Symbol,OP_BUY,LotSize,Ask,MySlippage,0,0,"Ордер на покупку",MagicNumber);
            if(ticket<0)
            {
               Print("Ошибка #",GetLastError());
            }
            else
            {
               Print("Ордер размещен успешно");
            }
 
         // Изменяем наш ордер
         bool res = OrderModify(ticket,OrderOpenPrice(),Ask-StopLoss*MyPoint,Ask+TakeProfit*MyPoint,0,Blue);
            if(!res)
            {
               Print("Ошибка=",GetLastError());
            }
            else
            {
               Print("Ордер изменем успешно.");
            }
      }

Теперь наш код будет работать на всех ECN и не ECN брокерах.

Очистим наш код

Наш исходный код выглядит сейчас слишком сложным. Но мы можем его упростить. Для этого мы помещаем торговую логику и OpenOrder / ModifyOrder в пользовательскую функцию и вызываем ее в области OnTick().

   if(TotalOpenOrders() == 0 && IsNewBar() == true)
   { 
      // Проверяем параметры на вход
      if(BuySignal() == true)
         {
            OpenBuy();
         }
         }

Добавляем индикаторы

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

Во-первых, нам нужны глобальные переменные для хранения значений наших индикаторов, чтобы мы могли работать с ними позже. Добавим их после MyPoint и MySlippage:

//--- индикаторы
double RSI;
double MA;

Теперь нам нужно создать функцию, которая будет возвращать текущую цену наших индикаторов и далее сохранить ее в наших предопределенных переменных. Добавим их в области пользовательских функций нашего кода:

//Инициализируем индикаторы.
void InitIndicators()
{
   // Индикатор RSI
   RSI = iRSI(_Symbol,PERIOD_CURRENT,14,PRICE_CLOSE,1);
 
   // Скользящая средняя
   MA = iMA(_Symbol,PERIOD_CURRENT,200,0,MODE_SMA,PRICE_CLOSE,1);
}

Мы вызываем функции iRSI и iMA и сохраняем эти цены в переменных. В обоих функциях мы сначала используем текущий символ и таймфрейм, для которых мы хотим получить показания индикаторов. В нашем случае это символ и таймфрейм (период), к которому мы прикрепляем советник.

Для RSI мы хотим, чтобы период 14 рассчитывался по цене закрытия. Скользящая средняя должна быть периодом 200, Сдвиг 0. Что такое 1 в конце? Здесь мы определяем, от какой свечи мы хотим получать эти значения. 0 означает текущую свечу, 1 — предыдущую и т. д.

Чтобы эта функция работала, мы должны вызывать ее в разделе OnTick:

   if(TotalOpenOrders() == 0 && IsNewBar() == true)
   { 
      // Инициализируем индикаторы
      InitIndicators();
 
      // Сигнал на вход
      if(BuySignal() == true)
         {
            OpenBuy();
         }
   }

Теперь у нас есть все необходимые значения для создания нашей логики входа. Мы хотим открыть ордер на покупку, если RSI находится ниже уровня 30, а минимум предыдущей свечи находится выше скользящей средней:

// Вход на покупку
bool BuySignal()
{
   if(RSI <= 30 && Low[1] >= MA)
   {
      return(true);
   }
   else
   {
      return(false);
   }
}

Изменяем параметры индикаторов

На данный момент, если мы хотим изменить, скажем, период RSI от 14 до 20, мы должны сделать это в исходном коде. Теперь я покажу вам, как вы можете изменить все параметры индикаторов как обычный входной параметр в Свойствах эксперта. Для этого мы пишем:

//--- входные параметры
input int            TakeProfit=50;
input int            StopLoss=50;
input double         LotSize=0.1;
input int            Slippage=3;
input int            MagicNumber=5555;
 
//--- индикаторы
sinput string        indi = "";                // ------ Индикаторы -----  
input int            RSI_Period = 14;          // RSI период
input int            RSI_Level  = 30;          // Значение RSI
input int            MA_Period  = 200;         // MA период
input ENUM_MA_METHOD MA_Method  = MODE_SMA;    // MA метод

Теперь мы должны связать эти параметры с нашими индикаторами и торговой логикой. Для этого мы изменим наш код на следующий:

 // индикатор RSI
   RSI = iRSI(_Symbol,PERIOD_CURRENT,RSI_Period,PRICE_CLOSE,1);
 
   // Скользящая средняя
   MA = iMA(_Symbol,PERIOD_CURRENT,MA_Period,0,MA_Method,PRICE_CLOSE,1);
   if(RSI &lt;= RSI_Level &amp;&amp; Low[1] &gt;= MA)

Вот полный код нашего первого торгового советника:

//+------------------------------------------------------------------+
//|                                                  My First EA.mq4 |
//|                                     
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "https://traderblog.net/"
#property link      "https://traderblog.net/"
#property strict
 
//--- входные параметры
input int            TakeProfit=50;
input int            StopLoss=50;
input double         LotSize=0.1;
input int            Slippage=3;
input int            MagicNumber=5555;
 
//--- индикаторы
sinput string        indi = "";                // ------ Индикаторы -----  
input int            RSI_Period = 14;          // RSI период
input int            RSI_Level  = 30;          // Значение RSI
input int            MA_Period  = 200;         // MA период
input ENUM_MA_METHOD MA_Method  = MODE_SMA;    // MA метод
 
//--- глобальные переменные
double MyPoint;
int    MySlippage;
 
//--- индикаторы
double RSI;
double MA;
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MyPoint = MyPoint();
   MySlippage = MySlippage();
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
   if(TotalOpenOrders() == 0 && IsNewBar() == true)
   { 
      // Инициализиуем индикаторы
      InitIndicators();
 
      // Проверяем ордер на покупку
      if(BuySignal() == true)
         {
            OpenBuy();
         }
 
   }
 
  }
//+------------------------------------------------------------------+
//| Пользовательские функции                                           
//+------------------------------------------------------------------+
 
 
// Инициализируем индикаторы
void InitIndicators()
{
   // индикатор RSI
   RSI = iRSI(_Symbol,PERIOD_CURRENT,RSI_Period,PRICE_CLOSE,1);
 
   // Скользящая средняя
   MA = iMA(_Symbol,PERIOD_CURRENT,MA_Period,0,MA_Method,PRICE_CLOSE,1);
}
 
 
// Логика на покупку
bool BuySignal()
{
   if(RSI <= RSI_Level && Low[1] >= MA)
   {
      return(true);
   }
   else
   {
      return(false);
   }
} 
 
// Размещаем ордер на покупку
void OpenBuy()
{
   // Open Buy Order
   int ticket = OrderSend(_Symbol,OP_BUY,LotSize,Ask,MySlippage,0,0,"Ордер на покупку",MagicNumber);
 
      if(ticket<0)
      {
         Print("Ошибка",GetLastError());
      }
      else
      {
         Print("Ордер успешно открыт");
      }
 
   // Modify Buy Order
   bool res = OrderModify(ticket,OrderOpenPrice(),Ask-StopLoss*MyPoint,Ask+TakeProfit*MyPoint,0);
 
      if(!res)
      {
         Print("Ошибка",GetLastError());
      }
      else
      {
         Print("Ордер успешно изменен.");
      }
}
 
 
// Рассчитываем котировки 
double MyPoint()
{
   double CalcPoint = 0;
 
   if(_Digits == 2 || _Digits == 3) CalcPoint = 0.01;
   else if(_Digits == 4 || _Digits == 5) CalcPoint = 0.0001;
 
   return(CalcPoint);
}
 
 
// Рассчитываем проскальзывание
int MySlippage()
{
   int CalcSlippage = 0;
 
   if(_Digits == 2 || _Digits == 4) CalcSlippage = Slippage;
   else if(_Digits == 3 || _Digits == 5) CalcSlippage = Slippage * 10;
 
   return(CalcSlippage);
}
 
 
// Проворяем свечу
bool IsNewBar()   
{        
   static datetime RegBarTime=0;
   datetime ThisBarTime = Time[0];
 
   if (ThisBarTime == RegBarTime)
   {
      return(false);
   }
   else
   {
      RegBarTime = ThisBarTime;
      return(true);
   }
}   
 
 
// Возвращаем количество открытых ордеров
int TotalOpenOrders()
{
   int total_orders = 0;
 
   for(int order = 0; order < OrdersTotal(); order++) 
   {
      if(OrderSelect(order,SELECT_BY_POS,MODE_TRADES)==false) break;
 
      if(OrderMagicNumber() == MagicNumber && OrderSymbol() == _Symbol)
         {
            total_orders++;
         }
   }
 
   return(total_orders);
}

Понравилась статья? Поделить с друзьями:
  • Как написать тому кому давно не писал
  • Как написать толи вместе или раздельно
  • Как написать толерантность правильно толерантность
  • Как написать токарные резцы
  • Как написать тойота хайлюкс