OrderCalcMargin().Исходный код
Для точного расчета маржинальных требований под сложные опционные конструкции необходимо использовать системную функцию OrderCalcMargin(). Ниже представлен готовый класс-калькулятор на MQL5, который вычисляет как базовую (суммированную), так и оптимизированную (биржевую) маржу для стратегии Straddle.
//+------------------------------------------------------------------+
//| StraddleMarginCalc.mq5|
//| Senior Quant Developer|
//+------------------------------------------------------------------+
#property copyright "Copyright 2024"
#property version "1.00"
#property script_show_inputs
enum ENUM_STRADDLE_TYPE
{
STRADDLE_LONG, // Long Straddle (Покупка Call + Put)
STRADDLE_SHORT // Short Straddle (Продажа Call + Put)
};
input string InpCallSymbol = "EURUSD-31DEC24-1.10-C"; // Тикер Call опциона
input string InpPutSymbol = "EURUSD-31DEC24-1.10-P"; // Тикер Put опциона
input double InpVolume = 1.0; // Объем в лотах
input ENUM_STRADDLE_TYPE InpType = STRADDLE_SHORT; // Тип стратегии
void OnStart()
{
double callMargin = 0.0;
double putMargin = 0.0;
ENUM_ORDER_TYPE orderType = (InpType == STRADDLE_LONG) ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
// 1. Расчет маржи для Call-ноги
double callPrice = (orderType == ORDER_TYPE_BUY) ? SymbolInfoDouble(InpCallSymbol, SYMBOL_ASK) : SymbolInfoDouble(InpCallSymbol, SYMBOL_BID);
if(!OrderCalcMargin(orderType, InpCallSymbol, InpVolume, callPrice, callMargin))
{
Print("Ошибка расчета маржи для Call: ", GetLastError());
return;
}
// 2. Расчет маржи для Put-ноги
double putPrice = (orderType == ORDER_TYPE_BUY) ? SymbolInfoDouble(InpPutSymbol, SYMBOL_ASK) : SymbolInfoDouble(InpPutSymbol, SYMBOL_BID);
if(!OrderCalcMargin(orderType, InpPutSymbol, InpVolume, putPrice, putMargin))
{
Print("Ошибка расчета маржи для Put: ", GetLastError());
return;
}
// 3. Расчет совокупных требований
double totalNaiveMargin = callMargin + putMargin;
double totalOptimizedMargin = 0.0;
if(InpType == STRADDLE_LONG)
{
// Для лонг-страдла маржа — это просто сумма премий (риск ограничен)
totalOptimizedMargin = totalNaiveMargin;
}
else
{
// Для шорт-страдла риски перекрываются. Базовый актив не может одновременно пойти вверх и вниз.
// Стандартное биржевое правило (SPAN-подобное): Max(Margin(Call), Margin(Put)) + Премия противоположной ноги
double callContractSize = SymbolInfoDouble(InpCallSymbol, SYMBOL_TRADE_CONTRACT_SIZE);
double putContractSize = SymbolInfoDouble(InpPutSymbol, SYMBOL_TRADE_CONTRACT_SIZE);
double callPremium = callPrice * InpVolume * callContractSize;
double putPremium = putPrice * InpVolume * putContractSize;
if(callMargin > putMargin)
{
totalOptimizedMargin = callMargin + putPremium;
}
else
{
totalOptimizedMargin = putMargin + callPremium;
}
}
Print("=== РЕЗУЛЬТАТЫ РАСЧЕТА МАРЖИ STRADDLE ===");
Print("Call Маржа (индивидуальная): ", DoubleToString(callMargin, 2));
Print("Put Маржа (индивидуальная): ", DoubleToString(putMargin, 2));
Print("Простая суммарная маржа: ", DoubleToString(totalNaiveMargin, 2));
Print("Оптимизированная маржа (с учетом офсета): ", DoubleToString(totalOptimizedMargin, 2));
} Разбор параметров
InpCallSymbol: Строковый идентификатор опционного контракта типа Call в торговом терминале.InpPutSymbol: Строковый идентификатор опционного контракта типа Put с той же датой экспирации и страйком.InpVolume: Торговый объем в лотах, для которого производится калькуляция обеспечения.InpType: Направление стратегии (STRADDLE_LONGдля покупки волатильности илиSTRADDLE_SHORTдля продажи волатильности).
Как запустить
Для интеграции и тестирования скрипта выполните следующие действия:
1. Откройте MetaEditor в MetaTrader 5, создайте новый скрипт и вставьте в него представленный код.
2. Убедитесь, что в окне «Обзор рынка» вашего терминала активированы и загружены котировки для выбранных опционных символов Call и Put.
3. Скомпилируйте скрипт и перетащите его на любой открытый график.
При работе с высокочастотными опционными стратегиями или сложными сетками ордеров вы можете столкнуться с ограничениями платформы на количество открытых позиций. Чтобы обойти эти лимиты, изучите статью MT4 Max Orders Bypass: Скрипт для обхода ограничения через пулы заявок.
Для непрерывного мониторинга маржинальных показателей вашего портфеля на удаленном сервере и отправки мгновенных алертов в Discord, воспользуйтесь готовым решением из статьи MQL5 Discord WebRequest: Логирование Сделок Советника на VPS.
Также учитывайте, что во время выхода важных макроэкономических новостей спреды по опционам могут резко расширяться, что приводит к мгновенному росту маржинальных требований. Для защиты от подобных рисков рекомендуется внедрить фильтрацию спреда, описанную в материале MQL4 Spread Filter: Защита от расширения спреда во время новостей.




