Когда наконец поправят расчет маржи?

 

2 

 
Sergey Chalyshev:

 

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

 
Так в "ближайшее время"))
 
Alexey Kozitsyn:

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

Занимаются, но медленно. Видимо у них нет спеца по ММВБ

В данных по инструменту появилось ГО покупателя и ГО продавца


Но из кода, можно получить, пока, только ГО покупателя

SymbolInfoDouble(Symbol(), SYMBOL_MARGIN_INITIAL);
 

ГО продавца:

SymbolInfoDouble(Symbol(),SYMBOL_MARGIN_MAINTENANCE);

Исправления расчета маржи и свободной маржи очень ждем. У меня по реальному торговому счету в БКС неправильно рассчитываются:

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

Параметр брокерского счета

ACCOUNT_MARGIN_SO_MODE

Режим задания минимально допустимого уровня залоговых средств

ACCOUNT_MARGIN

Размер зарезервированных залоговых средств на счете  в валюте депозита

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции

ACCOUNT_MARGIN_INITIAL

Размер средств, зарезервированных на счёте, для обеспечения гарантийной суммы по всем отложенным ордерам

ACCOUNT_MARGIN_MAINTENANCE

Размер средств, зарезервированных на счёте, для обеспечения минимальной суммы по всем открытым позициям

ACCOUNT_MARGIN_INITIAL и ACCOUNT_MARGIN_MAINTENANCE равны нулю и не меняются.

ACCOUNT_MARGIN_SO_MODE=ACCOUNT_STOPOUT_MODE_MONEY, хотя значения параметров ACCOUNT_MARGIN_SO_CALL и ACCOUNT_MARGIN_SO_SO визуально процентные.

ACCOUNT_MARGIN_SO_CALL

Уровень залоговых средств, при котором требуется пополнение счета (Margin Call). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита

200.0

ACCOUNT_MARGIN_SO_SO

Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В зависимости от установленного ACCOUNT_MARGIN_SO_MODE выражается в процентах либо в валюте депозита

100.0

 

вчера тоже имел несколько часов интима с очередным переписыванием и тестированием маржи в скриптах и индикаторах...

смысл в том, что на фьючерсах работает 

SymbolInfoDouble(symbol, SYMBOL_MARGIN_INITIAL)
SymbolInfoDouble(symbol, SYMBOL_MARGIN_MAINTENANCE)

для всех остальных случаев, Stocks, Forex и прочее, работает SymbolInfoMarginRate()

хотя под фьючерсами я понимаю американские, у Just2Trade

double getMargin(
  const string symbol, 
  const double volume,
  const double currentPrice = 0)
{
  double symbolPrice = currentPrice;
  double symbolMarginInitialRate = 1;
  double symbolMarginMaintenanceRate = 1;
  double symbolTick = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
  double symbolValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
  double symbolContract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
  double accountLeverage = (double) AccountInfoInteger(ACCOUNT_LEVERAGE);

  SymbolInfoMarginRate(symbol, ORDER_TYPE_BUY, symbolMarginInitialRate, symbolMarginMaintenanceRate);
  
  if (currentPrice == 0)
  {
    symbolPrice = SymbolInfoDouble(symbol, SYMBOL_ASK);
  }

  double margin = 0;
  double symbolMarginRate = symbolMarginInitialRate;
  double symbolMarginInitial = SymbolInfoDouble(symbol, SYMBOL_MARGIN_INITIAL);
  double symbolMarginMaintenance = SymbolInfoDouble(symbol, SYMBOL_MARGIN_MAINTENANCE);

  // Experimental hack for futures, when built-in margin is 0, margin is ~ current price x 2
  
  if (symbolMarginInitial == 0) 
  {
    symbolMarginInitial = 2 * symbolPrice * symbolMarginInitialRate;
  }

  if (symbolMarginMaintenance == 0) 
  {
    symbolMarginMaintenance = 2 * symbolPrice * symbolMarginMaintenanceRate;
  }

  switch (int(SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE)))
  {
    case SYMBOL_CALC_MODE_FOREX: 
      margin = volume * symbolPrice * symbolMarginRate * symbolValue / symbolTick / accountLeverage; 
      break;
    
    case SYMBOL_CALC_MODE_EXCH_STOCKS: 
      margin = volume * symbolPrice * symbolMarginRate * symbolValue / symbolTick; 
      break;
      
    case SYMBOL_CALC_MODE_FUTURES:
    case SYMBOL_CALC_MODE_EXCH_FUTURES: 
      margin = volume * symbolMarginInitial * symbolMarginRate; 
      break;
    
    case SYMBOL_CALC_MODE_CFD: 
      margin = volume * symbolPrice * symbolMarginRate * symbolValue / symbolTick / accountLeverage; 
      break;
  }  
  
  return margin;
}
 

Сделал еще один костыль. Закодил простенького робота, который раз в минуту пробегается по всем графикам, берет у них символ и последнюю цену. Считает через OrderCalcMargin() маржу и устанавливает в глобальную переменную (имя символа + "margin") значение маржи для контракта размером 1.0. Файлик советника прикреплю.

В сам индикатор влепил код с предыдущего комментария с добавлением следующей логики в самое начало метода:

   double globalValue;
   if(GlobalVariableGet(_Symbol+"margin", globalValue)){
      printf("Retrieved global value: %f",globalValue);
      return volume * globalValue;
   }

То есть, если находит это значение, то использует его. Иначе - следующую после этого куска логику.

Файлы:
 
Эти все проблемы с маржой у Финама, только на единых счетах ? 
 
А сейчас у Финама есть какие-то проблемы с расчетом маржи?