Как вычислить маржу?

 

Добрый день!

Внезапно столкнулся с ситуацией, в которой залог по открытым позициям существенно (в 20 раз) увеличился. Есть подозрение, что брокер увеличил маржинальные требования для открытых позиций. Это предположение подтверждается необычно высоким значением AccountMargin, которое в несколько раз превышает расчётное значение для данного инструмента и установленного кредитного плеча. 

На одном из счетов, оказавшихся в такой ситуации, я был вынужден закрыть с убытком последние открытые позиции, имеющие наибольший объём, дабы снизить нагрузку на депозит и не допустить Stop Out. И в какой-то момент (после закрытия очередной убыточной позиции) значение AccountMargin вернулось к расчётному уровню. Не исключено, что я заметил это не сразу и по этой причине не могу с уверенностью утверждать, для каких именно позиций были применены повышенные маржинальные требования. 

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

Есть ли какой-то способ узнать размер залога (маржи) для каждой открытой позиции в терминале отдельно? В терминале я вижу только общую сумму залога, это же значение возвращает функция AccountMargin(). В справочнике MQL4 я не нашёл подходящей функции с префиксом Order. Логично было бы предположить, что это значение можно получить функцией OrderGetDouble(), но в перечислении ENUM_ORDER_PROPERTY_DOUBLE я опять же не нашёл подходящего значения.

Пожалуйста, подскажите, как на самом деле можно получить размер залога для отдельно взятой открытой позиции в терминале МТ4?

 
Тут можно почитать.
Как получить программно "Процент маржи"
Как получить программно "Процент маржи"
  • 2017.05.31
  • www.mql5.com
В окне терминала "Спецификации контракта" есть пункт "Процент маржи...
 
Alexey Viktorov:
Тут можно почитать.

Спасибо, почитал. Там на 7-й странице есть скрипт для вычисления расчётного значения маржи для каждой открытой позиции. Я его немного подправил с учётом того, что у меня не CFD, а FOREX и скомпилировал вот в таком виде:

void OnStart()
{
 double size = 0, percentage = 0, orderMargin = 0, accountMargin = 0;
 long leverage = 0;
 for(int i = 0; i < OrdersTotal(); i++)
  {
   int tupe = -1;
   if(OrderSelect(i, SELECT_BY_POS) && (tupe=OrderType()) < OP_BUYLIMIT)
    {
     string symbol = OrderSymbol();
     string symbolCurencyMargin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
     double orderOpenPrice = OrderOpenPrice();
     double orderLots = OrderLots();
     double margin = MarketInfo(symbol, MODE_MARGINREQUIRED);
     double ask = MarketInfo(symbol, MODE_ASK);
     double bid = MarketInfo(symbol, MODE_BID);
     double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;
      size = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
      leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
      percentage = NormalizeDouble(margin/(size*price/100)*leverage, 0);
      //orderMargin = (size*orderOpenPrice*percentage/100)/leverage;
      orderMargin = (orderLots*size*orderOpenPrice)/leverage;
      accountMargin += orderMargin;
      Print(symbolCurencyMargin, " ******** Маржа ", symbol, " = ", orderMargin);
    }
  }
 Print(AccountInfoString(ACCOUNT_CURRENCY), " ******** AccountMargin = ", DoubleToString(accountMargin, 2));
}

В подавляющем большинстве случаев значение итоговой маржи, рассчитанное данным скриптом, совпадает с фактическим. Но, увы, не в моём случае. Проблема в том, что в формуле расчёта маржи отдельно взятого ордера используется значение кредитного плеча, действующего в данный момент.

Но в регламенте некоторых брокеров (не будем показывать пальцем) прописано что для позиций, открываемых при определённых условиях (в пятницу вечером, методом усреднения и т.п.), устанавливается особое кредитное плечо, как правило в несколько раз ниже, чем в целом для счёта. Это как раз мой случай. Но чтобы правильно составить претензию и избежать повторения подобной ситуации в будущем, мне нужно разобраться, какие позиции были открыты с нормальным кредитным плечом, а какие - с повышенным.

В техподдержке брокера открыто говорят о том, что повышенное кредитное плечо устанавливается не в целом для счёта, а для конкретных ордеров и происходит это после открытия позиции. Таким образом, запрос AccountFreeMarginChek использовать бесполезно. 

