Расчет маржинальных требований для Straddle в MQL5

Расчет маржинальных требований для Straddle в MQL5 MQL4 / MQL5 (MetaTrader)
Техническое руководство по расчету маржинальных требований для опционных стратегий Straddle в MQL5 с учетом портфельного офсета рисков.
Суть: Расчет маржинальных требований для опционного Straddle в MQL5 зависит от направления стратегии. Для Long Straddle маржа равна сумме уплаченных премий. Для Short Straddle применяется портфельный офсет (риски по Call и Put не могут реализоваться одновременно), что требует вычисления максимального маржинального требования одной из ног с добавлением премии по противоположной ноге через функцию 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: Защита от расширения спреда во время новостей.

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