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

 

Заранее прошу прощения за, возможно, наивный вопрос — с MQL5 знаком не так давно. Речь пойдёт о счёте с хеджинговой системой учёта ордеров.

Обратил внимание, что при снижении показателя Margin Level ниже значения, установленного брокером как уровень Stop Out, брокеры закрывают убыточные позиции не в той последовательности, как я бы предпочёл. В этой связи хотелось бы сделать так, чтобы при снижении Margin Level до заданного мной уровня  (допустим, 100%), советник закрывал бы открытые позиции по одной, начиная с той, которая имеет самую большую маржу. Таким образом, постепенно освобождая маржу, можно, зафиксировав некоторые убытки, попытаться удержать Margin Level от падения.

Но я никак не могу разобраться, как получить величину залоговых средств (маржу) по каждой отдельно взятой позиции. Есть функция AccountInfoDouble(ACCOUNT_MARGIN), она возвращает суммарную маржу. А вот как получить маржу для каждой открытой позиции отдельно, мне непонятно. Поначалу казалось очевидным, что нужно использовать класс CPositionInfo из стандартной библиотеки и его метод InfoDouble, но в перечислении ENUM_POSITION_PROPERTY_DOUBLE про маржу ничего нет. Очевидно, что я ищу где-то не там?

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

 
E38:

Заранее прошу прощения за, возможно, наивный вопрос — с MQL5 знаком не так давно. Речь пойдёт о счёте с хеджинговой системой учёта ордеров.

Обратил внимание, что при снижении показателя Margin Level ниже значения, установленного брокером как уровень Stop Out, брокеры закрывают убыточные позиции не в той последовательности, как я бы предпочёл. В этой связи хотелось бы сделать так, чтобы при снижении Margin Level до заданного мной уровня  (допустим, 100%), советник закрывал бы открытые позиции по одной, начиная с той, которая имеет самую большую маржу. Таким образом, постепенно освобождая маржу, можно, зафиксировав некоторые убытки, попытаться удержать Margin Level от падения.

Но я никак не могу разобраться, как получить величину залоговых средств (маржу) по каждой отдельно взятой позиции. Есть функция AccountInfoDouble(ACCOUNT_MARGIN), она возвращает суммарную маржу. А вот как получить маржу для каждой открытой позиции отдельно, мне непонятно. Поначалу казалось очевидным, что нужно использовать класс CPositionInfo из стандартной библиотеки и его метод InfoDouble, но в перечислении ENUM_POSITION_PROPERTY_DOUBLE про маржу ничего нет. Очевидно, что я ищу где-то не там?

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

https://www.metatrader5.com/ru/terminal/help/trading_advanced/margin_forex

Расчет маржи: Retail Forex, Futures - Для продвинутых пользователей - Справка по MetaTrader 5
Расчет маржи: Retail Forex, Futures - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
В торговой платформе предусмотрены разные модели управления рисками, определяющие то, как осуществляется претрейд контроль. На данный момент...
 

@pribludilsa, благодарю. Формулу расчёта маржи я знаю. Её коварство в том, что в ней используется значение кредитного плеча. Как известно, некоторые брокеры (например небезызвестная компания, название которой начинается на А и заканчивается на И) меняют кредитное плечо для вновь открываемых позиций динамически, в зависимости от группы, к которой относится инструмент и объёма ранее открытых позиций по нему. При этом кредитное плечо счёта (которое можно получить через AccountInfoDouble) остаётся постоянным. Таким образом, в каждый момент времени мы можем иметь на счёте позиции, открытые с разным кредитным плечом, которое нам неизвестно.

Поэтому вопрос был не в том, как считается залог, а в том, как получить его фактическое ( не расчётное) значение для отдельно взятой открытой позиции в терминале. 

 
E38 #:

@pribludilsa, благодарю. Формулу расчёта маржи я знаю. Её коварство в том, что в ней используется значение кредитного плеча. Как известно, некоторые брокеры (например небезызвестная компания, название которой начинается на А и заканчивается на И) меняют кредитное плечо для вновь открываемых позиций динамически, в зависимости от группы, к которой относится инструмент и объёма ранее открытых позиций по нему. При этом кредитное плечо счёта (которое можно получить через AccountInfoDouble) остаётся постоянным. Таким образом, в каждый момент времени мы можем иметь на счёте позиции, открытые с разным кредитным плечом, которое нам неизвестно.

Поэтому вопрос был не в том, как считается залог, а в том, как получить его фактическое ( не расчётное) значение для отдельно взятой открытой позиции в терминале. 

Вот это не подойдёт? Перед открытием позиции узнать маржу?

