Как узнать маржу конкретной позиции при хеджинговом учёте? - страница 3

 
fxsaber #:

Просьба привести пример.

Пожалуйста. Есть компания, которая работает с 1999 года и её название начинается на "Альп..." и заканчивается на "...ри". У этой компании на сайте есть раздел "Маржинальные требования". И там есть таблица, в которой символы рынка FOREX распределены по группам и для каждой группы установлено своё кредитное плечо. Кроме того, величина залога может изменяться в зависимости от объёма позиций, уже открытых по другим символам из этой группы. При этом расчётное значение залоговых средств для конкретного инструмента (которое можно получить программно) зависит только от курса валюты маржи к валюте счёта.

При желании вы можете проверить это самостоятельно. Завтра, когда рынок откроется, откройте в этой компании демо-счёт МТ5, запросите скриптом (как предлагалось выше) величину маржи для покупки одного лота инструмента UZDZAR, а потом откройте позицию на покупку и посмотрите, совпадёт фактическое значение с расчётным или нет.   

 
E38 #:

При желании вы можете проверить это самостоятельно. Завтра, когда рынок откроется, откройте в этой компании демо-счёт МТ5, запросите скриптом (как предлагалось выше) величину маржи для покупки одного лота инструмента UZDZAR, а потом откройте позицию на покупку и посмотрите, совпадёт фактическое значение с расчётным или нет.   

OK.

 

На всякий случай я тоже проделал это:

Print("MarginCurrency = ",SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN)); 
double Margin;
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,Ask,Margin);
Print("Margin = ",Margin);
Print("FreeMargin = ",AccountInfoDouble(ACCOUNT_MARGIN_FREE));




Плечо счёта 1:0000. Нетрудно заметить, что функция OrderCalcMargin считает размер залоговых средств с использованием именно этого плеча. А фактическая величина маржи удерживается исходя из индивидуально установленного брокером плеча для этого инструмента — 1:25.

При этом в свойствах символа нет никаких повышающих коэффициентов:


 

E38 #:

фактическая величина маржи удерживается исходя из индивидуально установленного брокером плеча для этого инструмента — 1:25.

При этом в свойствах символа нет никаких повышающих коэффициентов:

Прогнал этот скрипт.

Symb = USDTRY RealMargin = 28745.3 CalcMargin = 862.36 - false
Symb = EURTRY RealMargin = 33333.33 CalcMargin = 1000.0 - false
Symb = USDSGD RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = USDSEK RealMargin = 1724.72 CalcMargin = 862.36 - false
Symb = USDPLN RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = USDNOK RealMargin = 1724.72 CalcMargin = 862.36 - false
Symb = USDMXN RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = USDJPY RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = USDCNH RealMargin = 1724.72 CalcMargin = 862.36 - false
Symb = USDCHF RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = USDCAD RealMargin = 862.36 CalcMargin = 862.36 - true
Symb = NZDUSD RealMargin = 598.63 CalcMargin = 598.63 - true
Symb = NZDSGD RealMargin = 598.63 CalcMargin = 598.63 - true
Symb = NZDJPY RealMargin = 598.63 CalcMargin = 598.63 - true
Symb = NZDCHF RealMargin = 598.63 CalcMargin = 598.63 - true
Symb = NZDCAD RealMargin = 598.63 CalcMargin = 598.63 - true
Symb = GBPUSD RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPSGD RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPNZD RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPJPY RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPCHF RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPCAD RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = GBPAUD RealMargin = 1168.01 CalcMargin = 1168.01 - true
Symb = EURUSD RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURSEK RealMargin = 2000.0 CalcMargin = 1000.0 - false
Symb = EURNZD RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURNOK RealMargin = 2000.0 CalcMargin = 1000.0 - false
Symb = EURJPY RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURGBP RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURCHF RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURCAD RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = EURAUD RealMargin = 1000.0 CalcMargin = 1000.0 - true
Symb = CHFJPY RealMargin = 926.6 CalcMargin = 926.6 - true
Symb = CADJPY RealMargin = 683.05 CalcMargin = 683.05 - true
Symb = AUDUSD RealMargin = 626.79 CalcMargin = 626.79 - true
Symb = AUDNZD RealMargin = 626.79 CalcMargin = 626.79 - true
Symb = AUDJPY RealMargin = 626.79 CalcMargin = 626.79 - true
Symb = AUDCHF RealMargin = 626.79 CalcMargin = 626.79 - true
Symb = AUDCAD RealMargin = 626.79 CalcMargin = 626.79 - true
Symb = USDZAR RealMargin = 3449.41 CalcMargin = 862.35 - false
Symb = EURSGD RealMargin = 1000.0 CalcMargin = 1000.0 - true


