Премудрости в расчете маржи

 

Расчет маржи по активу всегда вызывало у меня сложное чувство: с одной стороны платформа умеет считать ее, но разработчики языка посчитали, что вводить функцию для получения этих данных из программы расслабит граалеваятелей и ограничились подробнейшим описанием для «продвинутых» пользователей. А оно не совсем простое...)
Пока не столкнулся с необходимостью ее посчитать для биржевых активов.
И тут мне стало не до шуток.
Вот снимок экрана:


открыт один лот  EURRUB_TOM  у которого SYMBOL_TRADE_CONTRACT_SIZE=1000.00

                         Calc mode=SYMBOL_CALC_MODE_EXCH_STOCKS

Казалось, чего проще посчитать Margeen=Объем в лотах * Размер контракта * Рыночная цена открытия
Не тут-то было.
В справке далее написано:

Если в спецификации символа в поле "Начальная маржа" задано какое-либо значение, отличное от нуля, то вышеуказанные формулы расчета маржи перестают действовать (кроме расчета для фьючерсов, где все остается по-прежнему). В этом случае для всех типов расчетов, кроме Forex и CFD Leverage, маржа вычисляется как при типе расчета "Futures":

Объем в лотах * Начальная маржа

Объем в лотах * Поддерживающая маржа


На скриншоте видно, что этих значений и самих полей в спецификации символа нет.
в свойствах символа EURRUB_TOM 42 SYMBOL_MARGIN_INITIAL=0.00000000
                              и EURRUB_TOM 43 SYMBOL_MARGIN_MAINTENANCE=0.00000000,

зато не пусто в коэффициентах, а именно      ORDER_TYPE_BUY: 0.15000000 0.07804600

                                            ORDER_TYPE_SELL:0.15000000 0.07238100
- результаты от SymbolInfoMarginRate


как их применить? В справке написано:

Итоговый размер маржинальных требований, вычисленный ранее с учетом конвертации в валюту депозита, будет дополнительно умножен на соответствующий коэффициент.

Например, вычисленная ранее маржа для покупки одного лота EURUSD составляет 1279 USD. Эта сумма дополнительно умножается на коэффициент маржи по длинным позициям. Если, к примеру, он равен 1.15, то итоговый размер маржи будет 1279 * 1.15 = 1470.85 USD.


Но коэффициенты в спецификации меньше единицы!
А величина залога больше предполагаемой в 1.157 раз.
Боюсь предположить, но может нужно сложить все коэффициенты к единице и  умножить на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть значения в поле в поле "Начальная маржа"?

Кто-то знает как в программе на MQL5 получить величину залога, совпадающей с величиной, которую вычислил терминал?
)





Расчет маржи: Retail Forex, CFD, Futures - Для продвинутых пользователей - Торговые операции - Справка по MetaTrader 5
Расчет маржи: Retail Forex, CFD, Futures - Для продвинутых пользователей - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
В торговой платформе предусмотрены разные модели управления рисками, определяющие то, как осуществляется претрейд контроль. На данный момент...
 
Mikhail Dovbakh:

... что вводить функцию для получения этих данных из программы расслабит граалеваятелей 

OrderCalcMargin Вам в помощь

Добавлено: А если руками считать то 

Margeen=Объем в лотах * Размер контракта * Рыночная цена открытия * maintenance_margin_rate    

 
Andrey Miguzov:

OrderCalcMargin Вам в помощь

Добавлено: А если руками считать то 

Margeen=Объем в лотах * Размер контракта * Рыночная цена открытия * maintenance_margin_rate    

Спасибо за попытку помочь.
Но OrderCalcMargin , для нового ордера, а я веду речь о уже имеющейся позиции.
Однако и тут некие странности: 
для открытия ордера якобы требуется почти в семь раз меньше залога, чем после того как ордер открыт: 

)

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin Mainstance:0.00000000

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin koef ORDER_TYPE_BUY:0.15000000 0.07804600

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin koef ORDER_TYPE_SELL:0.15000000 0.07238100

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Calc mode=SYMBOL_CALC_MODE_EXCH_STOCKS

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Trade mode=SYMBOL_TRADE_MODE_FULL

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Leverage=50

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) EURRUB_TOM ------------ end info.

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin:79180.77

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) CalcMargin:10235.63


#property  strict
void OnStart()
{
 //---
  string name=_Symbol;

  Print ("Margin Mainstance:",DoubleToString(SymbolInfoDouble(name,SYMBOL_MARGIN_MAINTENANCE)));
 double init_K,main_K,Marg;
  if ( SymbolInfoMarginRate(name,ORDER_TYPE_BUY,init_K,main_K))
      Print ("Margin koef ORDER_TYPE_BUY:",DoubleToString(init_K)," ", DoubleToString(main_K));
  if ( SymbolInfoMarginRate(name,ORDER_TYPE_SELL,init_K,main_K))  
      Print ("Margin koef ORDER_TYPE_SELL:",DoubleToString(init_K)," ", DoubleToString(main_K));

  ENUM_SYMBOL_CALC_MODE mode=(ENUM_SYMBOL_CALC_MODE) SymbolInfoInteger(name,SYMBOL_TRADE_CALC_MODE);

  Print ("Calc mode=",EnumToString(mode));

  Print ("Trade mode=",EnumToString((ENUM_SYMBOL_TRADE_MODE) SymbolInfoInteger(name,SYMBOL_TRADE_MODE)));
  Print ("Leverage=",(string)AccountInfoInteger(ACCOUNT_LEVERAGE));  

  Print (name," ------------ end info.");
  Print ("Margin:",AccountInfoDouble(ACCOUNT_MARGIN));

if (OrderCalcMargin(ORDER_TYPE_BUY,name,1.0,SymbolInfoDouble(name,SYMBOL_ASK),Marg))   Print ("CalcMargin:",Marg);

}  

 

Одна из моих ошибок - наличие отложенных ордеров по другому символу)

Убрал их.

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin Mainstance:0.00000000

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin koef ORDER_TYPE_BUY:0.15000000 0.07804600

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Margin koef ORDER_TYPE_SELL:0.15000000 0.07238100

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Calc mode=SYMBOL_CALC_MODE_EXCH_STOCKS

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Trade mode=SYMBOL_TRADE_MODE_FULL

2017.07.13 23:27:55.085 CalcMargin (EURRUB_TOM,M5) Leverage=50

2017.07.13 23:41:41.981 CalcMargin (EURRUB_TOM,M5) EURRUB_TOM ------------ end info.

2017.07.13 23:41:41.981 CalcMargin (EURRUB_TOM,M5) Margin:5339.13

2017.07.13 23:41:41.981 CalcMargin (EURRUB_TOM,M5) CalcMargin:10234.5

5339.13 - не понимаю, как это получить?
 

Неттинговый счет на MetaQuotes-Demo для понимания, где экспериментируем.)

 

Похоже, что действительно нужно умножить соответствующий коэффициент SymbolInfoMarginRate на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть или нет значения в поле  "Начальная маржа"

о)

 
Mikhail Dovbakh:

Похоже, что действительно нужно умножить соответствующий коэффициент SymbolInfoMarginRate на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть или нет значения в поле  "Начальная маржа"


ну да

если значение в поле  "Начальная маржа" есть - то пользоваться нужно им

ЗЫ:

68.41 x 1000 x 0.078046 = 5339.13

Только это поддерживающая маржа. Для размещения ордера нужно было:

68.41 x 1000 x 0.15 = 10261.5

Вот начальную маржу для последней цены и возвращает OrderCalcMargin

 
Andrey Miguzov:

ну да

68.41 x 1000 x 0.078046 = 5339.13

Только это поддерживающая маржа. Для размещения ордера нужно было

68.41 x 1000 x 0.15 = 10261.5

Вот начальную маржу для последней цены и возвращает OrderCalcMargin

Все замечательно, спасибо!
только вводит в заблуждение требования в справке наличие значения  в поле "Начальная маржа" для применения этого алгоритма!

повторюсь - EURRUB_TOM 42 SYMBOL_MARGIN_INITIAL=0.00000000
А кроме того, я знаю о  OrderCalcMargin ) и 
мне требовалось распределить по активам уже имеющиеся залоговые требования.
Для управления рисками это иногда нужно.

 

Еще один ребус в документации на ту же тему

Для получения информации о способе вычисления величины залоговых средств по инструменту (размера маржинальных требований) предназначено перечисление ENUM_SYMBOL_CALC_MODE.

ENUM_SYMBOL_CALC_MODE

Идентификатор

Описание

Формула

SYMBOL_CALC_MODE_FOREX

Forex mode – расчет прибыли и маржи для Форекс

Margin:  Lots*Contract_Size/Leverage

