Некорректный расчет ГО (из-за новых изменений в риск-параметрах биржи) - страница 12

 
Andrey Miguzov #:

Пока торгую у Финама, там расчет маржи у фьючерсов не такой как в Открытии. Пример для sell 

m_initial_margin = SymbolInfoDouble(m_name,SYMBOL_MARGIN_INITIAL);
Расчитываю аналогично - в Открытии для фьючей работает. Получается значение близкое к терминальному (при открытии позиции).
 
Andrey Miguzov #:

Так их брокер для каждого символа прописывает сам. И функция SymbolInfoMarginRate их возвращает.

так тогда?

   //---

   double k_initial_margin, k_maintenance_margin,m_initial_margin,m_margin;

   if(SymbolInfoMarginRate(_Symbol,ORDER_TYPE_BUY,k_initial_margin,k_maintenance_margin)==true)

   {      

      SymbolInfoMarginRate(_Symbol,                // символ

                           ORDER_TYPE_SELL,              // тип ордера

                           k_initial_margin,      // коэффициент взимания начальной маржи

                           k_maintenance_margin   // коэффициент взимания поддерживающей маржи

                           );

      m_initial_margin = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);

      m_margin = m_initial_margin*k_initial_margin;

      Print("ГО ",_Symbol,"=",m_margin);

   }

но мне не внушают доверия полученные цифры


 
Renat Akhtyamov #:

так тогда?

но мне не внушают доверия полученные цифры


В общем, собрал скрипт по итогам всех обсуждений. И для Финама и для Открытия. Показывает сколько должно быть средств на счете при открытии позиции, при условии, что открытых позиций нет.

По Финаму проверял - МТ5 учитывает и проверяет так же как в скрипте. 

По Открытию постараюсь завтра проверить - там по фьючерсу есть различия между рыночными и лимитными ордерами. Видится, что МТ5 проверяет при открытии позиции средства по рыночному, а не по лимитному.

 

Вот эта картинка теперь у меня выглядит так:

Запущен у брокера JSC Investment Company FINAM на символе EDZ2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 10386.86
Для продажи необходимо: 10837.91

Запущен у брокера JSC Investment Company FINAM на символе EDM2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 7729.22
Для продажи необходимо: 8045.21

Запущен у брокера JSC Investment Company FINAM на символе EDU2
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES
Минимальный лот: 1.00
Для покупки необходимо: 8588.08
Для продажи необходимо: 8901.28

Скрипт:

//+--------------------------------------------------------------------------+
//| Скрипт показывает размер необходимых средств для открытия позиции
//+--------------------------------------------------------------------------+
void OnStart()
  {
   double initial_margin = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);

   double k_initial_margin_buy = 0;
   double k_maintenance_margin_buy = 0;

   double k_initial_margin_sell = 0;
   double k_maintenance_margin_sell = 0;

   SymbolInfoMarginRate(_Symbol, ORDER_TYPE_BUY, k_initial_margin_buy,k_maintenance_margin_buy);
   SymbolInfoMarginRate(_Symbol, ORDER_TYPE_SELL, k_initial_margin_sell,k_maintenance_margin_sell);

   double price_buy = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double price_sell = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   if (price_buy<DBL_EPSILON || price_sell<DBL_EPSILON)
   {
   MqlRates rates[1];
   CopyRates(_Symbol,PERIOD_CURRENT,0,1,rates);
   price_buy = rates[0].close;
   price_sell = rates[0].close;
   }

   double contract_size = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);

   double min_lot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

   string broker_name= TerminalInfoString(TERMINAL_COMPANY);

   double margin_buy=0;
   double margin_sell=0;

   ENUM_SYMBOL_CALC_MODE type_symbol = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE);

   if(broker_name=="JSC Investment Company FINAM")
     {
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_STOCKS)
        {
         margin_buy = price_buy*contract_size*k_initial_margin_buy;
         margin_sell = price_sell*contract_size*k_initial_margin_sell;
         
      /* //Ещё один вариант
         if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,min_lot,price_buy,margin_buy))
         Print("Ошибка в OrderCalcMargin!");
         
         if(!OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,min_lot,price_sell,margin_sell))
         Print("Ошибка в OrderCalcMargin!");       */      
        }

      if(type_symbol==SYMBOL_CALC_MODE_EXCH_FUTURES)
        {
         margin_buy = initial_margin*k_initial_margin_buy;
         margin_sell = initial_margin*k_initial_margin_sell;                       
        }
      }
      
   if(broker_name=="АО ''Открытие Брокер''")
     { 
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX)
        {
         margin_buy = price_buy*contract_size*1.0;
         margin_sell = price_sell*contract_size*1.0;
        }
     
      if(type_symbol==SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS)
        {
         if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,min_lot,price_buy,margin_buy))
         Print("Ошибка в OrderCalcMargin!");
         
         if(!OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,min_lot,price_sell,margin_sell))
         Print("Ошибка в OrderCalcMargin!");
        }
     }      

   Print("--------------- Старт работы скрипта " + MQLInfoString(MQL_PROGRAM_NAME) +  " -----------------");
   Print("Запущен у брокера ", broker_name," на символе ", _Symbol);
   Print("Cпособ вычисления величины залоговых средств: ", EnumToString(type_symbol));
   Print("Минимальный лот: ", DoubleToString(min_lot, 2));
   Print("Для покупки необходимо: ", DoubleToString(margin_buy, 2));
   Print("Для продажи необходимо: ", DoubleToString(margin_sell, 2));
   Print("+++++++++++++++ Завершение работы скрипта " + MQLInfoString(MQL_PROGRAM_NAME) +  " ++++++++++++");
  }