Боюсь, задача нерешаема.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2021.05.26 15:12

На скрине показано, что, в отличие от MT4, на MT5 невозможно узнать плечо/маржу символа.


Думаю, Margin_Initial в спецификации символа прописан неправильно, при этом сам торговый сервер берет это значение не из спецификации, что доступна пользователю, а из своей собственной.

 
E38 #:

На всякий случай я тоже проделал это:




Плечо счёта 1:0000. Нетрудно заметить, что функция OrderCalcMargin считает размер залоговых средств с использованием именно этого плеча. А фактическая величина маржи удерживается исходя из индивидуально установленного брокером плеча для этого инструмента — 1:25.

При этом в свойствах символа нет никаких повышающих коэффициентов:


Если не трудно, проверьте что в этом случае получится если маржу получить через OrderCheck()

struct MqlTradeCheckResult 
  { 
   uint         retcode;             // Код ответа 
   double       balance;             // Баланс после совершения сделки 
   double       equity;              // Эквити после совершения сделки 
   double       profit;              // Плавающая прибыль 
   double       margin;              // Маржевые требования 
   double       margin_free;         // Свободная маржа 
   double       margin_level;        // Уровень маржи 
   string       comment;             // Комментарий к коду ответа (описание ошибки) 
  };

РАЗРАБОТЧИКАМ: Кто-же так написал? Маржа это не морж.

 
Alexey Viktorov #:

Если не трудно, проверьте что в этом случае получится если маржу получить через OrderCheck()

Совпадает со значениями других функций.

 
Alexey Viktorov #:

Если не трудно, проверьте что в этом случае получится если маржу получить через OrderCheck()

Проверил

MqlTradeRequest request={};
MqlTradeCheckResult  result={};

request.action   = TRADE_ACTION_DEAL;                    
request.symbol   = _Symbol;                             
request.volume   = 1;                                  
request.type     = ORDER_TYPE_BUY;                       
request.price    = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation= 100;                                     
request.magic    = 0;                        

OrderCheck(request, result);
Print("margin = ", result.margin);



 
SanAlex #:

можно при открытии позиции записать маржу - типа вот так 

Александр, сравните вот этот код

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как узнать маржу конкретной позиции при хеджинговом учёте?

E38, 2021.10.04 09:43

Проверил

MqlTradeRequest request={};
MqlTradeCheckResult  result={};

request.action   = TRADE_ACTION_DEAL;                    
request.symbol   = _Symbol;                             
request.volume   = 1;                                  
request.type     = ORDER_TYPE_BUY;                       
request.price    = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.deviation= 100;                                     
request.magic    = 0;                        

OrderCheck(request, result);
Print("margin = ", result.margin);



и свою портянку… Ну кому надо во всём этом колупаться в поисках нужного фрагмента?
 
SanAlex #:

можно при открытии позиции записать маржу - типа вот так 

ну а потом смотреть - какую позицию лучше закрыть 

E38 2

 
SanAlex #:

можно при открытии позиции записать маржу - типа вот так 

А какой в этом смысл? В приведенном коде сохраняемое значение marginL вычисляется при помощи функции OrderCalcMargin. А как было показано чуть выше, значение маржи, возвращаемое этой функцией (равно как и функцией OrderCheck) в ряде случаев не имеет ничего общего с реальностью.

Мне думается, что при открытии позиции стоит сохранять фактическое значение маржи как разность значений AccountInfoDouble(ACCOUNT_MARGIN) до и после открытия позиции. 

Однако в той ветке, на которую неоднократно здесь ссылались, человек писал, что его брокер увеличивает маржу открытой позиции через некоторое время после её открытия. Хорошо, что этот брокер закрылся и его больше нет. Но вдруг есть ещё такие?

Причина обращения: