🤖 Как написать автоматическую торговую систему на MQL5: от идеи до первой сделки


На главную > Блог > Категория > 🤖 Как написать автоматическую торговую систему на MQL5: от идеи до первой сделки

mql5_bot

Вступление: почему MQL5 — выбор профессионалов для автоматизации

Вы устали сидеть перед экраном часами? Пропускаете хорошие сделки, потому что отвлеклись? Завидуете ботам, которые торгуют 24/7 без устали? Пришло время написать своего первого экспертного советника (EA) на MQL5.

MQL5 (MetaQuotes Language 5) — это язык программирования для платформы MetaTrader 5. В отличие от устаревшего MQL4, пятая версия предлагает объектно-ориентированное программирование, встроенные классы для торговли, сотни индикаторов и возможность создавать многопоточные приложения [citation:8]. С помощью MQL5 вы можете превратить любую торговую идею в код, который будет открывать и закрывать сделки автоматически. В этой статье я покажу, как создать простого, но полностью рабочего советника с нуля — от установки до тестирования.

«Советник — это ваш цифровой двойник. Он не знает страха, жадности и усталости. Но он настолько же умён, насколько умную стратегию вы в него заложили».

1. Что такое Экспертный советник (EA) и зачем он нужен

Экспертный советник (Expert Advisor, EA) — это программа на языке MQL5, которая автоматически совершает сделки на основе заданных правил [citation:2]. EA могут торговать 24/7 без вашего участия, анализировать графики, выставлять стоп-лоссы и тейк-профиты, а также управлять капиталом [citation:2].

Преимущества автоматической торговли:

  • 🚀 Скорость реакции — советник реагирует на изменения цены быстрее человека.
  • 😤 Отсутствие эмоций — никакой жадности после трёх прибыльных сделок и никакого страха после убытка.
  • Круглосуточная работа — пока вы спите, советник торгует на азиатских сессиях.
  • 📊 Бэктестинг — вы можете проверить стратегию на исторических данных, прежде чем рисковать реальными деньгами [citation:2].
  • 🔄 Масштабирование — один советник может торговать на нескольких графиках одновременно.

2. Структура советника: три главные функции

Любой советник на MQL5 состоит как минимум из трёх обязательных функций-обработчиков. Платформа вызывает их автоматически в нужные моменты [citation:10].

ФункцияКогда вызываетсяЧто делает
OnInit() Один раз при загрузке советника на график Инициализирует хэндлы индикаторов, устанавливает переменные, проверяет корректность настроек [citation:10]
OnTick() При каждом новом тике (изменении цены) Основная логика торговли: анализ сигналов, открытие и закрытие позиций, управление стопами [citation:10]
OnDeinit() При выгрузке советника с графика или закрытии терминала Освобождает ресурсы, удаляет созданные объекты, очищает память [citation:10]

3. Создаём свой первый советник (пошагово)

Создадим простого советника, который торгует по сигналам RSI: покупает, когда RSI опускается ниже 30, и продаёт, когда RSI поднимается выше 70 [citation:1].

Шаг 1. Открываем MetaEditor и создаём шаблон

В терминале MetaTrader 5 нажмите F4 или выберите «Сервис» → «Редактор MetaQuotes Language» [citation:9]. В открывшемся редакторе: «Файл» → «Новый» → «Советник (шаблон)» [citation:3][citation:9]. Заполните поля:

  • Имя: SimpleRSI_EA
  • Автор: ваше имя
  • Ссылка: ваш email или сайт (опционально)

Шаг 2. Подключаем торговую библиотеку и объявляем переменные


//+------------------------------------------------------------------+
//|                                            SimpleRSI_EA.mq5      |
//|                                                   Your Name      |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Your Name"
#property version   "1.00"

#include <Trade/Trade.mqh>   // Библиотека для торговых операций
CTrade m_trade;               // Объект для отправки ордеров

//--- Входные параметры (можно менять в настройках советника)
input double   InpLotSize       = 0.1;       // Размер лота
input int      InpRSIPeriod     = 14;        // Период RSI
input double   InpRSI_Level_UP  = 70;        // Уровень перекупленности
input double   InpRSI_Level_DOWN = 30;       // Уровень перепроданности
input int      InpStopLoss      = 100;       // Стоп-лосс в пунктах
input int      InpTakeProfit    = 200;       // Тейк-профит в пунктах

//--- Глобальные переменные
int      rsiHandle;            // Хэндл индикатора RSI
datetime lastBarTime = 0;      // Время последнего обработанного бара [citation:9]
📊 Что такое input переменные? Это параметры, которые пользователь может изменять при запуске советника без редактирования кода. Они видны в окне настроек и доступны для оптимизации в тестере стратегий [citation:3][citation:6].

Шаг 3. Инициализируем индикатор в OnInit()


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // Создаём хэндл индикатора RSI
    rsiHandle = iRSI(Symbol(), Period(), InpRSIPeriod, PRICE_CLOSE);
    
    // Проверяем, успешно ли создан хэндл
    if(rsiHandle == INVALID_HANDLE)
    {
        Print("Ошибка создания хэндла RSI. Код ошибки: ", GetLastError());
        return(INIT_FAILED);
    }
    
    Print("Советник успешно загружен. RSI период: ", InpRSIPeriod);
    return(INIT_SUCCEEDED);
}

Важное правило: хэндл индикатора нужно получить один раз в OnInit(), а не каждый тик в OnTick(). Это экономит ресурсы [citation:1].

Шаг 4. Основная торговая логика в OnTick()


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // Работаем только на открытии нового бара (чтобы не спамить ордерами)
    datetime currentBarTime = iTime(Symbol(), Period(), 0);
    if(currentBarTime == lastBarTime)
        return;
    lastBarTime = currentBarTime;
    
    // Получаем значения RSI для 1-го индекса (предпоследний закрытый бар)
    double rsiBuffer[1];
    if(CopyBuffer(rsiHandle, 0, 1, 1, rsiBuffer) != 1)
        return;
    
    double rsiValue = rsiBuffer[0];
    if(rsiValue == EMPTY_VALUE)
        return;
    
    // Проверяем, есть ли уже открытые позиции
    if(PositionsTotal() > 0)
        return;   // Ждём закрытия текущей позиции
    
    MqlTick tick;
    SymbolInfoTick(Symbol(), tick);
    
    // Логика торговли
    if(rsiValue > InpRSI_Level_UP)
    {
        // Сигнал на продажу
        double sl = (InpStopLoss == 0) ? 0 : tick.bid + InpStopLoss * Point();
        double tp = (InpTakeProfit == 0) ? 0 : tick.bid - InpTakeProfit * Point();
        m_trade.Sell(InpLotSize, Symbol(), tick.bid, sl, tp);
        Print("Открыта позиция SELL. RSI = ", rsiValue);
    }
    else if(rsiValue < InpRSI_Level_DOWN)
    {
        // Сигнал на покупку
        double sl = (InpStopLoss == 0) ? 0 : tick.ask - InpStopLoss * Point();
        double tp = (InpTakeProfit == 0) ? 0 : tick.ask + InpTakeProfit * Point();
        m_trade.Buy(InpLotSize, Symbol(), tick.ask, sl, tp);
        Print("Открыта позиция BUY. RSI = ", rsiValue);
    }
}
🎯 Почему мы проверяем PositionsTotal()? Чтобы советник не открывал новую позицию, пока старая не закрыта. Это базовое правило риск-менеджмента [citation:1].

Шаг 5. Компиляция

Нажмите F7 или кнопку «Компилировать» в MetaEditor. Если нет ошибок — советник готов к использованию. В папке MQL5/Experts появится файл SimpleRSI_EA.ex5 [citation:2].

4. Как добавить индикаторы в советник (на примере RSI)

В предыдущем примере мы использовали iRSI — встроенную функцию. Общая схема работы с любым индикатором в MQL5 одинакова [citation:1]:

  1. Создать хэндл — специальный идентификатор индикатора (в OnInit).
  2. Получить данные — с помощью CopyBuffer скопировать значения в массив.
  3. Использовать значения — для принятия торговых решений в OnTick.

// Пример для скользящей средней (SMA)
int maHandle;

int OnInit()
{
    maHandle = iMA(Symbol(), Period(), 20, 0, MODE_SMA, PRICE_CLOSE);
    if(maHandle == INVALID_HANDLE) return(INIT_FAILED);
    return(INIT_SUCCEEDED);
}