Добавлено:

Уже после того как выложил, наткнулся на раздел в справке:

Для акций

Для фьючерсов

Там подробно с примерами всё разжёвано, раньше не видел...

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

Проверил скрипт в Открытии на фьючерсе на реальном счете - открывал и закрывал позиции руками в терминале (через панель и стакан). Ниже выводы и логи.

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

Запущен у брокера АО ''Открытие Брокер'' на символе Si-6.22
Cпособ вычисления величины залоговых средств: SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS
Минимальный лот: 1.00
Для покупки по рынку необходимо: 9296.91
Для покупки лимитником необходимо: 5166.91
На счете лежит 29 350 р - открытых позиций или выставленных ордеров нет.

По логике расчета я могу купить 3 лота по рынку (29350.00/9296.91 = 3.16) или 5 лотов лимитным ордером (29350.00/5166.91 = 5.68). Проверяем:

1 Шаг - проверяем рыночный ордер.

Открываю панель быстрой торговли на графике (стандартную) - пытаюсь купить 4 лота. Вкладка журнал:

2022.06.09 12:11:56.034 Trades '': exchange buy 4 Si-6.22 at market
2022.06.09 12:11:56.064 Trades '': failed exchange buy 4 Si-6.22 at market [No money]

Денег не хватило.

2 Шаг - проверяем рыночный ордер.

Открываю панель быстрой торговли на графике (стандартную) - пытаюсь купить 3 лота. Вкладка журнал:

2022.06.09 12:12:22.614 Trades '': exchange buy 3 Si-6.22 at market
2022.06.09 12:12:22.624 Trades '': accepted exchange buy 3 Si-6.22 at market
2022.06.09 12:12:22.624 Trades '': exchange buy 3 Si-6.22 at market placed for execution
2022.06.09 12:12:22.649 Trades '': order #208239479 buy 3 / 3 Si-6.22 at 62851 done in 16.330 ms
2022.06.09 12:12:22.654 Trades '': deal #114041970 buy 2 Si-6.22 at 58794 done (based on order #208239479)
2022.06.09 12:12:22.689 Trades '': deal #114041971 buy 1 Si-6.22 at 58796 done (based on order #208239479)

Денег хватило, позиция открыта.

3 Шаг - проверяем лимитный ордер.

Открываю стакан - выставляю лимитный ордер на покупку - пытаюсь купить 6 лотов. Вкладка журнал:

2022.06.09 12:57:10.079 Trades '': buy limit 6 Si-6.22 at 58686
2022.06.09 12:57:10.089 Trades '': failed buy limit 6 Si-6.22 at 58686 [No money]

Денег не хватило.

4 Шаг - проверяем лимитный ордер.

Открываю стакан - выставляю лимитный ордер на покупку - пытаюсь купить 5 лотов. Вкладка журнал:

2022.06.09 12:51:22.921 Trades '': buy limit 5 Si-6.22 at 58670
2022.06.09 12:51:22.931 Trades '': accepted buy limit 5 Si-6.22 at 58670
2022.06.09 12:51:22.931 Trades '': buy limit 5 Si-6.22 at 58670 placed for execution
2022.06.09 12:51:22.936 Trades '': order #208249897 buy limit 5 / 5 Si-6.22 at 58670 done in 17.292 ms

Денег хватило, ордер выставлен.

Вывод:

1. В Открытии выгоднее торговать лимитными ордерами :)

