Как посчитать маржу для CFD типа расчёта

 

Всем привет!
Я извиняюсь если это простейший вопрос. Информации действительно много - народ интересуется, даты сообщений от 2015-2017 годов, какие-то выводы вроде делают, но прямого ответа я не нашёл или не понял.


Задача:

Для простоты - брокер Exness.
Нужно средствами MQL4 посчитать маржу, которая будет взята при открытии позиции на инструменте BTCUSDm с объёмом V.


Способ расчёта маржи для данного инструмента: в спецификации указан CFD. И вызов 

MarketInfo( Symbol(), MODE_MARGINCALCMODE);

возвращает 1.


Понимаю, что это про MQL5, но другой информации по формулам расчёта вообще нет. Согласно https://www.mql5.com/en/docs/constants/environment_state/marketinfoconstants#enum_symbol_calc_mode

SYMBOL_CALC_MODE_CFD

CFD mode - calculation of margin and profit for CFD

Margin: Lots * ContractSize * MarketPrice * Margin_Rate


Идём по составным частям формулы:

  • Lots - задано в условии - объём V.
  • ContractSize - получается из вызова 

double dblContractSize = SymbolInfoDouble( Symbol(), SYMBOL_TRADE_CONTRACT_SIZE);

  • MarketPrice - цена открытия - в зависимости от стороны сделки (buy или sell) получается из вызовов:

double dblAsk = MarketInfo( Symbol(), MODE_ASK);
double dblBid = MarketInfo( Symbol(), MODE_BID);

  • А вот с Margin_Rate - беда.
Для MQL5 есть вызов SymbolInfoMarginRate https://www.mql5.com/en/docs/marketinformation/symbolinfomarginrate
А как быть в MQL4?


Или может можно попробовать зайти другим путём?
Калькулятор трейдера Exness https://www.exness.com/ru/calculator показывает формулу расчёта маржи:
Маржа = Объём * Размер контракта * Процент от рыночной цены
Ок, предположим, что они тут как-то (хотя мне и непонятно как) в "Процент от рыночной цены" запихали   MarketPrice * Margin_Rate   из формулы указанной метаквотсами. Сейчас, в моём случае, это два процента. И я их вижу в спецификации в графе "Margin percentage". Но как получить этот параметр программно?


Thanks in advance!
Ка
 
Yaroslav Belousov:

Всем привет!
Я извиняюсь если это простейший вопрос. Информации действительно много - народ интересуется, даты сообщений от 2015-2017 годов, какие-то выводы вроде делают, но прямого ответа я не нашёл или не понял.


Задача:

Для простоты - брокер Exness.
Нужно средствами MQL4 посчитать маржу, которая будет взята при открытии позиции на инструменте BTCUSDm с объёмом V.


Способ расчёта маржи для данного инструмента: в спецификации указан CFD. И вызов 

возвращает 1.


Понимаю, что это про MQL5, но другой информации по формулам расчёта вообще нет. Согласно https://www.mql5.com/en/docs/constants/environment_state/marketinfoconstants#enum_symbol_calc_mode

SYMBOL_CALC_MODE_CFD

CFD mode - calculation of margin and profit for CFD

Margin: Lots * ContractSize * MarketPrice * Margin_Rate


Идём по составным частям формулы:

  • Lots - задано в условии - объём V.
  • ContractSize - получается из вызова 

  • MarketPrice - цена открытия - в зависимости от стороны сделки (buy или sell) получается из вызовов:

  • А вот с Margin_Rate - беда.
Для MQL5 есть вызов SymbolInfoMarginRate https://www.mql5.com/en/docs/marketinformation/symbolinfomarginrate
А как быть в MQL4?


Или может можно попробовать зайти другим путём?
Калькулятор трейдера Exness https://www.exness.com/ru/calculator показывает формулу расчёта маржи:
Ок, предположим, что они тут как-то (хотя мне и непонятно как) в "Процент от рыночной цены" запихали   MarketPrice * Margin_Rate   из формулы указанной метаквотсами. Сейчас, в моём случае, это два процента. И я их вижу в спецификации в графе "Margin percentage". Но как получить этот параметр программно?


Thanks in advance!
Ка

Формулы для MQL4 точно такие-же. Вот тема, но окончательного решения я не делал.

Как получить программно "Процент маржи"
Как получить программно "Процент маржи"
  • 2017.05.31
  • www.mql5.com
В окне терминала "Спецификации контракта" есть пункт "Процент маржи...
 
Алексей, спасибо за отклик!
Предварительно, я уже видел эту тему. И, кстати, вы там писали бОльшую часть сообщений. Все верно - вопрос, в принципе, тот же. Только человека интересовал расчёт маржи по уже открытой позиции. И, в связи с этим, автору нужны были исторические данные по инструменту. И все углубились туда. В моем случае рассматривается ситуация - сколько будет маржа если я пошлю ордер на открытие "сейчас" - то есть на текущих ценах, текущем плече и т.п..

Если я правильно понял коммент #16  https://www.mql5.com/ru/forum/193833/page2#comment_5228788
double dblMarginRequired = MarketInfo(_Symbol, MODE_MARGINREQUIRED);  // Размер свободных средств, необходимых для открытия 1 лота на покупку

Но, это не маржа взятая в момент открытия ордера, а маржа в настоящее время, по текущей цене.
То есть как бы то что мне и нужно? домножив на объём я бы получил то что мне требуется. (Хотя дальше встал бы вопрос а как посчитать маржу, необходимую для 1 лота на продажу).
Но вот засада - мне сейчас в терминале этот код возвращает 0.0

Сейчас внимательно перечитываю тему ещё раз - но это уже кругу по третьему или четвертому. И пока ответа не нахожу.

 
Yaroslav Belousov:
Алексей, спасибо за отклик!
Предварительно, я уже видел эту тему. И, кстати, вы там писали бОльшую часть сообщений. Все верно - вопрос, в принципе, тот же. Только человека интересовал расчёт маржи по уже открытой позиции. И, в связи с этим, автору нужны были исторические данные по инструменту. И все углубились туда. В моем случае рассматривается ситуация - сколько будет маржа если я пошлю ордер на открытие "сейчас" - то есть на текущих ценах, текущем плече и т.п..

Если я правильно понял коммент #16  https://www.mql5.com/ru/forum/193833/page2#comment_5228788

То есть как бы то что мне и нужно? домножив на объём я бы получил то что мне требуется. (Хотя дальше встал бы вопрос а как посчитать маржу, необходимую для 1 лота на продажу).
Но вот засада - мне сейчас в терминале этот код возвращает 0.0

Сейчас внимательно перечитываю тему ещё раз - но это уже кругу по третьему или четвертому. И пока ответа не нахожу.

Может вот это сообщение поможет, но к сожалению в этом скрипте тоже не всё правильно.

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

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

Alexey Viktorov, 2017.06.05 19:01

Ну и гемор... Проверь как у тебя считает.

void OnStart()
{
 double contractSize = 0, orderMargin = 0, accountMargin = 0; double percentage = 0;
 long leverage = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   int type = -1;
   if(OrderSelect(i, SELECT_BY_POS))
    {
      type = OrderType();
     string symbol = OrderSymbol();
     string symbolCurencyMargin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
     double orderLots = OrderLots();
      leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
     double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);
     double ask = MarketInfo(symbol, MODE_ASK);
     double bid = MarketInfo(symbol, MODE_BID);
     int calcMode = int(SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE));
     int stringFind = StringFind(symbol, "USD");
     double price = stringFind == 0 ? 1 : type%2 == OP_BUY ? bid : ask;
     double orderOpenPrice = stringFind == 0 ? 1 : OrderOpenPrice();
      contractSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
      percentage = NormalizeDouble(margin/(contractSize*price/100)*(calcMode == 0 ? leverage : 1), 0);
      orderMargin = (orderLots*contractSize*orderOpenPrice*percentage/100)/(calcMode == 0 ? leverage : 1);
       Print("******** Процент маржи ", int(percentage), " Маржа ордера ", symbol, " ", orderLots, " = ", orderMargin);
      if(type < OP_BUYLIMIT)
       accountMargin += orderMargin;
    }
  }
 Print("******** AccountMargin = ", DoubleToString(accountMargin, 2)," ", AccountInfoString(ACCOUNT_CURRENCY));
}/********************************************************************/
Этот я сделал чтобы считал и отложенные ордера, но в общую сумму маржи не включает.
а отложенные будут открыты по цене которой ещё нет. Вроде должно получаться, ведь нет разницы по какой цене считать, по цене в прошлом или по цене в будущем.
 

Еще раз спасибо за отклик!

Код посмотрел - всё логично. Одно но - прям вот сейчас экспериментирую:

double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);

Вот в этой строчке у меня функция MarketInfo возвращает 0.0

Ну и дальше вот тут:

percentage = NormalizeDouble(margin/(contractSize*price/100)*(calcMode == 0 ? leverage : 1), 0);

мы тот же 0 и получим.

 
Yaroslav Belousov:

Еще раз спасибо за отклик!

Код посмотрел - всё логично. Одно но - прям вот сейчас экспериментирую:

Вот в этой строчке у меня функция MarketInfo возвращает 0.0

Ну и дальше вот тут:

мы тот же 0 и получим.

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

double  AccountFreeMarginCheck( 
   string  symbol,     // символ 
   int     cmd,        // торговая операция 
   double  volume      // количество лотов 
   );
 

Доброго времени суток!

Спасибо за подсказку! Да такая функция есть - и прочитав я чуть от радости не запрыгал. Но увы - рано.
Я набросал вот такой код в OnInit():

double dblFreeMarginCurrent = AccountFreeMargin();
double dblFreeMarginFuture  = AccountFreeMarginCheck( Symbol(), OP_BUY, 0.1);
long lErrorCode = GetLastError();
double dblMargin = dblFreeMarginCurrent - dblFreeMarginFuture;
  
PrintFormat( "%.2f", dblMargin);
  
ResetLastError();
double dblAsk = SymbolInfoDouble( Symbol(), SYMBOL_ASK);
int nTicket = OrderSend( Symbol(), OP_BUY, 0.1, dblAsk, 7, 0., 0.);

Проверил в терминале. Брокер Exness.
Для простых валютных пар (подозреваю у которых тип расчёта маржи = FOREX) - все работает отлично! И показывает правильный результат.
А вот для пары BTCUSD (тип расчёта маржи = CFD)   dblFreeMarginFuture  получается таким же как и  dblFreeMarginCurrent

И соответственно dblMargin выходит равным 0.

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