Расчет лота от свободной маржи в MQL4: Скрипт с автоокруглением

Расчет лота от свободной маржи в MQL4: Скрипт с автоокруглением MQL4 / MQL5 (MetaTrader)
Готовый MQL4-скрипт для автоматического расчета объема лота от процента свободной маржи (Free Margin) с учетом ограничений брокера и шага лота.
Суть: Готовый MQL4-скрипт для динамического расчета объема торговой позиции (лота) на основе заданного процента от свободной маржи (Free Margin) с учетом спецификации торгового инструмента (минимальный/максимальный лот, шаг изменения лота).

Исходный код

Для профессионального управления рисками (Money Management) критически важно рассчитывать объем каждой сделки динамически. Использование фиксированного лота неэффективно при изменении баланса или свободной маржи. Представленный ниже скрипт для MetaTrader 4 автоматически рассчитывает безопасный объем лота на основе свободной маржи (AccountFreeMargin()) и заданного процента риска.

При разработке сложных торговых систем, где важен не только мани-менеджмент, но и контекст рынка, полезно использовать дополнительные инструменты. Например, перед расчетом лота вы можете запустить Скрипт определения фазы рынка (Флэт/Тренд) на MQL5: ADX + Bollinger Bands, чтобы скорректировать процент риска в зависимости от текущего состояния рынка.

//+------------------------------------------------------------------+
//|                                             LotByFreeMargin.mq4  |
//|                                                   Senior Quant   |
//|                                             https://finfluct.com |
//+------------------------------------------------------------------+
#property copyright "Senior Quant"
#property link      "https://finfluct.com"
#property version   "1.00"
#property strict
#property show_inputs

//--- input parameters
input double RiskPercent = 2.0; // Процент риска от свободной маржи (%)

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // Проверка корректности входных данных
   if(RiskPercent <= 0 || RiskPercent > 100)
   {
      Alert("Ошибка: Процент риска должен быть в диапазоне от 0 до 100%.");
      return;
   }

   string symbol = Symbol();
   double freeMargin = AccountFreeMargin();
   
   // Получаем стоимость маржи для 1 лота
   double marginRequired = MarketInfo(symbol, MODE_MARGINREQUIRED);
   
   if(marginRequired <= 0)
   {
      Alert("Ошибка: Не удалось получить размер маржи для 1 лота. Проверьте подключение к серверу.");
      return;
   }

   // Расчет суммы риска в валюте депозита
   double riskAmount = freeMargin * (RiskPercent / 100.0);

   // Предварительный расчет лота
   double calculatedLot = riskAmount / marginRequired;

   // Округление лота согласно спецификации контракта
   double lotStep = MarketInfo(symbol, MODE_LOTSTEP);
   double minLot = MarketInfo(symbol, MODE_MINLOT);
   double maxLot = MarketInfo(symbol, MODE_MAXLOT);

   if(lotStep <= 0)
   {
      Alert("Ошибка: Шаг лота равен нулю.");
      return;
   }

   // Округляем до ближайшего шага лота вниз
   double finalLot = MathFloor(calculatedLot / lotStep) * lotStep;

   // Проверка на минимальный и максимальный лот
   if(finalLot < minLot)
   {
      Print("Предупреждение: Рассчитанный лот (", DoubleToString(finalLot, 2), ") меньше минимально допустимого. Установлен минимальный лот: ", DoubleToString(minLot, 2));
      finalLot = minLot;
   }
   if(finalLot > maxLot)
   {
      Print("Предупреждение: Рассчитанный лот (", DoubleToString(finalLot, 2), ") превышает максимально допустимый. Установлен максимальный лот: ", DoubleToString(maxLot, 2));
      finalLot = maxLot;
   }

   // Проверка, хватает ли свободной маржи для открытия такого лота
   double requiredMarginForFinalLot = finalLot * marginRequired;
   if(requiredMarginForFinalLot > freeMargin)
   {
      Alert("Ошибка: Недостаточно свободной маржи для открытия лота ", DoubleToString(finalLot, 2), ". Требуется: ", DoubleToString(requiredMarginForFinalLot, 2), ", Доступно: ", DoubleToString(freeMargin, 2));
      return;
   }

   // Вывод результата
   string message = "Расчет лота завершен успешно!\n" +
                    "Свободная маржа: " + DoubleToString(freeMargin, 2) + " " + AccountCurrency() + "\n" +
                    "Риск (" + DoubleToString(RiskPercent, 2) + "%): " + DoubleToString(riskAmount, 2) + " " + AccountCurrency() + "\n" +
                    "Рекомендуемый лот: " + DoubleToString(finalLot, 2);
   
   Alert(message);
   Print(message);
}

Разбор параметров

  • RiskPercent: Процент от текущей свободной маржи (AccountFreeMargin()), который трейдер готов выделить под обеспечение новой сделки. По умолчанию установлен консервативный риск в 2.0%.
  • MODE_MARGINREQUIRED: Системный параметр MQL4, возвращающий размер свободной маржи, необходимый для открытия 1.0 лота по текущему финансовому инструменту.
  • MODE_LOTSTEP: Шаг изменения лота (например, 0.01 для микро-лотов). Используется для корректного округления расчетного значения с помощью функции MathFloor().
  • MODE_MINLOT и MODE_MAXLOT: Ограничения брокера на минимальный и максимальный объем одной сделки. Скрипт автоматически корректирует лот, если расчетное значение выходит за эти рамки.

Как запустить

Для запуска скрипта выполните следующие шаги:

1. Откройте торговый терминал MetaTrader 4 и перейдите в среду разработки MetaEditor, нажав клавишу F4.

2. В дереве проекта найдите папку Scripts, нажмите правой кнопкой мыши и выберите ‘Новый файл’. Создайте скрипт с именем LotByFreeMargin.

3. Скопируйте представленный выше код и вставьте его в созданный файл, полностью заменив стандартный шаблон. Нажмите кнопку ‘Компилировать’ (F7).

4. Вернитесь в MetaTrader 4, откройте панель ‘Навигатор’ (Ctrl+N), найдите скрипт в разделе ‘Скрипты’ и перетащите его на график нужного инструмента.

5. В появившемся окне параметров укажите желаемый процент риска в переменной RiskPercent и нажмите ‘ОК’. Скрипт мгновенно произведет расчет и выведет результат на экран в виде диалогового окна.

Если вы предпочитаете нестандартное отображение графиков для более точного входа, ознакомьтесь с руководством Как создать кастомный график Ренко в MetaTrader 5. А для автоматического сопровождения открытых позиций рекомендуем изучить Трейлинг-стоп по фракталам Билла Вильямса в MQL5: Руководство.

Оцените статью
FinFluct