В этой статье обозреваю возможности платформы для трейдинга MetaTrader 5, но глазами программиста. Покажу, как самому написать на MQL5 программы-советники (по-трейдерски — индикаторы), которые избавят трейдеров от рутины.


Скелет программы: из чего состоит советник

Любая программа на MQL5 начинается с описания свойств и подключений:

#property strict
#property version "1.00"
#include <Trade/Trade.mqh>

После этого идут системные обработчики событий — функции, которые вызываются самим терминалом в нужный момент:

Функция

Когда вызывается

Для чего нужна

OnInit()

при запуске эксперта

инициализация, загрузка параметров

OnDeinit()

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

очистка, сохранение состояния

OnTick()

при каждом новом тике

основная логика торговли

OnTimer()

по таймеру

периодические проверки, повторные попытки

OnTradeTransaction()

при любых торговых событиях

реакция на ордера и сделки

OnChartEvent()

при действиях на графике

работа с линиями, кнопками, панелями

Дальше вы можете выбрать сами, какие именно события обрабатывать: в простых задачах достаточно OnTradeTransaction, а в торговых системах — весь набор.


Зачем автоматизировать управление риском 

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

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

  • устранить человеческий фактор при оценке риска и защитить капитал.

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

А с программой-советником не придется постоянно держать в голове мысль о стоп-лоссе. Достаточно один раз осознанно выбрать процент риска, который вы готовы понести в сделке — например, 1%. Дальше программа будет подставлять это значение в каждую вашу сделку.

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


Как автоматизировать расчет стоп-лосса и тейк-профита

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

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

  1. Определяем допустимый убыток в деньгах:

    double balance = AccountInfoDouble(ACCOUNT_BALANCE);
    double risk_money = balance * (RiskPercent / 100.0);
  2. Получаем стоимость пункта и минимальный шаг:

    double pip_size  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
    double pip_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
  3. Вычисляем, сколько пунктов допустимо до стопа:

    double volume = PositionGetDouble(POSITION_VOLUME);
    double sl_pips = risk_money / (pip_value * volume);
    double dist = sl_pips * pip_size;
  4. Строим уровни SL и TP:

    double entry = PositionGetDouble(POSITION_PRICE_OPEN);
    double sl, tp;
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){
        sl = entry - dist;
        tp = entry + dist * RiskRewardRatio;
    }else{
        sl = entry + dist;
        tp = entry - dist * RiskRewardRatio;
    }
  5. Отправляем изменения в торговый сервер:

    MqlTradeRequest req={0};
    MqlTradeResult  res={0};
    req.action   = TRADE_ACTION_SLTP;
    req.position = PositionGetInteger(POSITION_TICKET);
    req.sl = NormalizeDouble(sl, _Digits);
    req.tp = NormalizeDouble(tp, _Digits);
    req.symbol = _Symbol;
    OrderSend(req, res);

«А может сразу и расчет лотности нам автоматизируешь?», — получил я в догонку от брокера, приступив к созданию помощника. 

«Человеческая лень не ведает границ», — подумал я и согласился сделать калькулятор лотов.

Lot= \frac{\text{RiskMoney}}{\text{StopPips} \times \text{PipValue}}

double lot = risk_money / (stop_pips * pip_value);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double minlot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
lot = MathMax(minlot, MathRound(lot / step) * step);

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


Почему нельзя просто написать «100 пунктов стопа»

У разных инструментов — разные размеры пункта и разная стоимость тика:

Символ

Размер тика

Стоимость тика

Комментарий

EURUSD

0.00001

~1 USD

стандартная пара

USDJPY

0.001

~1 USD

другая точность

XAUUSD (золото)

0.01 или 0.1

~1 USD / 0.01

брокер-зависимо

US500 (индекс)

0.25 или 1.0

зависит от контракта

CFD-инструмент

Но есть нюанс. Для сделок по золоту брокеры часто используют:

  • нестандартный шаг цены (0.01 или 0.1);

  • крупный минимальный лот (0.1 или 1);

  • другие параметры контракта.

Если указать «100 пунктов», то на паре EURUSD — это 10 пипсов, а на золоте (XAUUSD) — уже 10 долларов движения. Если вы этого не учли, то советник откроет позицию в 10 раз больше расчётной.

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

Например, я использовал такие:

double tick_value = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tick_size  = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double pip_value_per_lot = (tick_value * pip_size) / tick_size;

Что калькулятор лотов даёт трейдеру

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

Преимущества очевидны, но давайте огласим весь список:

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

  • Защита капитала от лени и провалов в памяти: стопы ставятся мгновенно, можно не перепроверять.

  • Совместимость: калькулятор подходит для сделок с валютными парами, металлами и индексами.

  • Дисциплина: риск перестаёт зависеть от эмоций.

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

Напишите, какой еще помощник нужен трейдерам — возьму идеи в разработку.

Комментарии (0)