... что вводить функцию для получения этих данных из программы расслабит граалеваятелей
OrderCalcMargin Вам в помощь
Добавлено: А если руками считать то
Margeen=Объем в лотах * Размер контракта * Рыночная цена открытия * maintenance_margin_rate
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
Неттинговый счет на MetaQuotes-Demo для понимания, где экспериментируем.)
Похоже, что действительно нужно умножить соответствующий коэффициент SymbolInfoMarginRate на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть или нет значения в поле "Начальная маржа"
о)
Похоже, что действительно нужно умножить соответствующий коэффициент SymbolInfoMarginRate на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть или нет значения в поле "Начальная маржа"
ну да
если значение в поле "Начальная маржа" есть - то пользоваться нужно им
ЗЫ:
68.41 x 1000 x 0.078046 = 5339.13
Только это поддерживающая маржа. Для размещения ордера нужно было:
68.41 x 1000 x 0.15 = 10261.5
Вот начальную маржу для последней цены и возвращает OrderCalcMargin
ну да
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.
Идентификатор | Описание | Формула |
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) где:
| 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, и где его узнать?
Вот такие наивные вопросы...
Еще один ребус в документации на ту же тему
Для получения информации о способе вычисления величины залоговых средств по инструменту (размера маржинальных требований) предназначено перечисление 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%. Ну неужели ты на столько слеп, что этого не видишь?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Расчет маржи по активу всегда вызывало у меня сложное чувство: с одной стороны платформа умеет считать ее, но разработчики языка посчитали, что вводить функцию для получения этих данных из программы расслабит граалеваятелей и ограничились подробнейшим описанием для «продвинутых» пользователей. А оно не совсем простое...)
Пока не столкнулся с необходимостью ее посчитать для биржевых активов.
И тут мне стало не до шуток.
Вот снимок экрана:
открыт один лот 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
- результаты от SymbolInfoMarginRate
как их применить? В справке написано:
Итоговый размер маржинальных требований, вычисленный ранее с учетом конвертации в валюту депозита, будет дополнительно умножен на соответствующий коэффициент.
Например, вычисленная ранее маржа для покупки одного лота EURUSD составляет 1279 USD. Эта сумма дополнительно умножается на коэффициент маржи по длинным позициям. Если, к примеру, он равен 1.15, то итоговый размер маржи будет 1279 * 1.15 = 1470.85 USD.
Но коэффициенты в спецификации меньше единицы!
А величина залога больше предполагаемой в 1.157 раз.
Боюсь предположить, но может нужно сложить все коэффициенты к единице и умножить на размер маржинальных требований рассчитанных для CFD, Exchange Stocks не зависимо от того есть значения в поле в поле "Начальная маржа"?
Кто-то знает как в программе на MQL5 получить величину залога, совпадающей с величиной, которую вычислил терминал?
)