Маржинальные настройки счета
Для торговых роботов важно контролировать сумму заблокированных залоговых средств и доступную сумму для обеспечения новых сделок. В частности, при нехватке свободных средств программа не сможет совершить сделку. При поддержании открытых убыточных позиций сначала возникает запрос на пополнение счета (Margin Call), а в случае его невыполнения — происходит их принудительное закрытие брокером (Stop Out). Все связанные с этим свойства счета включены в перечисление ENUM_ACCOUNT_INFO_DOUBLE.
Идентификатор |
Описание |
---|---|
ACCOUNT_MARGIN |
Текущий размер зарезервированных залоговых средств на счете в валюте депозита |
ACCOUNT_MARGIN_FREE |
Текущий размер свободных средств на счете в валюте депозита, доступных для открытия позиции |
ACCOUNT_MARGIN_LEVEL |
Текущий уровень залоговых средств на счете в процентах (средства/маржа*100) |
ACCOUNT_MARGIN_SO_CALL |
Минимальный уровень залоговых средств, при котором требуется пополнение счета (Margin Call) |
ACCOUNT_MARGIN_SO_SO |
Минимальный уровень залоговых средств, при котором происходит принудительное закрытие самой убыточной позиции (Stop Out) |
ACCOUNT_MARGIN_INITIAL |
Размер средств, зарезервированных на счёте, для обеспечения гарантийной суммы по всем отложенным ордерам |
ACCOUNT_MARGIN_MAINTENANCE |
Размер средств, зарезервированных на счёте, для обеспечения минимальной суммы по всем открытым позициям |
Пара свойств — ACCOUNT_MARGIN_SO_CALL и ACCOUNT_MARGIN_SO_SO — выражается в процентах или валюте депозита в зависимости от установленного режима ACCOUNT_MARGIN_SO_MODE (см. далее). Это свойство со способом измерения пороговых значений маржи для запроса на пополнение (Margin Call) или блокировку счета (Stop Out) входит в перечисление ENUM_ACCOUNT_INFO_INTEGER. Кроме того, там же указывается и общее кредитное плечо (используемое для расчета маржи инструментов некоторых типов).
Идентификатор |
Описание |
---|---|
ACCOUNT_LEVERAGE |
Размер предоставленного плеча |
ACCOUNT_MARGIN_SO_MODE |
Режим задания минимально допустимого уровня залоговых средств из перечисления ENUM_ACCOUNT_STOPOUT_MODE |
А вот и элементы перечисления ENUM_ACCOUNT_STOPOUT_MODE.
Идентификатор |
Описание |
---|---|
ACCOUNT_STOPOUT_MODE_PERCENT |
Уровень задается в процентах |
ACCOUNT_STOPOUT_MODE_MONEY |
Уровень задается в валюте счета |
Например, для варианта ACCOUNT_STOPOUT_MODE_PERCENT заданный процент (Margin Call или Stop Out) следует проверять относительно отношения собственных средств (эквити) к значению свойства ACCOUNT_MARGIN:
AccountInfoDouble(ACCOUNT_EQUITY) / AccountInfoDouble(ACCOUNT_MARGIN) * 100
|
Про свойство ACCOUNT_EQUITY и прочие финансовые показатели счета — подробнее в следующем разделе.
Правда, текущий уровень маржи в процентах уже предоставляется готовым в свойстве ACCOUNT_MARGIN_LEVEL. Это легко проверить с помощью скрипта AccountInfo.mq5, выводящего в журнал все свойства счета, включая и вышеперечисленные.
В разделе об Идентификации счета мы уже запускали этот скрипт. В тот момент была открыта одна позиция (1 лот USDRUB, составляющий 100000 USD), и финансовые показатели были следующими:
0 ACCOUNT_BALANCE=10000.00
|
По марже 1000.00 USD легко проверить, что кредитное плечо счета ACCOUNT_LEVERAGE действительно равно 100 (согласно формуле расчета маржи для Forex и коэффициенту маржи, равному 1.0). Сумма маржи не требует пересчета по текущему курсу в валюту счета, поскольку она совпадает с базовой валютой инструмента.
Чтобы получить 992.12 в ACCOUNT_MARGIN_LEVEL достаточно разделить 9921.24 на 1000.00 и умножить на 100%.
Затем была открыта еще одна позиции 1 лот, а котировки пошли в неблагоприятную сторону, в результате чего ситуация изменилась:
0 ACCOUNT_BALANCE=10000.00
|
Мы видим убыток в графе ACCOUNT_PROFIT и соответствующее уменьшение собственных средств ACCOUNT_EQUITY. Залог ACCOUNT_MARGIN увеличился пропорционально с 1000 до 2000, свободная маржа и уровень маржи уменьшились (но еще далеки от предельных 50% и 30%). Опять же уровень 425.70 получается как результат выражения 8513.93 / 2000.00 * 100.
Более практичным является расчет по данной формуле будущего уровня маржи перед предполагаемым открытием новой позиции. В этом случае необходимо увеличить размер существующего залога на дополнительную величину залога X. Кроме того, если сделка входа в рынок предполагает моментальное списание комиссии C, то её следовало бы, строго говоря, также учесть (правда, обычно она имеет размер существенно меньше залога и ею можно пренебречь, плюс ко всему API не предоставляет способа узнать комиссию заранее, до совершения сделки: оценить её можно только по комиссиям уже совершенных сделок в истории торгов).
(AccountInfoDouble(ACCOUNT_EQUITY) - C) / (AccountInfoDouble(ACCOUNT_MARGIN) + X) * 100
|
Впоследствии мы научимся получать величину X с помощью функции OrderCalcMargin, но дополнительно к ней могут потребоваться корректировки согласно правилам, озвученным в разделе Маржинальные требования, в частности, с учетом возможного перекрытия позиций, дисконта и корректировки маржи.
Для варианта задания предела маржи в деньгах (ACCOUNT_STOPOUT_MODE_MONEY) проверка достаточности средств должна быть другой.
AccountInfoDouble(ACCOUNT_EQUITY) > AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL) |
Здесь комиссия опущена. Следует обратить внимание, что залог X под готовящуюся к открытию новую позицию теперь никак не влияет на оценку будущей маржи.
Однако, в любом случае желательно не нагружать депозит настолько, чтобы неравенства выполнялись едва-едва. Значения ACCOUNT_MARGIN_SO_CALL и ACCOUNT_MARGIN_SO_SO довольно близки, и хотя маржа на уровне ACCOUNT_MARGIN_SO_CALL — это всего лишь предупреждение трейдеру, от него легко попасть в ситуацию принудительного закрытия позиций. Именно поэтому в формулах использовано свойство ACCOUNT_MARGIN_SO_CALL.