Содержание:
Как получить лицензию бесплатно!
Подробнее →
Криптобиржа
Простой и легкий курс
Представьте себе ситуацию: вы сидите перед монитором, наблюдаете за графиком, и видите, как цена пробивает важный уровень. Вы хотите войти в сделку, но нужно быстро принимать решение, выставлять стоп-лосс и тейк-профит. А если вы отошли за чашкой кофе и пропустили движение? А если ночью, пока вы спите, происходит сильное движение, которое могло бы принести прибыль?
Именно для этого и существуют торговые роботы (эксперты, советники). Они неустанно следят за рынком 24/7, не знают усталости и эмоций, и действуют строго по заложенной в них программе. Сегодня мы с вами сделаем первый шаг в мир алгоритмического трейдинга и подробно разберем торгового робота под названием VR Breakdown Level.
Мы не просто прочитаем код. Мы поймем логику стратегии, увидим, как она реализована на двух самых популярных языках для платформы MetaTrader — MQL4 и MQL5, и сравним эти реализации. Не пугайтесь, если вы никогда не программировали! Статья написана так, чтобы быть понятной даже тем, кто впервые открывает редактор кода. Поехали!
Прежде чем писать код, нужно четко понимать, что именно мы хотим от робота. Название стратегии говорит само за себя: VR Breakdown Level — это «Уровни пробоя».
В основе стратегии лежит классическая идея технического анализа: если цена пробивает максимум (High) или минимум (Low) предыдущего периода, это сигнал к продолжению движения. Периодом может быть что угодно: 1 час, 4 часа, 1 день. Это настраивается.
Как это работает (логика для новичка):
High).Low).Вот и вся стратегия! Простая, как кувалда, и в этом ее красота. А теперь давайте посмотрим, как эта кувалда выглядит в коде для двух разных версий MetaTrader.
MQL4 — это язык, на котором написаны тысячи советников за последние 15+ лет. Он немного старше и проще в некоторых аспектах. Давайте разберем код по кусочкам.
В самом начале кода мы видим «шапку» с информацией об авторе и версии. Это просто комментарии для нас с вами, программа их игнорирует.
Самое интересное начинается с ключевого слова input. Это настройки советника, которые будет видеть пользователь в окне свойств при запуске.
iLots — это размер первой сделки.iTimeFrame — тот самый период, о котором мы говорили. Можно выбрать H1, H4, D1 и т.д.iTakeProfit и iStopLoss — расстояния до целей в пунктах (пипсах).iMagicNumber — очень важная вещь! Это уникальный «айдишник» нашего робота. Представьте, что на одном счете работает несколько советников. Чтобы они не мешали ордерам друг друга и не закрывали чужие сделки, у каждого есть свой магический номер. Робот трогает только те ордера, где этот номер совпадает с его настройками.Здесь мы объявляем переменные, которые будут видны во всех функциях робота.
lt — сюда мы сохраним объем лота, скорректированный под требования брокера (об этом позже).level_up и level_dw — наши главные герои. Здесь будут храниться цены уровней пробоя. Они равны нулю, пока не наступит новый бар.OnInit()Эта функция выполняется один раз, когда мы только бросаем робота на график.
Что тут происходит? Мы проверяем, можно ли торговать с тем объемом, который ввел пользователь. Брокеры часто разрешают торговать только определенными долями лота (например, шаг 0.01). Если пользователь ввел 0.05, а шаг 0.03, мы должны округлить до 0.03 или 0.06? Код приводит объем к правильному значению. Если после округления объем получился меньше минимально допустимого, мы приравниваем lt к нулю, чтобы робот не открывал сделки с ошибкой.
OnTick()Это главная функция. Она вызывается при каждом новом тике (каждое малейшее изменение цены).
Шаг 1: Проверка нового бара
Мы вызываем собственную функцию NewBar(), которая написана ниже. Если она возвращает true (новый бар наступил), мы обновляем наши уровни. iHigh(..., 1) — это стандартная функция MQL4, которая берет цену High у бара с индексом 1, то есть у предыдущего (только что закрывшегося) бара.
Шаг 2: Получение текущих цен
ASK — цена, по которой мы можем купить (она всегда чуть выше рыночной).BID — цена, по которой мы можем продать (она всегда чуть ниже рыночной).Шаг 3: Проверка условий и открытие сделок
Если текущая цена покупки (ask) больше или равна нашему верхнему уровню, и если сам уровень не равен нулю (мы его только что обновили), то...
...отправляем рыночный ордер на покупку! Функция OrderSend — это «Основа» всех торговых функций в MQL4.
— сразу после открытия сбрасываем уровень, чтобы больше не открываться.
Логика зеркальна. Если bid <= level_dw, то отправляем ордер OP_SELL.
Шаг 4: Управление стопами открытых позиций
Самая сложная часть кода MQL4. Здесь мы проходим по всем открытым ордерам (цикл for), ищем «свои» (по символу и магическому номеру) и, если нужно, модифицируем их стоп-лоссы и тейк-профиты.
OrderSelect — функция, которая выбирает ордер для работы с ним.OrderModify — функция для изменения параметров ордера (стопа и тейка).Функция NewBar()
Простая, но гениальная функция для определения нового бара. Она запоминает время открытия текущего бара в переменную old_time. При следующем тике сравнивает новое время со старым. Если они отличаются — значит, появился новый бар!
Функция CheckSL_TP
Эта функция — «проверяльщик». Брокеры не разрешают ставить стоп-лосс слишком близко к текущей цене (обычно есть минимальное расстояние, например, 20 пунктов). Эта функция проверяет, не нарушает ли наш новый стоп правила брокера.
MQL5 — это эволюция языка. Он мощнее, строже, но и немного сложнее для новичка. Главное отличие — переход от концепции ордеров к концепции позиций. В MQL4 у вас могли быть отложенные ордера и рыночные ордера, которые "висели" в списке. В MQL5 рыночная сделка — это позиция, которая занимает отдельное место в списке позиций.
Из-за этого появились специальные библиотеки (классы), чтобы упростить жизнь программисту. Посмотрим на них.
В самом начале мы видим строки #include. Это как попросить помощь у старших товарищей.
CTrade trade; — мы создаем объект trade, который является экспертом по совершению сделок. Вместо длинных функций OrderSend() мы просто говорим trade.Buy().CPositionInfo posit; — мы создаем объект posit, который является экспертом по получению информации об открытых позициях.Настройки (input) выглядят точно так же, как и в MQL4. А вот в OnInit() происходит конфигурация нашего нового помощника trade.
Мы говорим объекту trade: "Запомни наш магический номер" и "Вот допустимое проскальзывание цены". Это очень удобно: один раз настроил и забыл.
OnTick() в MQL5Общая структура та же, но детали изменились кардинально.
Шаг 1: Проверка нового бара и обновление уровней
Здесь почти всё то же самое, только функции iHigh и iLow теперь требуют перед собой два двоеточия ::. Это означает, что мы вызываем «глобальную» функцию языка, а не какую-то другую.
Шаг 2: Открытие сделок
А вот это — самое красивое отличие!
Мы просто вызываем метод Buy у нашего объекта trade и передаем только объем. Всё! Цену Ask объект знает сам, магический номер помнит, проскальзывание тоже. Это невероятно элегантно и лаконично.
— и сбрасываем уровень.
— аналогично.
Шаг 3: Управление стопами открытых позиций
Вместо прохода по ордерам, мы проходим по позициям (::PositionsTotal()). И используем наш объект posit, чтобы получить информацию о каждой позиции.
Обратите внимание: для модификации мы снова используем объект trade, вызывая его метод PositionModify. Всё логично: posit для информации, trade для действий.
Мы разобрали два кода, которые делают одно и то же. Но как они отличаются? Давайте составим таблицу сравнения, чтобы наглядно увидеть разницу.
| Критерий | MQL4 | MQL5 |
|---|---|---|
| Основной подход | Процедурный. Все операции делаются через функции (OrderSend, OrderSelect). |
Объектно-ориентированный. Используются классы-помощники (CTrade, CPositionInfo). |
| Открытие сделки | Длинная функция OrderSend с кучей параметров. |
trade.Buy(volume). Кратко и понятно. |
| Управление сделками | Нужно постоянно выбирать ордер (OrderSelect) перед работой с ним. |
Позиция выбирается один раз (posit.SelectByIndex), и мы можем напрямую спрашивать у объекта posit его свойства. |
| Читаемость кода | Код кажется более "линейным", но из-за обилия функций для новичка может быть запутанным. Например, чтобы изменить стоп, нужно вызвать OrderModify. |
Код чище и логичнее. posit отвечает за данные, trade — за действия. Легче читать и понимать намерения программиста. |
| Риск ошибок | Выше. Легко перепутать параметры в OrderSend или забыть вызвать OrderSelect. |
Ниже. Объекты сами следят за корректностью вызовов. Например, trade.Buy() сам подставит нужную цену Ask. |
| Актуальность | Устаревающая. Новые возможности платформы (например, типы ордеров) часто появляются только в MQL5. | Современная. Это язык будущего для MetaTrader 5. |
| Сложность для старта | Проще для полного "нуля" в программировании, так как не требует понимания классов и объектов. | Требует понимания концепции объектов (классов), но в долгосрочной перспективе учит писать правильный и красивый код. |
В описании стратегии упоминается интересный момент: "Похожим образом можно реализовать стратегию с помощью отложенных ордеров BUY STOP и SELL STOP... Наличие отложенных ордеров показывает брокеру по каким ценам мы собираемся войти в рынок. Использование 'внутренних' уровней, скрывает эту информацию от брокера".
Что это значит?
level_up и SELL STOP на уровне level_dw. Если цена доходит до уровня, ордер срабатывает. Минус в том, что брокер (или другие участники рынка с доступом к стакану) видят эти ордера. Крупные игроки иногда охотятся за такими скоплениями стоп-приказов, провоцируя ложные пробои.Наш код использует второй, более скрытный подход. Он сложнее в реализации, так как требует постоянного мониторинга цены в функции OnTick(), зато сохраняет наши намерения в тайне.
Итак, мы прошли долгий путь. Мы разобрали простую, но эффективную торговую стратегию, основанную на пробое уровней. Мы увидели, как одна и та же логика может быть реализована на двух разных языках — MQL4 и современном MQL5.
Что мы поняли?
Почему вам стоит попробовать?
Написание собственного робота — это невероятно захватывающий процесс. Вы не просто трейдер, вы становитесь создателем. Вы можете запрограммировать любую свою идею, любой торговый паттерн, который увидели на графике. Вы сможете тестировать свои стратегии на истории (это называется тестирование на исторических данных) и мгновенно видеть, приносят ли они прибыль или убыток, не рискуя реальными деньгами.
Начните с малого. Скопируйте код VR Breakdown Level в MetaEditor (встроенная среда разработки в терминале MetaTrader), скомпилируйте его (нажмите F7) и прикрепите к графику на демо-счете. Понаблюдайте за его работой.
Измените настройки: поставьте таймфрейм H4, увеличьте стоп-лосс. Посмотрите, как изменится поведение. А потом попробуйте что-то изменить в коде. Например, добавьте условие, чтобы робот открывал сделку только после двух пробоев подряд. Или чтобы он закрывал сделку не по тейк-профиту, а по обратному пробою.
Не бойтесь ошибок! Сообщения об ошибках — это не наказание, а подсказки компилятора, который помогает вам написать правильный код.
Программирование торговых роботов — это сплав аналитического мышления трейдера и творчества программиста. Это увлекательное путешествие, которое может не только автоматизировать вашу торговлю, но и подарить вам массу удовольствия от процесса создания чего-то своего. Откройте редактор кода и сделайте первый шаг уже сегодня! Ваш первый торговый робот ждет вас.
Исходные коды торговой стратегии:
MetaTrader 4 : https://www.mql5.com/ru/code/69562
MetaTrader 5 : https://www.mql5.com/ru/code/69545
Обсуждение на форуме
Телеграмм сообщество
Комментарии