Сегодня была такая же мысль написать на форум... Очень странно, что разработчики этим вопросом не занимаются.
Сегодня была такая же мысль написать на форум... Очень странно, что разработчики этим вопросом не занимаются.
Занимаются, но медленно. Видимо у них нет спеца по ММВБ
В данных по инструменту появилось ГО покупателя и ГО продавца
Но из кода, можно получить, пока, только ГО покупателя
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; }
То есть, если находит это значение, то использует его. Иначе - следующую после этого куска логику.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования