💰
MQL5 向导实战:编写风险与资金管理模块
资金管理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 了。