首页 / 交易学院 / 小布知识库 / MQL5 向导实战:编写风险与资金管理模块
MQL5 向导实战:编写风险与资金管理模块
💰

MQL5 向导实战:编写风险与资金管理模块

EA 开发实战 难度 · 进阶 2012 11 分钟阅读
资金管理CExpertMoney风险

一、资金模块的定位

CExpertMoney 只回答“该下多少”,最终由 CExpert 把建议值夹取到经纪商允许范围后下单。把仓位计算独立成模块,是做 A/B 测试不同风险曲线的基础。

二、核心虚方法

资金模块暴露 Percent(设定风险百分比)与一组返回手数的 Check* 方法。引擎把信号方向交给它,它回报建议成交量。

class CExpertMoney : public CObject
{
public:
   virtual bool   Init(...) { return false; }
   virtual void   Percent(double p) { m_percent = p; }
   virtual double CheckOpenLong(void)  { return 0.0; }
   virtual double CheckOpenShort(void) { return 0.0; }
   virtual double CheckReverse(void)   { return 0.0; }
   virtual double CheckClose(...)      { return 0.0; }
};

三、按百分比风险计算手数

经典“固定风险百分比”法:用账户权益 × 风险百分比,除以每点价值与止损点数,得到手数。它随账户增长自适应,长期更稳健。

class CSampleMoney : public CExpertMoney
{
   double Lots(void)
   {
      double risk = AccountInfoDouble(ACCOUNT_BALANCE) * m_percent / 100.0;
      double tick = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
      double slpts = m_sl * _Point;
      return MathMax(SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN),
                     risk / (tick * slpts / _Point));
   }
};

四、与信号模块协作

信号模块只给方向(bool),资金模块给手数(double),二者通过 CExpert 组合。一个激进信号可以配保守资金,也可以配激进资金,互不影响。

五、常见坑

⚠ 手数三连坑
1) 手数必须夹在 SYMBOL_VOLUME_MIN/MAX 与 STEP 之间;2) 跨品种 tick value 不同,不能写死;3) 浮点舍入可能掉到最小手数,看起来“永远最小手数”。

六、模块如何定手数

向导的资金管理模块支持几种手数模式:固定手数(每单相同)、固定风险百分比(按止损距离反推)、净值目标(随账户增长线性加仓)。选哪种取决于你想让风险随账户怎么变。

固定百分比最稳:账户缩水自动减仓、增长自动加仓,复利且控险。模块内部就是那句「手数等于风险金额除以(止损点数乘每点价值)」,理解它你就掌握了资金管理的核心。

七、与风险护栏联动

资金管理不能只管「买多少」,还要管「能不能买」。模块应配护栏:账户回撤超阈值、或当前占用保证金占比过高时,拒绝开仓。护栏和手数算法是同一模块的两面。

double lot = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPct
            / (StopPoints * PointValue);
if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) < NeedMargin(lot))
   lot = 0;   // 保证金不足,不开
✦ 手数+护栏一体
资金管理模块 = 算手数 + 设护栏。只算手数不把关,遇到连亏照样爆;两者结合才算完整。

八、实战配置示例

一个稳健配置:风险百分比 1%、最大单品种保证金占比 30%、单日回撤 10% 熔断。这三数写进模块参数,任何信号模块挂上来都受同一套纪律约束,策略再花哨也越不过风控。

调参时先在小历史段看「最大回撤是否可接受」,再上实盘。资金管理参数比信号参数更决定生死,值得花最多时间校准。

九、参数校准的实操步骤

校准资金管理从「最小可接受回撤」倒推:先定单日最多亏多少,再反推每单风险百分比与止损距离。用三年历史跑一遍,看最大回撤是否落在接受区,超出就调小百分比。

调参是迭代不是一次到位:先在样本内找合理区间,再样本外验证,最后模拟盘跑两周确认手感。资金管理参数值得花最多时间,因为它直接决定你还在不在场上。

一个常被忽视的点:百分比要基于「净值」而非「余额」,浮盈回吐时净值下降、手数自动减小,避免在高点加满仓后回撤被放大。

十、常见资金管理反模式

反模式一:写死手数,账户回撤时风险占比飙升,小回撤变重伤。反模式二:只看余额不算浮亏,满仓后回吐才发现问题。反模式三:没有总仓位上限,连开多单把保证金打满,一个反向跳空就爆。

这些反模式在回测里看不出问题,因为回测不会「跳空爆仓」,但实盘是常态。资金管理的价值恰恰在「为最坏情况留余地」,而不是让曲线在好日子里更好看。把护栏写进模块,是对冲人性乐观的必需品。

上线前务必用历史回测验证资金模块:把参数接入复盘,观察最大回撤与仓位曲线是否落在你的风险承受区间内。参数一旦定下就不要随行情波动临时改——绝大多数乱改参数的冲动来自亏损后的焦虑而非理性分析。把纪律写进模块、用代码替你执行,比靠人盯盘可靠得多。建议把风险百分比、最大保证金占比、单日熔断三个数做成只读配置,任何信号模块都无法越过,从架构上杜绝人为失控。

十一、小结

✦ 资金管理优先于信号
历史上爆仓的多是仓位失控而非信号错误。把资金管理做成独立、可切换的模块,比打磨入场点更能决定生死。

常见问题

不是,它返回建议值,CExpert 再夹取到经纪商允许范围。
百分比风险法随账户增长自适应,更适合长期;固定手数简单但会随回撤失控。
多半是 Lots 计算里 tick value 或 sl 点数算错,掉到 VOLUME_MIN 了。