MQL5 向导实战:编写风险与资金管理模块
一、资金模块的定位
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 组合。一个激进信号可以配保守资金,也可以配激进资金,互不影响。
五、常见坑
六、模块如何定手数
向导的资金管理模块支持几种手数模式:固定手数(每单相同)、固定风险百分比(按止损距离反推)、净值目标(随账户增长线性加仓)。选哪种取决于你想让风险随账户怎么变。
固定百分比最稳:账户缩水自动减仓、增长自动加仓,复利且控险。模块内部就是那句「手数等于风险金额除以(止损点数乘每点价值)」,理解它你就掌握了资金管理的核心。
七、与风险护栏联动
资金管理不能只管「买多少」,还要管「能不能买」。模块应配护栏:账户回撤超阈值、或当前占用保证金占比过高时,拒绝开仓。护栏和手数算法是同一模块的两面。
double lot = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPct
/ (StopPoints * PointValue);
if(AccountInfoDouble(ACCOUNT_MARGIN_FREE) < NeedMargin(lot))
lot = 0; // 保证金不足,不开
八、实战配置示例
一个稳健配置:风险百分比 1%、最大单品种保证金占比 30%、单日回撤 10% 熔断。这三数写进模块参数,任何信号模块挂上来都受同一套纪律约束,策略再花哨也越不过风控。
调参时先在小历史段看「最大回撤是否可接受」,再上实盘。资金管理参数比信号参数更决定生死,值得花最多时间校准。
九、参数校准的实操步骤
校准资金管理从「最小可接受回撤」倒推:先定单日最多亏多少,再反推每单风险百分比与止损距离。用三年历史跑一遍,看最大回撤是否落在接受区,超出就调小百分比。
调参是迭代不是一次到位:先在样本内找合理区间,再样本外验证,最后模拟盘跑两周确认手感。资金管理参数值得花最多时间,因为它直接决定你还在不在场上。
一个常被忽视的点:百分比要基于「净值」而非「余额」,浮盈回吐时净值下降、手数自动减小,避免在高点加满仓后回撤被放大。
十、常见资金管理反模式
反模式一:写死手数,账户回撤时风险占比飙升,小回撤变重伤。反模式二:只看余额不算浮亏,满仓后回吐才发现问题。反模式三:没有总仓位上限,连开多单把保证金打满,一个反向跳空就爆。
这些反模式在回测里看不出问题,因为回测不会「跳空爆仓」,但实盘是常态。资金管理的价值恰恰在「为最坏情况留余地」,而不是让曲线在好日子里更好看。把护栏写进模块,是对冲人性乐观的必需品。
上线前务必用历史回测验证资金模块:把参数接入复盘,观察最大回撤与仓位曲线是否落在你的风险承受区间内。参数一旦定下就不要随行情波动临时改——绝大多数乱改参数的冲动来自亏损后的焦虑而非理性分析。把纪律写进模块、用代码替你执行,比靠人盯盘可靠得多。建议把风险百分比、最大保证金占比、单日熔断三个数做成只读配置,任何信号模块都无法越过,从架构上杜绝人为失控。