💰
EA 资金管理:保证金与货币对分类算法
从账户信息到三类货币对保证金算法,把风险控制写进 EA
#EA#资金管理#保证金#货币对#风险控制
EA 开仓前必须知道账户能开多少、占用多少保证金、何时会暴仓。本文给出一套用账户/品种信息函数实现资金管理的完整方案,核心是分类货币对并算对保证金。
一、资金管理函数要解决什么
开仓前先算清占用与可用,避免手数过大瞬间暴仓。文章把这些逻辑封装成可复用的 EA 函数框架。
二、账户与品种信息从哪来
- AccountInfoDouble:余额/净值/已用保证金/浮动盈亏/可用资金/止损水平;
- AccountInfoString:入金货币;
- AccountInfoInteger:杠杆/账户类型/交易权限;
- SymbolInfo*:合约大小与基础/报价/保证金货币。
三、货币对的三种分类
- 反向盘(如 EURUSD):报价货币 = 账户货币;
- 直接盘(如 USDCHF):保证金货币 = 账户货币;
- 交叉盘(如 CADCHF):报价与保证金都不含账户货币,需第三货币对换算。
四、保证金计算逻辑
反向盘 margin = lots × 合约 ÷ 杠杆 × 汇率;直接盘 margin = lots × 合约 ÷ 杠杆;交叉盘用 GetSymbolByCurrencies 找计算货币对再换算,最后 ÷ 杠杆。买入用 Ask、卖出用 Bid。
⚠ 交叉盘最易算错
交叉盘务必遍历市场报价窗口用 GetSymbolByCurrencies 定位计算货币对,并区分买入/卖出取价,否则保证金偏低会高估风险。
五、辅助函数与风险控制
- GetSymbolByCurrencies 遍历 SymbolsTotal + SymbolName 匹配保证金/利润货币;
- 检测 ACCOUNT_TRADE_ALLOWED 与止损模式,避免在禁交易或实盘误开仓。
✦ 封装成一句话
把保证金计算封装成 GetMarginForOpening(lot, symbol, direction),任何开仓前先调用,能挡掉大部分手数过大导致瞬间暴仓的坑。
常见问题
所有 AccountInfoDouble 返回的货币值都以入金货币计;跨货币对换算时,用计算货币对把保证金货币折算成入金货币。
看保证金货币和报价货币里有没有账户货币:有报价货币的是反向盘,有保证金货币的是直接盘,都没有的是交叉盘。
开仓瞬间买入按卖价(Ask)成交、卖出按买价(Bid)成交,用错了价格保证金就偏低,风险被低估。
保证金 = 名义价值 ÷ 杠杆;杠杆越高占用越少,但爆仓也越快,资金管理函数要配合止损距离一起算手数。
account_info 打印账户信息、symbol_info 打印品种属性、symbolinfo_advanced 实时显示 1 手所需预付款,可直接复用当脚手架。