На главную > Блог > Категория > 🤖 Как написать автоматическую торговую систему на MQL5: от идеи до первой сделки
Вы устали сидеть перед экраном часами? Пропускаете хорошие сделки, потому что отвлеклись? Завидуете ботам, которые торгуют 24/7 без устали? Пришло время написать своего первого экспертного советника (EA) на MQL5.
MQL5 (MetaQuotes Language 5) — это язык программирования для платформы MetaTrader 5. В отличие от устаревшего MQL4, пятая версия предлагает объектно-ориентированное программирование, встроенные классы для торговли, сотни индикаторов и возможность создавать многопоточные приложения [citation:8]. С помощью MQL5 вы можете превратить любую торговую идею в код, который будет открывать и закрывать сделки автоматически. В этой статье я покажу, как создать простого, но полностью рабочего советника с нуля — от установки до тестирования.
«Советник — это ваш цифровой двойник. Он не знает страха, жадности и усталости. Но он настолько же умён, насколько умную стратегию вы в него заложили».
Экспертный советник (Expert Advisor, EA) — это программа на языке MQL5, которая автоматически совершает сделки на основе заданных правил [citation:2]. EA могут торговать 24/7 без вашего участия, анализировать графики, выставлять стоп-лоссы и тейк-профиты, а также управлять капиталом [citation:2].
Любой советник на MQL5 состоит как минимум из трёх обязательных функций-обработчиков. Платформа вызывает их автоматически в нужные моменты [citation:10].
| Функция | Когда вызывается | Что делает |
|---|---|---|
| OnInit() | Один раз при загрузке советника на график | Инициализирует хэндлы индикаторов, устанавливает переменные, проверяет корректность настроек [citation:10] |
| OnTick() | При каждом новом тике (изменении цены) | Основная логика торговли: анализ сигналов, открытие и закрытие позиций, управление стопами [citation:10] |
| OnDeinit() | При выгрузке советника с графика или закрытии терминала | Освобождает ресурсы, удаляет созданные объекты, очищает память [citation:10] |
Создадим простого советника, который торгует по сигналам RSI: покупает, когда RSI опускается ниже 30, и продаёт, когда RSI поднимается выше 70 [citation:1].
В терминале MetaTrader 5 нажмите F4 или выберите «Сервис» → «Редактор MetaQuotes Language» [citation:9]. В открывшемся редакторе: «Файл» → «Новый» → «Советник (шаблон)» [citation:3][citation:9]. Заполните поля:
SimpleRSI_EA
//+------------------------------------------------------------------+
//| 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]
//+------------------------------------------------------------------+
//| 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].
//+------------------------------------------------------------------+
//| 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);
}
}
Нажмите F7 или кнопку «Компилировать» в MetaEditor. Если нет ошибок — советник готов к использованию. В папке MQL5/Experts появится файл SimpleRSI_EA.ex5 [citation:2].
В предыдущем примере мы использовали iRSI — встроенную функцию. Общая схема работы с любым индикатором в MQL5 одинакова [citation:1]:
// Пример для скользящей средней (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].
Прежде чем запускать советника на реальные деньги, обязательно протестируйте его на истории. В MT5 для этого есть мощный инструмент — Тестер Стратегий [citation:2].
Ctrl+R или «Вид» → «Тестер стратегий».SimpleRSI_EA [citation:2].Профессиональные советники пишутся не в одном файле, а с использованием классов и разделения на модули. Это позволяет переиспользовать код и упрощает отладку [citation:5][citation:9].
SimpleRSI_EA.mq5 — главный файл советникаInclude/Signal/RSISignal.mqh — класс для генерации сигналов по RSIInclude/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].
lastBarTime [citation:9].Мы создали работающего советника на RSI. Это простой, но полноценный пример того, как превратить торговую идею в код. Советник анализирует рынок, принимает решения и отправляет ордера без вашего участия.
Но это только начало. MQL5 позволяет реализовывать стратегии любой сложности: от пересечения скользящих средних до нейросетей и мультивалютного арбитража. Изучайте документацию, читайте форумы, разбирайте код чужих советников. Со временем вы сможете создавать системы, которые работают на вас 24/7, пока вы занимаетесь своими делами.
И помните: даже самый совершенный советник требует контроля. Регулярно проверяйте журнал сделок, анализируйте просадки и не запускайте неоттестированного бота на реальные деньги. Автоматизация не отменяет риск-менеджмент, она лишь делает его более дисциплинированным.
«Советник — это не машина для печати денег. Это инструмент, который позволяет вам масштабировать вашу стратегию. Но стратегию всё равно придумываете вы».
Дата размещения статьи: 2026-05-26T06:05:40