Пожалуйста, подскажите, как грамотно рассчитать необходимую маржу для открытия позиции ДО её открытия?
К примеру, я хочу открыть длинную позицию объёмом 1 лот. Я полагал, что рассчитать маржу можно двумя способами:
MarketInfo(_Symbol, MODE_MARGINREQUIRED)
AccountFreeMarginCheck(_Symbol, OP_BUY, 1)
Однако на самом деле оказалось, что оба эти способа возвращают неверные значения.
Вот, к примеру, есть такой брокер Альпари. Плечо моего счёта у данного брокера составляет 1:500, валюта счёта - доллары США. Казалось бы, размер залога (маржи) для покупки одного лота можно вычислить, разделив размер контракта (100 тыс. единиц базовой валюты) на плечо. Дело вроде бы нехитрое. Однако на практике этот подход почему-то не работает. Точнее, результат такого вычисления не совпадает с тем, что возвращают вышеупомянутые функции MQL.
У брокера из моего примера есть таблица (_alpari.forex/ru/trading/trading_terms/#margin_requirements), в которой указаны значения максимального кредитного плеча для различных инструментов. Вот небольшая выдержка из неё:
Symbol | Max. Leverage |
USDCHF | 1:1000 |
USDRUB | 1:100 |
USDZAR | 1:25 |
USDTRY | 1:3 |
Я специально выбрал инструменты с базовой валютой USD для лучшего понимания.
Поскольку плечо моего счёта составляет 1:500, логично предположить, что величина залога при покупке одного лота для данных инструментов должна составлять:
Symbol | Required Margin |
USDCHF | 200 |
USDRUB | 1000 |
USDZAR | 4000 |
USDTRY | 33333.33 |
Для проверки этого предположения я написал простенький скрипт:
void OnStart() {
Print("MarginRequired[USDTRY] = ",MarketInfo("USDTRY",MODE_MARGINREQUIRED));
Print("MarginRequired[USDZAR] = ",MarketInfo("USDZAR",MODE_MARGINREQUIRED));
Print("MarginRequired[USDRUB] = ",MarketInfo("USDRUB",MODE_MARGINREQUIRED));
Print("MarginRequired[USDCHF] = ",MarketInfo("USDCHF",MODE_MARGINREQUIRED));
Print("----------------------------");
Print("MarginCheck[USDTRY] = ",AccountFreeMarginCheck("USDTRY",OP_BUY,1));
Print("MarginCheck[USDZAR] = ",AccountFreeMarginCheck("USDZAR",OP_BUY,1));
Print("MarginCheck[USDRUB] = ",AccountFreeMarginCheck("USDRUB",OP_BUY,1));
Print("MarginCheck[USDCHF] = ",AccountFreeMarginCheck("USDCHF",OP_BUY,1));
}
К моему величайшему удивлению, этот скрипт вернул одинаковые значения для всех валютных пар! В частности, маржа для открытия одного лота USDCHF и USDZAR одинакова и равна 200. Хотя на самом деле она должна отличаться в 167 раз!
Внимание, вопрос! Где в моих рассуждениях ошибка и как на самом деле средствами MQL4 можно получить размер залога ДО открытия позиции?