Исходный код
Для профессионального управления рисками (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: Руководство.