void OnTick()
{
    double maBuffer[1];
    CopyBuffer(maHandle, 0, 1, 1, maBuffer);
    double maValue = maBuffer[0];
    // ... используем maValue для принятия решений
}
⚠️ Важно: Всегда проверяйте валидность хэндла. Если INVALID_HANDLE — индикатор не создан, и советник не должен торговать [citation:1].

5. Тестирование советника в Тестере Стратегий

Прежде чем запускать советника на реальные деньги, обязательно протестируйте его на истории. В MT5 для этого есть мощный инструмент — Тестер Стратегий [citation:2].

Как запустить тестирование:

  1. Нажмите Ctrl+R или «Вид» → «Тестер стратегий».
  2. Выберите в выпадающем меню ваш советник SimpleRSI_EA [citation:2].
  3. Выберите символ (например, EURUSD) и таймфрейм (например, H1).
  4. Установите даты для тестирования (например, последние 3 месяца).
  5. Нажмите «Старт» [citation:2].
📊 Что смотреть в результатах:
  • Profit Factor — отношение валовой прибыли к валовому убытку. Должен быть > 1.3.
  • Max Drawdown — максимальная просадка. Не должна превышать 30%.
  • Total trades — количество сделок. Чем больше, тем достовернее статистика.
  • График баланса — должен быть плавно растущим, без резких провалов.

6. Как улучшить советника: модульная архитектура

Профессиональные советники пишутся не в одном файле, а с использованием классов и разделения на модули. Это позволяет переиспользовать код и упрощает отладку [citation:5][citation:9].

Пример структуры:

  • SimpleRSI_EA.mq5 — главный файл советника
  • Include/Signal/RSISignal.mqh — класс для генерации сигналов по RSI
  • Include/Risk/RiskManager.mqh — класс для управления рисками [citation:5]

// Файл Include/Signal/RSISignal.mqh
class CRSISignal
{
private:
    int               m_rsiHandle;
    int               m_period;
    double            m_levelUp;
    double            m_levelDown;
    
public:
    CRSISignal(int period, double levelUp, double levelDown);
    ~CRSISignal();
    bool Init(string symbol, ENUM_TIMEFRAMES timeframe);
    double GetValue(int shift);
    int GetSignal();
};

int CRSISignal::GetSignal()
{
    double rsi[1];
    CopyBuffer(m_rsiHandle, 0, 1, 1, rsi);
    if(rsi[0] > m_levelUp) return -1;  // Sell
    if(rsi[0] < m_levelDown) return 1; // Buy
    return 0;
}

Такую архитектуру используют в коммерческих советниках — например, проект SupplyDemandProEA на GitHub построен по этому принципу: отдельные классы для детекции зон, распознавания паттернов и управления входами [citation:5].

7. Частые ошибки и как их избежать

  • ❌ Советник не торгует — проверьте, включена ли кнопка «Алготрейдинг» на панели инструментов MT5 [citation:2].
  • ❌ Ошибка INVALID_HANDLE — неправильные параметры индикатора. Проверьте, существует ли такой индикатор в терминале.
  • ❌ Слишком много сделок (переторговка) — добавьте проверку на новый бар, как в нашем примере с lastBarTime [citation:9].
  • ❌ Переоптимизация (curve fitting) — не подгоняйте параметры под историю с точностью до одного тика. Лучше меньше параметров, но более надёжная логика.
  • ❌ Игнорирование комиссий и спредов — в настройках тестера обязательно укажите реальные комиссии вашего брокера.

Заключение: ваш путь от идеи до автоматизации

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

Но это только начало. MQL5 позволяет реализовывать стратегии любой сложности: от пересечения скользящих средних до нейросетей и мультивалютного арбитража. Изучайте документацию, читайте форумы, разбирайте код чужих советников. Со временем вы сможете создавать системы, которые работают на вас 24/7, пока вы занимаетесь своими делами.

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

«Советник — это не машина для печати денег. Это инструмент, который позволяет вам масштабировать вашу стратегию. Но стратегию всё равно придумываете вы».

 

Дата размещения статьи: 2026-05-26T06:05:40