Собственно, отсюда и возникает вопрос: Есть ли какой-то способ достоверно узнать, какой размер залога фактически используется для каждой отдельно взятой позиции в терминале в том случае, если известно, что брокер может устанавливать для каждой позиции свой размер кредитного плеча?

 
Janis Ozols:

Но в регламенте некоторых брокеров (не будем показывать пальцем) прописано что для позиций, открываемых при определённых условиях (в пятницу вечером, методом усреднения и т.п.), устанавливается особое кредитное плечо, как правило в несколько раз ниже, чем в целом для счёта. Это как раз мой случай. Но чтобы правильно составить претензию и избежать повторения подобной ситуации в будущем, мне нужно разобраться, какие позиции были открыты с нормальным кредитным плечом, а какие - с повышенным.

1) Брокер всегда прав.
2) Если брокер неправ, читай правило №1.

 
Janis Ozols:

Спасибо, почитал. Там на 7-й странице есть скрипт для вычисления расчётного значения маржи для каждой открытой позиции. Я его немного подправил с учётом того, что у меня не CFD, а FOREX и скомпилировал вот в таком виде:

В подавляющем большинстве случаев значение итоговой маржи, рассчитанное данным скриптом, совпадает с фактическим. Но, увы, не в моём случае. Проблема в том, что в формуле расчёта маржи отдельно взятого ордера используется значение кредитного плеча, действующего в данный момент.

Но в регламенте некоторых брокеров (не будем показывать пальцем) прописано что для позиций, открываемых при определённых условиях (в пятницу вечером, методом усреднения и т.п.), устанавливается особое кредитное плечо, как правило в несколько раз ниже, чем в целом для счёта. Это как раз мой случай. Но чтобы правильно составить претензию и избежать повторения подобной ситуации в будущем, мне нужно разобраться, какие позиции были открыты с нормальным кредитным плечом, а какие - с повышенным.

В техподдержке брокера открыто говорят о том, что повышенное кредитное плечо устанавливается не в целом для счёта, а для конкретных ордеров и происходит это после открытия позиции. Таким образом, запрос AccountFreeMarginChek использовать бесполезно. 

Собственно, отсюда и возникает вопрос: Есть ли какой-то способ достоверно узнать, какой размер залога фактически используется для каждой отдельно взятой позиции в терминале в том случае, если известно, что брокер может устанавливать для каждой позиции свой размер кредитного плеча?

Не тратьте время на бесполезные переписки. Это прописано в регламенте и спорить всё равно, что бороться с ветряными мельницами.

Тут дело не в символе, в во времени открытия. У многих это за 15 минут до закрытия на выходные. И через 15 минут в понедельник плечо возвращается в нормальное значение.

 
Alexey Viktorov:

Не тратьте время на бесполезные переписки. Это прописано в регламенте и спорить всё равно, что бороться с ветряными мельницами.

Претензию я хочу составить главным образом для того, чтобы получить разъяснения касательно правил применения повышенного кредитного плеча. В регламенте это прописано не очень чётко.

Главное же, что я хочу понять, это как избежать повторения сложившейся ситуации в будущем. Конкретно в регламенте моего брокера искомый пункт содержит расплывчатую формулировку "компания оставляет за собой право". То есть они могут применить повышенные маржинальные требования к конкретному ордеру, а могут и не применить. Поэтому мне очень важно разобраться, каким образом можно выявить в терминале позиции, к которым было применено повышенное кредитное плечо (отличное от того, что выдаёт AccountLeverage). Например для того, чтобы оперативно закрыть такие позиции, информировать трейдера и приостановить торговлю.

Наверняка существует какой-то способ запросить у терминала размер залога для отдельно взятой позиции. Просто я пока его не знаю, а найти в документации не могу.

 
Janis Ozols:

Претензию я хочу составить главным образом для того, чтобы получить разъяснения касательно правил применения повышенного кредитного плеча. В регламенте это прописано не очень чётко.

