首页 / 交易学院 / 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) 浮点舍入可能掉到最小手数,看起来“永远最小手数”。

小结

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

常见问题

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