MetaTrader 5 策略测试原理:三种回测模式详解
一、为什么需要策略测试
自动化交易的初衷是机器人 7×24 不知疲倦地工作。但上线前必须确认两件事:EA 确实按规则执行了交易操作;它在历史上被证明可以盈利。Strategy Tester 就是回答这两个问题的工具。
二、三种价格生成模式
EA 在每次价格变动(NewTick)事件下运行。策略测试器用三种模式生成价格序列来驱动回测,细节程度递减。
- Every tick(每一价格变动):最详细,模拟真实逐笔跳动,含点差与滑点影响。
- 1 Minute OHLC(一分钟 OHLC):每分钟只用一根柱的 OHLC 四个价,忽略分钟内细节。
- Open prices only(仅开盘价):最粗,只在每根柱开盘时计算,最快但最易美化突破类策略。
三、MqlRates 与历史
回测与指标都围绕 MqlRates 结构展开——它封装了每根柱的时间、开高低收与成交量。用 CopyRates 把历史拉进数组。
struct MqlRates
{
datetime time; // 柱开盘时间
double open;
double high;
double low;
double close;
long tick_volume;
};
MqlRates rates[];
CopyRates(_Symbol, PERIOD_M15, 0, 100, rates);
四、OnTester 与优化
在 EA 中重写 OnTester 返回自定义适应度,供优化器(含遗传/前向优化)排序候选参数。常用 STAT_PROFIT 或风险调整指标。
double OnTester(void)
{
// 自定义适应度,用于遗传/前向优化
return TesterStatistics(STAT_PROFIT);
}
五、模式差异与陷阱
六、tick 模拟模型怎么选
MT5 测试器有三种建模精度:每 tick(用真实 tick 或插值逐 tick 模拟,最准最慢)、控制点(每根 K 线几个关键价)、仅开盘价(最快最糙)。精度越高结果越可信,但耗时爆炸。
实务:初步筛选用控制点快速跑,最终验证用每 tick。只开盘价模型会漏掉日内波动导致的止损触发,过度乐观,不适合验证止损逻辑。
七、过拟合与样本外
回测再漂亮也可能是过拟合。纪律是:优化用一段、验证用另一段(样本外),再 Walk-Forward 滚动验证参数可迁移。样本内漂亮、样本外崩,就是典型过拟合,这组参数不能上实盘。
// 伪代码:样本外验证 params = Optimize(HistoryA); // 在 A 段优化 scoreB = Test(params, HistoryB); // 在没参与的 B 段验证 if(scoreB < threshold) Reject(params);
八、代理与云优化
本地多核不够时可用代理(同机多终端)或 MQL5 云网络(众包算力)加速搜索。云网络只是更快搜索参数空间,不改变策略质量——烂策略再快优化也是烂。
用云前先本地跑通逻辑、定好评分函数,再上云做大规模搜索,既省钱又避免被云网络的「速度」迷惑而忽略策略本身。
九、可信回测的检查清单
一份可信回测至少过这几关:用每 tick 或控制点建模(非仅开盘)、含点差与手续费、样本外验证通过、无未来函数、手数按资金管理而非写死、止损真实挂上。任何一关漏了,曲线都是假的。
还有常被忽略的:成交模型要选「市价成交带滑点」而非理想成交,否则高估胜率;数据要有足够多的趋势与震荡样本,单看一段会高估策略。
把这些写成上线前检查项逐条勾选,比事后发现曲线诡异再查省十倍时间,也是专业与业余的分界。
十、回测即科学实验
把每次回测当科学实验:提出假设(如「均线金叉在趋势市盈利」)、用历史数据检验、记录是否推翻。这种心态能让你客观看待结果,而不是只挑好看的曲线证明自己对了。
实验文化还意味着「允许策略被否定」:一段回测推翻假设,是省了真金白银,而非失败。越能坦然否定自己策略的人,越能在市场活久,因为市场专杀不肯认错的人。
跑完测试别只盯着最终盈利数字,打开净值曲线看回撤段发生在哪、是不是单笔极端黑天鹅拉垮整体。代理模式与真实 tick 的结论若有冲突,一律以真实 tick 为准,因为它才反映真实滑点与点差。把测试报告连同参数存档,下次调参才有可比基线。