Top.Mail.Ru
RoboForex - Профессиональные услуги на рынке Форекс

Пишем своего первого торгового робота на MQL4 и MQL5

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

Именно для этого и существуют торговые роботы (эксперты, советники). Они неустанно следят за рынком 24/7, не знают усталости и эмоций, и действуют строго по заложенной в них программе. Сегодня мы с вами сделаем первый шаг в мир алгоритмического трейдинга и подробно разберем торгового робота под названием VR Breakdown Level.

Мы не просто прочитаем код. Мы поймем логику стратегии, увидим, как она реализована на двух самых популярных языках для платформы MetaTrader — MQL4 и MQL5, и сравним эти реализации. Не пугайтесь, если вы никогда не программировали! Статья написана так, чтобы быть понятной даже тем, кто впервые открывает редактор кода. Поехали!

Часть 1: Знакомство со стратегией VR Breakdown Level

Прежде чем писать код, нужно четко понимать, что именно мы хотим от робота. Название стратегии говорит само за себя: VR Breakdown Level — это «Уровни пробоя».

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

Как это работает (логика для новичка):

  1. Начало нового периода: Представьте, что мы торгуем на часовом графике. Как только начинается новый час (формируется новая «свеча»), наш робот просыпается и делает самое главное — запоминает цены.
  2. Запоминание уровней: Он смотрит на предыдущий, только что закрывшийся час. Робот записывает в память две цифры:
    • Максимальную цену прошлого периода (High).
    • Минимальную цену прошлого периода (Low).
    Эти цены становятся нашими ключевыми уровнями для текущего периода .
  3. Ожидание пробоя: Весь текущий час робот просто следит за ценой. Он ничего не делает, пока цена находится внутри диапазона между вчерашними максимумом и минимумом.
  4. Сигнал к покупке (BUY): Как только текущая цена поднимается выше максимума прошлого периода, робот воспринимает это как сигнал к силе покупателей. Он мгновенно открывает позицию на покупку (BUY).
  5. Сигнал к продаже (SELL): Если же цена падает ниже минимума прошлого периода, это сигнал к силе продавцов. Робот открывает сделку на продажу (SELL).
  6. Управление рисками: Открыв сделку, робот не бросает ее на произвол судьбы. Тут же, на каждый ордер, он выставляет Защитные приказы:
    • Stop Loss (Стоп-лосс): Если рынок пойдет против нас, эта цена ограничит наш убыток. Мы заранее говорим роботу: «Дорогой, если цена упадет ниже этого уровня (для покупки), закрой сделку, чтобы я не потерял еще больше».
    • Take Profit (Тейк-профит): Это наша цель. Цена, при достижении которой робот автоматически закроет сделку и зафиксирует прибыль.
  7. Один сигнал — одна сделка: Чтобы не открывать бесконечное количество ордеров, если цена будет долго болтаться у уровня, робот после открытия сделки «сбрасывает» запомненный уровень в ноль, чтобы не среагировать на него снова.

Вот и вся стратегия! Простая, как кувалда, и в этом ее красота. А теперь давайте посмотрим, как эта кувалда выглядит в коде для двух разных версий MetaTrader.

Часть 2: Разбор кода на MQL4

MQL4 — это язык, на котором написаны тысячи советников за последние 15+ лет. Он немного старше и проще в некоторых аспектах. Давайте разберем код по кусочкам.

2.1. Интерфейс и настройки

В самом начале кода мы видим «шапку» с информацией об авторе и версии. Это просто комментарии для нас с вами, программа их игнорирует.

//+------------------------------------------------------------------+
//| VR Breakdown level.mq4 |
//| Copyright 2026, Trading-Go. |
//+------------------------------------------------------------------+
#property copyright "@ Voldemar"
#property link "https://trading-go.ru/beginner/pisham-svoego-pervogo-torgovogo-robota-na-mql4-i-mql5/"
#property version "26.020"
#property strict

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