2. Скрипт показывает верную информацию - OrderCalcMargin() работает корректно.

 

Ну и собственно объяснение почему отличается маржа по рыночным и лимитным ордерам:

Коротко - рыночный ордер выставляется по максимальной/минимальной цене за данную сессию (выше в логах это видно). Получается, может быть интересная ситуация, когда ордер Stop Limit (отложка) выставляется успешно, но когда цена к ней подходит - не исполняется :)

Полностью из справки:

Для фьючерсных контрактов срочной секции Московской Биржи маржа рассчитывается отдельно для каждого символа. Сначала рассчитывается маржа для открытой позиции и всех ордеров на покупку, а затем — маржа для той же позиции и всех ордеров на продажу.

MarginBuy  = MarginPos + Sum(MarginBuyOrder)

MarginSell = MarginPos + Sum(MarginSellOrder))

В качестве итогового значения маржи по символу принимается наибольшее из этих двух значений.

Как уже упоминалось выше, одна и та же позиция принимает участие в расчете обоих значений. В первой формуле (с ордерами на покупку) маржа позиции рассчитывается следующим образом:

MarginPos  = Объем * (InitialMarginBuy  + (Цена открытия - SettlementPrice) * Цена тика / Размер тика * (1 + 0.01 * Коэффициент валюты маржи))

При этом объем позиции берется с положительным знаком, если она длинная, и с отрицательным знаком — если она короткая.

Во второй формуле (с ордерами на продажу) маржа позиции рассчитывается следующим образом:

MarginPos = Объем * (InitialMarginSell + (SettlementPrice - Цена открытия) * Цена тика / Размер тика * (1 + 0.01 * Коэффициент валюты маржи))

При этом объем позиции берется с положительным знаком, если она короткая, и с отрицательным знаком — если она длинная.

Фактически, такой подход обеспечивает для трейдера скидку по марже при наличии открытой позиции в противоположном направлении относительно выставленных ордеров (позиция выступает обеспечением по ордерам).

Маржа по ордерам рассчитывается по следующим формулам:

MarginBuyOrder  = Объем * (InitialMarginBuy  + (Price - SettlementPrice) * Цена тика / Размер тика * (1 + 0.01 * Коэффициент валюты маржи))

MarginSellOrder = Объем * (InitialMarginSell + (SettlementPrice - Price) * Цена тика / Размер тика * (1 + 0.01 * Коэффициент валюты маржи))

Здесь Price зависит от типа ордера, и может принимать значения:

Максимальная и минимальная цена контракта для текущей сессии — для еще не исполненных рыночных и стоп-ордеров на покупку и продажу, соответственно. Поскольку в рыночных ордерах цена не указывается, с трейдера взимается максимально возможная маржа. 
Стоп-ордера после срабатывания ведут себя аналогично рыночным.
Цена ордера — для лимитных ордеров.
Цена Stop Limit — для стоп-лимитных ордеров.
Остальные параметры в формулах:

InitialMarginBuy — первоначальная маржа покупки.
InitialMarginSell — первоначальная маржа продажи.
Коэффициент валюты маржи — радиус изменения курса валюты, в которой номинирован фьючерсный контракт, к Российскому рублю.
SettlementPrice — расчетная цена инструмента для текущей сессии.
Все параметры для расчета передаются Московской биржей для каждой сессии.
 
Andrey Miguzov #:

Проверил скрипт в Открытии на фьючерсе на реальном счете - открывал и закрывал позиции руками в терминале (через панель и стакан). Ниже выводы и логи.

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

По логике расчета я могу купить 3 лота по рынку (29350.00/9296.91 = 3.16) или 5 лотов лимитным ордером (29350.00/5166.91 = 5.68).

Есть ещё пара моментов:

1. Как я понимаю, можно купить 3 лота по рынку сразу, а потом ещё один или два раза по одному лоту - тоже по рынку.

2. Похоже, текущая поза не всегда учитывается для каждого символа отдельно - у меня сейчас открыто

  MIX-6.22  sell 4

  RTS-6.22 buy 6

И MT5 мне рисует текущую маржу 280940.22, хотя там по каждому символу примерно по столько должно быть.

 
JRandomTrader #:

Есть ещё пара моментов:

1. Как я понимаю, можно купить 3 лота по рынку сразу, а потом ещё один или два раза по одному лоту - тоже по рынку.

2. Похоже, текущая поза не всегда учитывается для каждого символа отдельно - у меня сейчас открыто

  MIX-6.22  sell 4

  RTS-6.22 buy 6

И MT5 мне рисует текущую маржу 280940.22, хотя там по каждому символу примерно по столько должно быть.

1. Да. Я раньше не понимал почему. Теперь понимаю :)

2. Ваш случай - это спред:

Там где спред - берется большое значение маржи, я так понял:

В данном режиме для каждой стороны спреда будет рассчитываться значение начальной и поддерживающей маржи. Расчет осуществляется суммированием маржинальных требований по всем символам стороны. 
Для спреда будут использоваться маржинальные требования той стороны, где значение больше.

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

Добавлено:

До меня, после прочтения справки по ссылкам выше, наконец дошло как всё считается. Хотя до этого читал много статей и форумы на эту тему. Но только после прочтения справки МТ5 именно дошло полностью :) Вообще разработчикам за документацию спасибо огромное - сделана очень понятно и доступно.


"Если ничего не помогает - прочтите наконец инструкцию!" :)

Спреды - Для продвинутых пользователей - Торговые операции - Справка по MetaTrader 5
Спреды - Для продвинутых пользователей - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
По торговыми позициям может осуществляться льготное взимание маржи, в случае когда они находятся в спреде по отношению друг к другу. Нахождением в...
 
Andrey Miguzov #:

1. Да. Я раньше не понимал почему. Теперь понимаю :)

2. Ваш случай - это спред:

Там где спред - берется большое значение маржи, я так понял:

Добавлено:

До меня, после прочтения справки по ссылкам выше, наконец дошло как всё считается. Хотя до этого читал много статей и форумы на эту тему. Но только после прочтения справки МТ5 именно дошло полностью :) Вообще разработчикам за документацию спасибо огромное - сделана очень понятно и доступно.


"Если ничего не помогает - прочтите наконец инструкцию!" :)

До сих пор у Вас не верный расчет.

Вот реальные цифры:

кликаете по необходимому инструменту и смотрите ГО в спецификации

там же можно увидеть все остальные сборы - комиссии и прочее

// это и есть ответ на вопрос ветки, т.е. что должно получиться в итоге!

Расчет может не сходиться в силу оценки уровня квалификации брокером. Если брокер решит, что уровень квалификации трейдера далек от профессионального, то ГО будет другим.

https://www.moex.com/ru/derivatives/

Московская Биржа - Срочный рынок
Московская Биржа - Срочный рынок
  • www.moex.com
Влияем на развитие, создаем будущее. Миссия Группы — способствовать экономическому росту и реструктуризации российской экономики путем расширения возможностей по привлечению капитала для компаний и создания удобной, надежной и прозрачной инвестиционной среды для российских и иностранных инвесторов.
 
Renat Akhtyamov #:

До сих пор у Вас не верный расчет.

Вот реальные цифры:

кликаете по необходимому инструменту и смотрите ГО в спецификации

там же можно увидеть все остальные сборы - комиссии и прочее

// это и есть ответ на вопрос ветки, т.е. что должно получиться в итоге!

Расчет может не сходиться в силу оценки уровня квалификации брокером. Если брокер решит, что уровень квалификации трейдера далек от профессионального, то ГО будет другим.

https://www.moex.com/ru/derivatives/

Проведите эксперимент по аналогии с моим. Возьмите Ваш баланс на счете и разделите на значение ГО биржи из спецификации по любому контракту (ссылку Вы дали). Полученное число округлите до целого (вниз). Попробуйте в МТ5 открыть позицию по этому инструменту с размером лота, который получили (открывать через стандартную панель быстрой торговли). Не у Финама, ни у Открытия у Вас сделка не откроется - не хватит денег.

Чтобы понять, сколько лотов Вы можете открыть на свои средства - можно воспользоваться скриптом из 113 сообщения данной ветки.

Ваш код из 112 сообщения для Финама тоже подойдет.

Добавлено:

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

 
Московская Биржа - Рынки
Московская Биржа - Рынки
  • www.moex.com
Принципы и методика Принципы расчета гарантийного обеспечения Методика расчета теоретической цены опциона и коэффициента "дельта" Принципы расчета вариационной маржи и гарантийного обеспечения с использованием текущих курсов валют Методика определения риск-параметров на срочном рынке Изменения с 6 апреля 2015 года в системе расчета гарантийного обеспечения при внедрении механизма автоэкспирации опционов Руководство для участников клиринга по инструментам лимитирования клиентов Управление параметрами учета рисков экспирации опционов Сервис ForecastIM Система маржирования в SPECTRA 6.0.
Причина обращения: