Всем привет!
Я извиняюсь если это простейший вопрос. Информации действительно много - народ интересуется, даты сообщений от
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 - беда.
А как быть в 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
Сейчас внимательно перечитываю тему ещё раз - но это уже кругу по третьему или четвертому. И пока ответа не нахожу.
Алексей, спасибо за отклик!
Предварительно, я уже видел эту тему. И, кстати, вы там писали бОльшую часть сообщений. Все верно - вопрос, в принципе, тот же. Только человека интересовал расчёт маржи по уже открытой позиции. И, в связи с этим, автору нужны были исторические данные по инструменту. И все углубились туда. В моем случае рассматривается ситуация - сколько будет маржа если я пошлю ордер на открытие "сейчас" - то есть на текущих ценах, текущем плече и т.п..
Если я правильно понял коммент #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 и получим.
Еще раз спасибо за отклик!
Код посмотрел - всё логично. Одно но - прям вот сейчас экспериментирую:
Вот в этой строчке у меня функция 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.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Я извиняюсь если это простейший вопрос. Информации действительно много - народ интересуется, даты сообщений от 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
Идём по составным частям формулы:
А как быть в MQL4?
Или может можно попробовать зайти другим путём?
Калькулятор трейдера Exness https://www.exness.com/ru/calculator показывает формулу расчёта маржи:
Ок, предположим, что они тут как-то (хотя мне и непонятно как) в "Процент от рыночной цены" запихали MarketPrice * Margin_Rate из формулы указанной метаквотсами. Сейчас, в моём случае, это два процента. И я их вижу в спецификации в графе "Margin percentage". Но как получить этот параметр программно?
Thanks in advance!