//+------------------------------------------------------------------+
//| Input parameters |
//+------------------------------------------------------------------+
input double iLots = 0.01; // Trading volume in lots
input ENUM_TIMEFRAMES iTimeFrame = PERIOD_CURRENT; // Timeframe for analysis
input int iTakeProfit = 400; // Take Profit in points
input int iStopLoss = 200; // Stop Loss in points
input int iMagicNumber = 227; // Unique identifier for EA orders
input int iSlippage = 30; // Maximum slippage in points
  • iLots — это размер первой сделки.
  • iTimeFrame — тот самый период, о котором мы говорили. Можно выбрать H1, H4, D1 и т.д.
  • iTakeProfit и iStopLoss — расстояния до целей в пунктах (пипсах).
  • iMagicNumberочень важная вещь! Это уникальный «айдишник» нашего робота. Представьте, что на одном счете работает несколько советников. Чтобы они не мешали ордерам друг друга и не закрывали чужие сделки, у каждого есть свой магический номер. Робот трогает только те ордера, где этот номер совпадает с его настройками.

2.2. Глобальные переменные

Здесь мы объявляем переменные, которые будут видны во всех функциях робота.

double lt = 0; // Правильный объем лота
double level_up = 0; // Уровень для покупки (High прошлого бара)
double level_dw = 0; // Уровень для продажи (Low прошлого бара)
  • lt — сюда мы сохраним объем лота, скорректированный под требования брокера (об этом позже).
  • level_up и level_dw — наши главные герои. Здесь будут храниться цены уровней пробоя. Они равны нулю, пока не наступит новый бар.

2.3. Момент запуска: Функция OnInit()

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

int OnInit()
{
double stepvol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
if(stepvol > 0)
lt = stepvol * (int)(iLots / stepvol);
if(lt < SymbolInfoDouble> lt = 0.0;
return(INIT_SUCCEEDED);
}

Что тут происходит? Мы проверяем, можно ли торговать с тем объемом, который ввел пользователь. Брокеры часто разрешают торговать только определенными долями лота (например, шаг 0.01). Если пользователь ввел 0.05, а шаг 0.03, мы должны округлить до 0.03 или 0.06? Код приводит объем к правильному значению. Если после округления объем получился меньше минимально допустимого, мы приравниваем lt к нулю, чтобы робот не открывал сделки с ошибкой.

2.4. Сердце робота: Функция OnTick()

Это главная функция. Она вызывается при каждом новом тике (каждое малейшее изменение цены).

Шаг 1: Проверка нового бара

if(NewBar())
{
level_up = iHigh(_Symbol, PERIOD_CURRENT, 1);
level_dw = iLow(_Symbol, PERIOD_CURRENT, 1);
}

Мы вызываем собственную функцию NewBar(), которая написана ниже. Если она возвращает true (новый бар наступил), мы обновляем наши уровни. iHigh(..., 1) — это стандартная функция MQL4, которая берет цену High у бара с индексом 1, то есть у предыдущего (только что закрывшегося) бара.

Шаг 2: Получение текущих цен

double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
  • ASK — цена, по которой мы можем купить (она всегда чуть выше рыночной).
  • BID — цена, по которой мы можем продать (она всегда чуть ниже рыночной).

Шаг 3: Проверка условий и открытие сделок

  • Покупка:
    if(ask > 0 && level_up > 0 && ask >= level_up)

    Если текущая цена покупки (ask) больше или равна нашему верхнему уровню, и если сам уровень не равен нулю (мы его только что обновили), то...

    int ticket = OrderSend(_Symbol, OP_BUY, lt, ask, iSlippage, 0, 0, NULL, iMagicNumber, 0, clrNONE);

    ...отправляем рыночный ордер на покупку! Функция OrderSend — это «Основа» всех торговых функций в MQL4.

    level_up = 0;

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

  • Продажа:

    Логика зеркальна. Если bid <= level_dw, то отправляем ордер OP_SELL.

Шаг 4: Управление стопами открытых позиций

Самая сложная часть кода MQL4. Здесь мы проходим по всем открытым ордерам (цикл for), ищем «свои» (по символу и магическому номеру) и, если нужно, модифицируем их стоп-лоссы и тейк-профиты.

for(int i = 0; i < total> {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == _Symbol && OrderMagicNumber() == iMagicNumber)
{
// ... расчет новых SL и TP на основе цены открытия (op) ...
if(new_sl != sl && new_tp != tp)
if(CheckSL_TP(OrderType(), new_sl, new_tp))
bool res = OrderModify(OrderTicket(), op, new_sl, new_tp, 0, clrNONE);
}
}
}
  • OrderSelect — функция, которая выбирает ордер для работы с ним.
  • OrderModify — функция для изменения параметров ордера (стопа и тейка).

2.5. Вспомогательные функции

Функция NewBar()

Простая, но гениальная функция для определения нового бара. Она запоминает время открытия текущего бара в переменную old_time. При следующем тике сравнивает новое время со старым. Если они отличаются — значит, появился новый бар!

bool NewBar(void)
{
datetime new_time = iTime(_Symbol, PERIOD_CURRENT, 0);
static datetime old_time = new_time;
if(new_time != old_time)
if((old_time = new_time) != NULL)
return(true);
return(false);
}

Функция CheckSL_TP

Эта функция — «проверяльщик». Брокеры не разрешают ставить стоп-лосс слишком близко к текущей цене (обычно есть минимальное расстояние, например, 20 пунктов). Эта функция проверяет, не нарушает ли наш новый стоп правила брокера.

MQL Master Курс разработки торговых роботов с нуля! Начать учиться

Часть 3: Разбор кода на MQL5

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

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

3.1. Подключение библиотек

В самом начале мы видим строки #include. Это как попросить помощь у старших товарищей.

#include CTrade trade;
#include CPositionInfo posit;
  • CTrade trade; — мы создаем объект trade, который является экспертом по совершению сделок. Вместо длинных функций OrderSend() мы просто говорим trade.Buy().
  • CPositionInfo posit; — мы создаем объект posit, который является экспертом по получению информации об открытых позициях.

3.2. Настройки и инициализация

Настройки (input) выглядят точно так же, как и в MQL4. А вот в OnInit() происходит конфигурация нашего нового помощника trade.

int OnInit()
{
trade.SetExpertMagicNumber(iMagicNumber);
trade.SetDeviationInPoints(iSlippage);
// ... другие настройки ...
return(INIT_SUCCEEDED);
}

Мы говорим объекту trade: "Запомни наш магический номер" и "Вот допустимое проскальзывание цены". Это очень удобно: один раз настроил и забыл.

3.3. Функция OnTick() в MQL5

Общая структура та же, но детали изменились кардинально.

Шаг 1: Проверка нового бара и обновление уровней

Здесь почти всё то же самое, только функции iHigh и iLow теперь требуют перед собой два двоеточия ::. Это означает, что мы вызываем «глобальную» функцию языка, а не какую-то другую.

if(NewBar())
{
level_up = ::iHigh(_Symbol, PERIOD_CURRENT, 1);
level_dw = ::iLow(_Symbol, PERIOD_CURRENT, 1);
}

Шаг 2: Открытие сделок

А вот это — самое красивое отличие!

  • Покупка:
    if(trade.Buy(lt))

    Мы просто вызываем метод Buy у нашего объекта trade и передаем только объем. Всё! Цену Ask объект знает сам, магический номер помнит, проскальзывание тоже. Это невероятно элегантно и лаконично.

    if((level_up = 0) == 0) return;

    — и сбрасываем уровень.

  • Продажа:
    if(trade.Sell(lt))

    — аналогично.

Шаг 3: Управление стопами открытых позиций

Вместо прохода по ордерам, мы проходим по позициям (::PositionsTotal()). И используем наш объект posit, чтобы получить информацию о каждой позиции.

for(int i = 0; i < total> if(posit.SelectByIndex(i))
if(posit.Symbol() == _Symbol && posit.Magic() == iMagicNumber)
{
// posit.PriceOpen() - получить цену открытия
// posit.TakeProfit() - получить текущий TP
// posit.PositionType() - получить тип (BUY или SELL)
// ... расчет новых SL и TP ...
if(CheckSL_TP(posit.PositionType(), new_sl, new_tp))
trade.PositionModify(posit.Ticket(), new_sl, new_tp);
}

Обратите внимание: для модификации мы снова используем объект trade, вызывая его метод PositionModify. Всё логично: posit для информации, trade для действий.

Часть 4: Сравнение кодов MQL4 и MQL5 — что выбрать новичку?

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

КритерийMQL4MQL5
Основной подход Процедурный. Все операции делаются через функции (OrderSend, OrderSelect). Объектно-ориентированный. Используются классы-помощники (CTrade, CPositionInfo).
Открытие сделки Длинная функция OrderSend с кучей параметров. trade.Buy(volume). Кратко и понятно.
Управление сделками Нужно постоянно выбирать ордер (OrderSelect) перед работой с ним. Позиция выбирается один раз (posit.SelectByIndex), и мы можем напрямую спрашивать у объекта posit его свойства.
Читаемость кода Код кажется более "линейным", но из-за обилия функций для новичка может быть запутанным. Например, чтобы изменить стоп, нужно вызвать OrderModify. Код чище и логичнее. posit отвечает за данные, trade — за действия. Легче читать и понимать намерения программиста.
Риск ошибок Выше. Легко перепутать параметры в OrderSend или забыть вызвать OrderSelect. Ниже. Объекты сами следят за корректностью вызовов. Например, trade.Buy() сам подставит нужную цену Ask.
Актуальность Устаревающая. Новые возможности платформы (например, типы ордеров) часто появляются только в MQL5. Современная. Это язык будущего для MetaTrader 5.
Сложность для старта Проще для полного "нуля" в программировании, так как не требует понимания классов и объектов. Требует понимания концепции объектов (классов), но в долгосрочной перспективе учит писать правильный и красивый код.

MQL Master Курс разработки торговых роботов с нуля! Начать учиться

Часть 5: Главный нюанс стратегии — Отложенные ордера vs Рыночные ордера

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

Что это значит?

  1. Способ с отложенными ордерами (Прозрачный для брокера): Как только начинается новый период, мы можем сразу выставить два отложенных ордера: BUY STOP на уровне level_up и SELL STOP на уровне level_dw. Если цена доходит до уровня, ордер срабатывает. Минус в том, что брокер (или другие участники рынка с доступом к стакану) видят эти ордера. Крупные игроки иногда охотятся за такими скоплениями стоп-приказов, провоцируя ложные пробои.
  2. Способ с рыночными ордерами (Скрытый), который реализован у нас: Мы ничего не выставляем заранее. Мы просто сидим и ждем в коде. Как только цена касается уровня, мы в этот же момент отправляем рыночный ордер. Для внешнего наблюдателя это выглядит как обычная рыночная сделка, а не срабатывание скопища стоп-ордеров.

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

Часть 6: Заключение

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

Что мы поняли?

  • Программирование торговых роботов — это не магия, а просто четкая запись торговых правил на языке, понятном компьютеру.
  • MQL4 проще для понимания базовых концепций, но его код часто громоздкий.
  • MQL5 сложнее на старте из-за объектного подхода, но он предлагает гораздо более чистый, безопасный и профессиональный инструментарий. Если вы планируете серьезно заниматься разработкой, выбирайте 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

Обсуждение на форуме

 

MQL Master Курс разработки торговых роботов с нуля! Начать учиться

Комментарии

Для написания комментария авторизуйтесь Войти
Регистрация

Вход

Восстановление пароля Регистрация
Вход

Восстановление пароля Регистрация
Запрос пароля

Если вы забыли пароль, введите e-mail. Контрольная строка для смены пароля будут высланы вам по e-mail.

На Вашу электронную почту отправленна ссылка для подтверждения E-mail адреса. Для завершения регистрации перейдите по этой ссылке.

Если вы не получили письмо на Вашу почту, проверьте папку Спам. Если и там письма нет, тогда свяжитесь с нами.

Регистрация завершена успешно!

Вы успешно зашли на сайт!

Мы используем как собственные файлы cookie, так и файлы cookie третьих сторон с целью анализа, а также для показа рекламы с учетом ваших предпочтений, в соответствии с вашими привычками просмотра сайтов и вашего профиля. Чтобы получить более подробную информацию, посмотрите нашу Политику конфиденциальности.
Телеграмм сообщество
Обсуждения, настройки, результаты,
общение с автором
ПЕРЕЙТИ