首页 / 交易学院 / 小布知识库 / EA 资金管理:保证金与货币对分类算法
EA 资金管理:保证金与货币对分类算法
💰

EA 资金管理:保证金与货币对分类算法

从账户信息到三类货币对保证金算法,把风险控制写进 EA

EA 开发实战 难度 · 进阶 2026-07-15 10 分钟阅读
#EA#资金管理#保证金#货币对#风险控制

EA 开仓前必须知道账户能开多少、占用多少保证金、何时会暴仓。本文给出一套用账户/品种信息函数实现资金管理的完整方案,核心是分类货币对并算对保证金。

一、资金管理函数要解决什么

开仓前先算清占用与可用,避免手数过大瞬间暴仓。文章把这些逻辑封装成可复用的 EA 函数框架。

二、账户与品种信息从哪来

三、货币对的三种分类

四、保证金计算逻辑

反向盘 margin = lots × 合约 ÷ 杠杆 × 汇率;直接盘 margin = lots × 合约 ÷ 杠杆;交叉盘用 GetSymbolByCurrencies 找计算货币对再换算,最后 ÷ 杠杆。买入用 Ask、卖出用 Bid。

⚠ 交叉盘最易算错
交叉盘务必遍历市场报价窗口用 GetSymbolByCurrencies 定位计算货币对,并区分买入/卖出取价,否则保证金偏低会高估风险。

五、辅助函数与风险控制

✦ 封装成一句话
把保证金计算封装成 GetMarginForOpening(lot, symbol, direction),任何开仓前先调用,能挡掉大部分手数过大导致瞬间暴仓的坑。

六、跨币种保证金怎么换算

保证金计算最易错在「充抵货币」与「品种报价货币」不同。比如账户用美元、交易 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);
}
✦ 风险百分比法
别写死零点一手。按「每笔亏 X 百分比净值」反推手数,账户缩水时自动减仓,是活下来的关键。

八、保证金预警与强平护栏

EA 下单前必须算「下了这单后占用保证金占净值多少」,超阈值(如百分之八十)就拒绝开仓。还要监听权益回撤,单日回撤超 X 百分比触发熔断暂停交易。这些护栏比信号更重要——信号决定赚多少,护栏决定你还在不在场上。

用 AccountInfoDouble 取净值、保证金、可用预付款,结合 SymbolInfoDouble 的保证金要求实时估算。把护栏写成独立模块,任何 EA 都能挂,比在每个策略里重复写一遍稳得多。 模块对外只暴露 CheckBeforeTrade(volume) 与 OnEquityDrop(percent) 两个接口,策略层调用即可,既不重复造轮子,也能在所有 EA 间统一风险口径。

九、小结

✦ 小结
资金管理的本质是「算清保证金、按风险定手数、设护栏」三段。跨币种换算别漏汇率,手数用风险百分比反推,强平前先熔断。信号决定上限,资金管理决定你能活到第几集。

常见问题

所有 AccountInfoDouble 返回的货币值都以入金货币计;跨货币对换算时,用计算货币对把保证金货币折算成入金货币。
看保证金货币和报价货币里有没有账户货币:有报价货币的是反向盘,有保证金货币的是直接盘,都没有的是交叉盘。
开仓瞬间买入按卖价(Ask)成交、卖出按买价(Bid)成交,用错了价格保证金就偏低,风险被低估。
保证金 = 名义价值 ÷ 杠杆;杠杆越高占用越少,但爆仓也越快,资金管理函数要配合止损距离一起算手数。
account_info 打印账户信息、symbol_info 打印品种属性、symbolinfo_advanced 实时显示 1 手所需预付款,可直接复用当脚手架。