https://www.mql5.com/ru/docs/trading/ordercalcmargin

Документация по MQL5: Торговые функции / OrderCalcMargin
Документация по MQL5: Торговые функции / OrderCalcMargin
  • www.mql5.com
OrderCalcMargin - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pribludilsa #:

Вот это не подойдёт? Перед открытием позиции узнать маржу?

https://www.mql5.com/ru/docs/trading/ordercalcmargin

Нет. Я пробовал — такая проверка возвращает значение маржи, рассчитанной по стандартной методике, с использованием установленного для всего счёта (а не для конкретного инструмента в конкретный момент времени) кредитного плеча.

P.S. Я изо всех сил стараюсь точно сформулировать свой вопрос, но у меня почему-то не получается. Попробую ещё раз...

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

Знаю, что в MQL4 это невозможно (прочитал ветку с аналогичным вопросом в разделе MetaTrader 4). Но вроде как МТ5 более продвинутый терминал и здесь эта очень востребованная возможность наверняка существует, верно?

 
E38 #:

Нет. Я пробовал — такая проверка возвращает значение маржи, рассчитанной по стандартной методике, с использованием установленного для всего счёта (а не для конкретного инструмента в конкретный момент времени) кредитного плеча.

P.S. Я изо всех сил стараюсь точно сформулировать свой вопрос, но у меня почему-то не получается. Попробую ещё раз...

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

Знаю, что в MQL4 это невозможно (прочитал ветку с аналогичным вопросом в разделе MetaTrader 4). Но вроде как МТ5 более продвинутый терминал и здесь эта очень востребованная возможность наверняка существует, верно?

Это как можно было читать эту тему, что ничего не понять в ней? Или читал как роман «Война и Мир»? Там есть все выкладки и пояснения что для этого нужно и как это получить.

 
Alexey Viktorov #:

Это как можно было читать эту тему, что ничего не понять в ней? Или читал как роман «Война и Мир»? Там есть все выкладки и пояснения что для этого нужно и как это получить.

Читал скорее как "Анну Каренину". Не отрываясь, от первой до последней строчки. Не теряя надежды, что вот-вот найду ответы :)

Терпению и такту автора той ветки можно только позавидовать. Он изначально неправильно назвал тему, а потом на протяжение шести страниц пытался объяснить, что ему нужно не вычислить маржу конкретной позиции, а получить её значение от терминала

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

В конце концов, когда автору удалось донести свою мысль до остальных участников обсуждения, ему сказали, что средствами MQL4 это сделать невозможно. Он описал своё решение проблемы (единственно верное, на мой взгляд), но даже после этого кто-то заявил, что вместо этого можно было просто отслеживать изменение кредитного плеча [смайлик рука/лицо].

Вы спросите, почему бы мне не использовать это решение, если я считаю его верным? Ответ прост — в той ветке речь идёт о другом языке программирования (MQL4). Есть мнение, что MQL5 намного более гибкий и богатый язык. И в нём наверняка есть возможность получить фактическое значение маржи для отдельно взятой позиции, не прибегая к танцам с бубном.

Итак, дабы не повторять ошибок автора вышеупомянутой темы в части формулировке вопросов, а попробую спросить так:

Пожалуйста, подскажите, при помощи какой функции MQL5 можно получить от терминала величину залоговых средств (маржу) по каждой отдельно взятой позиции в случае, если на счёте используется хэджинговая система учёта ордеров и в терминале имеется более одной открытой позиции?

 
Документация по MQL5: Торговые функции / OrderCalcMargin
Документация по MQL5: Торговые функции / OrderCalcMargin
  • www.mql5.com
OrderCalcMargin - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
SanAlex #:
разве это не то? https://www.mql5.com/ru/docs/trading/ordercalcmargin

Нет, не то. Эта функция вычисляет величину маржи ДО открытия позиции. Мой же вопрос заключается в том, как получить маржу для УЖЕ ОТКРЫТОЙ позиции (если их две или больше).

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

 

а лучше тут найти ответ на свой вопрос https://www.mql5.com/ru/search#!keyword=%D0%BC%D0%B0%D1%80%D0%B6%D1%83&module=mql5_module_documentation

 

Поиском я пользовался, но ответа не нашёл. Поэтому прошу помощи более опытных разработчиков MQL5.

Чисто интуитивно мне кажется, что искомое значение должно возвращаться функцией PositionGetDouble. Потому что оно определённо имеет тип double и точно является свойством позиции. Однако это не так — нужного свойства нет в перечислении ENUM_POSITION_PROPERTY_DOUBLE