账户保证金设置

对于交易机器人而言,控制被冻结的保证金金额和可用于确保新交易的金额非常重要。特别是,如果没有足够的可用资金,程序将无法执行交易。当维持未平仓的亏存头寸时,首先会收到一个追加保证金的通知,如果未及时追加保证金,经纪商会强行平仓(止损离场)。所有关联的账户特性都包含在 ENUM_ACCOUNT_INFO_DOUBLE 枚举中。

标识符

说明

ACCOUNT_MARGIN

账户中以存款货币表示的当前预留保证金

ACCOUNT_MARGIN_FREE

账户中以存款货币表示的当前可用保证金,可用于开立头寸

ACCOUNT_MARGIN_LEVEL

账户的保证金水平,以百分比表示(净值/保证金*100)

ACCOUNT_MARGIN_SO_CALL

要求补充账户的最低保证金水平(追加保证金通知)

ACCOUNT_MARGIN_SO_SO

亏损最多的头寸被强制平仓(止损离场)的最低保证金水平

ACCOUNT_MARGIN_INITIAL

账户上预留的资金,用于为所有挂单提供保证金

ACCOUNT_MARGIN_MAINTENANCE

账户上预留的资金,用于为所有未平仓头寸提供最低要求的保证金

ACCOUNT_MARGIN_SO_CALL 和 ACCOUNT_MARGIN_SO_SO 以百分比或存款货币表示,具体取决于 ACCOUNT_MARGIN_SO_MODE 设置(详见下文)。该特性包含在 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 选项,应根据净值与 ACCOUNT_MARGIN 特性值的比率检查指定百分比(追加保证金通知或止损离场):

AccountInfoDouble(ACCOUNT_EQUITY) / AccountInfoDouble(ACCOUNT_MARGIN) * 100
   > AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL)

在下一节中,你将找到关于 ACCOUNT_EQUITY 特性和该账户其他财务指标的更多详细信息。

但是,ACCOUNT_MARGIN_LEVEL 特性中已经提供了以百分比表示的当前保证金水平。使用 AccountInfo.mq5 脚本很容易检查这一点,该脚本记录了所有账户特性,包括上述特性。

我们已经在 账户识别一节中运行了该脚本。当时,开立了一个头寸(1 手 USDRUB,等于 100,000 美元),财务状况如下:

  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 美元,很容易检查到账户的杠杆 ACCOUNT_LEVERAGE 确实是 100(根据 外汇保证金保证金费率 的计算公式,等于 1.0)。保证金金额不需要按当前汇率转换为账户货币,因为它与该金融工具的基础货币相同。

要在 ACCOUNT_MARGIN_LEVEL 中得到 992.12,只需将 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 特性的原因。