Маржинальные настройки счета

Для торговых роботов важно контролировать сумму заблокированных залоговых средств и доступную сумму для обеспечения новых сделок. В частности, при нехватке свободных средств программа не сможет совершить сделку. При поддержании открытых убыточных позиций сначала возникает запрос на пополнение счета (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
   > AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL)

Про свойство ACCOUNT_EQUITY и прочие финансовые показатели счета — подробнее в следующем разделе.

Правда, текущий уровень маржи в процентах уже предоставляется готовым в свойстве ACCOUNT_MARGIN_LEVEL. Это легко проверить с помощью скрипта AccountInfo.mq5, выводящего в журнал все свойства счета, включая и вышеперечисленные.

В разделе об Идентификации счета мы уже запускали этот скрипт. В тот момент была открыта одна позиция (1 лот USDRUB, составляющий 100000 USD), и финансовые показатели были следующими:

  0 ACCOUNT_BALANCE=10000.00
  1 ACCOUNT_CREDIT=0.00
  2 ACCOUNT_PROFIT=-78.76
  3 ACCOUNT_EQUITY=9921.24
  4 ACCOUNT_MARGIN=1000.00
  5 ACCOUNT_MARGIN_FREE=8921.24
  6 ACCOUNT_MARGIN_LEVEL=992.12
  7 ACCOUNT_MARGIN_SO_CALL=50.00
  8 ACCOUNT_MARGIN_SO_SO=30.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
  1 ACCOUNT_CREDIT=0.00
  2 ACCOUNT_PROFIT=-1486.07
  3 ACCOUNT_EQUITY=8513.93
  4 ACCOUNT_MARGIN=2000.00
  5 ACCOUNT_MARGIN_FREE=6513.93
  6 ACCOUNT_MARGIN_LEVEL=425.70

Мы видим убыток в графе 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
   > AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL)

Впоследствии мы научимся получать величину 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.