Главное же, что я хочу понять, это как избежать повторения сложившейся ситуации в будущем. Конкретно в регламенте моего брокера искомый пункт содержит расплывчатую формулировку "компания оставляет за собой право". То есть они могут применить повышенные маржинальные требования к конкретному ордеру, а могут и не применить. Поэтому мне очень важно разобраться, каким образом можно выявить в терминале позиции, к которым было применено повышенное кредитное плечо (отличное от того, что выдаёт AccountLeverage). Например для того, чтобы оперативно закрыть такие позиции, информировать трейдера и приостановить торговлю.

Наверняка существует какой-то способ запросить у терминала размер залога для отдельно взятой позиции. Просто я пока его не знаю, а найти в документации не могу.

Я не знаю как у вашего брокера, а есть такие случаи когда всё было нормально, закрываем позицию и получаем увеличенную маржу. Никак это отследить нельзя. И никто не даст никаких разъяснений. Выход один: Не торговать в то время когда могут увеличить маржу. Вероятней всего это регулируется процентом маржи, а не плечом.

 

Посчитайте маржу и плечо самостоятельно, в момент открытия позиции по формулам из открытых источников.

Запишите плечо в комментарий или в магик, либо вообще - запишите сразу маржу с поправкой на плечо

И будет что вспомнить

 
Alexey Viktorov:

Я не знаю как у вашего брокера, а есть такие случаи когда всё было нормально, закрываем позицию и получаем увеличенную маржу. 

У моего брокера это так: открываем позицию и получаем увеличенную маржу. Причём в каких-то случаях получаем, а в каких-то нет ("компания оставляет за собой право..."). 


Alexey Viktorov:

Выход один: Не торговать в то время когда могут увеличить маржу. Вероятней всего это регулируется процентом маржи, а не плечом.

В моём случае, это, увы, не поможет. Маржу могут увеличить в любое время. И регулируется это именно плечом. Во всяком случае в регламенте говорится именно о плече. Я бы очень хотел избежать в данной теме обсуждения торговых условий конкретного брокера. На самом деле меня интересует, как можно получить у терминала информацию о величине залога для отдельно взятой позиции.  

 
Renat Akhtyamov:

Посчитайте маржу и плечо самостоятельно, в момент открытия позиции по формулам из открытых источников.

Запишите плечо в комментарий или в магик, либо вообще - запишите сразу маржу с поправкой на плечо

И будет что вспомнить

Я пробовал это сделать. Но проблема в том, что маржа увеличивается после открытия позиции. Иными словами, перед открытием позиции я получаю расчётное значение маржи для неё. И сразу после успешного вызова OrderSend запрашиваю у терминала величину AccountMargin. И она полностью соответствует моим ожиданиям. Но через некоторое время это величина резко увеличивается! И значение AccountMargin оказывается в десятки раз больше, чем сумма маржи каждого открытого ордера, полученная сразу после его открытия. 

Мой вопрос можно свести к тому, каким образом в каждый момент времени можно получить от терминала фактическое значение маржи для конкретного ордера

Для счёта в целом это AccountMargin() или AccountInfoDouble(ACCOUNT_MARGIN). То есть имеется целых два способа получить это значение. Наверняка существует хотя бы один способ получить величину маржи для ордера. Просто я о нём пока не знаю, поэтому и спрашиваю.

 
Janis Ozols:

Я пробовал это сделать. Но проблема в том, что маржа увеличивается после открытия позиции. Иными словами, перед открытием позиции я получаю расчётное значение маржи для неё. И сразу после успешного вызова OrderSend запрашиваю у терминала величину AccountMargin. И она полностью соответствует моим ожиданиям. Но через некоторое время это величина резко увеличивается! И значение AccountMargin оказывается в десятки раз больше, чем сумма маржи каждого открытого ордера, полученная сразу после его открытия. 

Мой вопрос можно свести к тому, каким образом в каждый момент времени можно получить от терминала фактическое значение маржи для конкретного ордера

Для счёта в целом это AccountMargin() или AccountInfoDouble(ACCOUNT_MARGIN). То есть имеется целых два способа получить это значение. Наверняка существует хотя бы один способ получить величину маржи для ордера. Просто я о нём пока не знаю, поэтому и спрашиваю.

не надо запрашивать

считаем по формулам

и плечо тоже по формулам

терминал не отслеживает текущее плечо, а выдает такое, которое было при загрузке терминала

поэтому и запрашиваемая функцией маржа другая