Profit:   (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_FUTURES

Futures mode – расчет залога и прибыли для фьючерсов

Margin: Lots *InitialMargin*Percentage/100

Profit:  (close_price-open_price)*TickPrice/TickSize*Lots

SYMBOL_CALC_MODE_CFD

CFD mode – расчет залога и прибыли для CFD

Margin: Lots *ContractSize*MarketPrice*Percentage/100

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDINDEX

CFD index mode – расчет залога и прибыли для CFD на индексы

Margin: (Lots*ContractSize*MarketPrice)*TickPrice/TickSize

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Leverage mode – расчет залога и прибыли для CFD при торговле с плечом

Margin: (Lots*ContractSize*MarketPrice*Percentage)/Leverage

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_EXCH_STOCKS

Exchange mode – расчет залога и прибыли для торговли ценными бумагами на бирже

Margin: Lots*ContractSize*OpenPrice

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_EXCH_FUTURES

Futures mode –  расчет залога и прибыли для торговли фьючерсными контрактами на бирже

Margin: Lots*InitialMargin или Lots*MaintenanceMargin

Profit:  (close_price-open_price)*Lots*TickPrice/TickSize

SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS

FORTS Futures mode –  расчет залога и прибыли для торговли фьючерсными контрактами на FORTS. Размер маржи может уменьшаться на величину отклонения MarginDiscount по следующим правилам:

1. Если цена длинной позиции (ордера на покупку) меньше расчетной цены, то MarginDiscount = Lots*((PriceSettle-PriceOrder)*TickPrice/TickSize)

2. Если цена короткой позиций (ордера на продажу) больше расчетной цены, то MarginDiscount = Lots*((PriceOrder-PriceSettle)*TickPrice/TickSize)

где:

    • PriceSettle – расчетная (клиринговая) цена предыдущей сессии;
    • PriceOrder – средневзвешенная цена позиции или цена открытия, указанная в ордере (заявке);
    • TickPrice – цена тика (стоимость изменения цены на один пункт);
    • TickSize – размер тика (минимальный шаг изменения цены)

Margin: Lots*InitialMargin или Lots*MaintenanceMargin

Profit:  (close_price-open_price)*Lots*TickPrice/TickSize

SYMBOL_CALC_MODE_SERV_COLLATERAL

Collateral mode - инструмент используется в качестве неторгуемого актива на торговом счете. Рыночная стоимость открытой позиции рассчитывается на основании объема, текущей цены рынка,  размера контракта и коэффициента ликвидности. Стоимость учитывается в Активах (Assets), которые суммируются с собственными средствами (Equity). Тем самым открытые позиции по такому инструменту увеличивают размер свободных средств (Free Margin)  и служат дополнительным обеспечением под открытые позиции по торгуемым инструментам

Margin: нет

Profit:  нет

Рыночная стоимость: Lots*ContractSize*MarketPrice*LiqudityRate


Что такое Percentage, и где его узнать?
Вот такие наивные вопросы...

 
Mikhail Dovbakh:

Еще один ребус в документации на ту же тему

Для получения информации о способе вычисления величины залоговых средств по инструменту (размера маржинальных требований) предназначено перечисление ENUM_SYMBOL_CALC_MODE.

ENUM_SYMBOL_CALC_MODE


Что такое Percentage, и где его узнать?
Вот такие наивные вопросы...

Здесь, этот вопрос решался для mql4. Для mql5 вместо

MarketInfo(_Symbol, MODE_MARGINREQUIRED);

надо использовать

bool  SymbolInfoMarginRate( 
   string             name,                     // символ 
   ENUM_ORDER_TYPE    order_type,               // тип ордера 
   double&            initial_margin_rate,      // коэффициент взимания начальной маржи 
   double&            maintenance_margin_rate   // коэффициент взимания поддерживающей маржи 
   );


Единственное отличие, это разбирался вариант для форекс и CFD, но и всё остальное посчитать не составляет труда используя

SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE)

В документации mql5 так не расписано, но в документации mql4 есть в описании идентификаторов запроса для MarketInfo

MODE_MARGINCALCMODE

28

Способ расчета залоговых средств. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD на индексы


и они совпадают со значениями возвращаемыми SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE)
 

Вот, на мой взгляд, хороший ответ на вопрос

Mikhail Dovbakh:

Что такое Percentage, и где его узнать?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как получить программно "Процент маржи"

ir0407, 2017.06.09 13:59

Мой подсчет на калькуляторе занял 30 сек и совпал с числом на твоем скрине.:)

Это и без твоего дополнения видно невооруженным глазом.


Формула Lots*Contract_Size/Leverage является базовой и по ней считается залог в валюте залога для всех инструментов типа Forex.

А вот дальше идут плюшки каждой конкретной кухни(тобишь ДЦ).

1. Валюта маржи может отличаться от валюты депозита. Следовательно результат, полученный по базовой формуле нужно конвертировать в валюту депозита.

2. Кухня может применять скидки/наценки, которые отражены на твоем скрине в графе "Процент маржи". Если число в данной графе отличается от 100% ты должен учесть это в своем расчете.


По первому пункту у тебя валюта депозита USD - значит пересчета делать не нужно. А вот по второму пункту у тебя там "Процент маржи" = 130%... Ни на какие мысли не наводит? Маржа 1300 баксов и "Процент маржи" 130%. Ну неужели ты на столько слеп, что этого не видишь?


Причина обращения: