EA 资金管理:保证金与货币对分类算法
从账户信息到三类货币对保证金算法,把风险控制写进 EA
EA 开仓前必须知道账户能开多少、占用多少保证金、何时会暴仓。本文给出一套用账户/品种信息函数实现资金管理的完整方案,核心是分类货币对并算对保证金。
一、资金管理函数要解决什么
开仓前先算清占用与可用,避免手数过大瞬间暴仓。文章把这些逻辑封装成可复用的 EA 函数框架。
二、账户与品种信息从哪来
- AccountInfoDouble:余额/净值/已用保证金/浮动盈亏/可用资金/止损水平;
- AccountInfoString:入金货币;
- AccountInfoInteger:杠杆/账户类型/交易权限;
- SymbolInfo*:合约大小与基础/报价/保证金货币。
三、货币对的三种分类
- 反向盘(如 EURUSD):报价货币 = 账户货币;
- 直接盘(如 USDCHF):保证金货币 = 账户货币;
- 交叉盘(如 CADCHF):报价与保证金都不含账户货币,需第三货币对换算。
四、保证金计算逻辑
反向盘 margin = lots × 合约 ÷ 杠杆 × 汇率;直接盘 margin = lots × 合约 ÷ 杠杆;交叉盘用 GetSymbolByCurrencies 找计算货币对再换算,最后 ÷ 杠杆。买入用 Ask、卖出用 Bid。
五、辅助函数与风险控制
- GetSymbolByCurrencies 遍历 SymbolsTotal + SymbolName 匹配保证金/利润货币;
- 检测 ACCOUNT_TRADE_ALLOWED 与止损模式,避免在禁交易或实盘误开仓。
六、跨币种保证金怎么换算
保证金计算最易错在「充抵货币」与「品种报价货币」不同。比如账户用美元、交易 XAUUSD(报价美元)还好;但若交易 EURJPY,保证金要先按品种合约价值算成报价货币,再用汇率折回账户充抵货币。漏掉这步换算,算出的可开手数会错得离谱。
MQL5 提供 SymbolInfoDouble 的 SYMBOL_MARGIN 系列直接取品种保证金要求,比自己手算稳。但理解底层换算逻辑仍重要:当券商用「按杠杆算」还是「按保证金率算」模式不同时,结果会差很多,要核对账户类型。
七、按风险百分比确定手数
优质资金管理不写死手数,而是「每笔最多亏账户的百分之 X」。公式:手数等于(账户净值乘风险百分比)除以(止损点数乘每点价值)。这样账户涨手数自动加大、回撤自动减小,复利又控险。
double RiskLot(double balance, double riskPct, double slPoints, double pointValue)
{
double riskAmt = balance * riskPct;
if(slPoints <= 0 || pointValue <= 0) return 0.0;
return riskAmt / (slPoints * pointValue);
}
八、保证金预警与强平护栏
EA 下单前必须算「下了这单后占用保证金占净值多少」,超阈值(如百分之八十)就拒绝开仓。还要监听权益回撤,单日回撤超 X 百分比触发熔断暂停交易。这些护栏比信号更重要——信号决定赚多少,护栏决定你还在不在场上。
用 AccountInfoDouble 取净值、保证金、可用预付款,结合 SymbolInfoDouble 的保证金要求实时估算。把护栏写成独立模块,任何 EA 都能挂,比在每个策略里重复写一遍稳得多。 模块对外只暴露 CheckBeforeTrade(volume) 与 OnEquityDrop(percent) 两个接口,策略层调用即可,既不重复造轮子,也能在所有 EA 间统一风险口径。