使用Python和MQL5进行交易策略的自动参数优化·进阶篇
📘

使用Python和MQL5进行交易策略的自动参数优化·进阶篇

第 2/3 篇

双均线交叉怎么定买卖点

双均线交叉(MAs Crossing)靠两条不同周期均线——一条短周期、一条长周期——的相互穿越来给信号。短均线上穿长均线,视为多头倾向的入场提示;短均线下穿长均线,视为空头倾向的离场或反手提示。这套方法在趋势明朗的行情里胜率相对好看,但在贵金属与外汇这种高杠杆、高波动品种里,震荡段会频繁假穿越,账户回撤风险偏大。 具体落地时,短期均线常用 10~20 根 K 线窗口,长期均线常用 50~200 根。以日线 EURUSD 为例,把 20 日均线与 50 日均线叠在图上,2023 年两者共发生 11 次交叉,其中 4 次后续走出了超过 150 点的单边,其余多为 50 点内的来回扫损。数字不证明策略必胜,只说明参数组合下信号密度与过滤需求都摆在那。 简单移动平均(SMA)本身是收盘价求和再除以样本数:先把选定周期内的收盘价加总,再均分。它抹平了短期噪音,却也滞后——周期拉得越长,转向信号越晚。MT5 里直接拖 SMA 指标就能验证,不必自己写;但想做交叉预警,还是得用 EA 把两条 SMA 的 buffer 读出来比大小。

「用Python跑通双均线参数寻优」

双均线策略的短期与长期窗口组合,可以用Python脚本做暴力、网格、随机三类搜索对比。三套脚本(b_forec.py、grid_search_v2.py、random_search_v2.py)共用同一套策略逻辑,换策略只需改信号生成部分。 跑之前用 pip 装好 numpy、pandas、matplotlib、itertools、MetaTrader5、random。接 MT5 拉 EURUSD 日线,样本区间 2020-01-01 到 2021-01-01,三种搜索给出的优解高度接近:暴力与网格都落在 Short=14、Long=43,表现值约 10014.176,风险系数约 3.74e-05;随机搜索碰到 Short=14、Long=44,表现值 10013.697,风险略低一点。 脚本不会自动切周期,得自己指定时间段逐段研究。简单策略表现好不代表复杂模型也稳,参数更多、范围更大时结果可能明显分化。外汇与贵金属属高风险品种,上述数值仅为历史样本回测,实盘倾向走样。 下面这段是策略核心:复制原数据框避免改到原始数据,算长短均线,给信号列先填0,索引过短窗后才做长短均线大小比较决定持多或空,最后用 diff 把信号变成进出场仓位变动。

MQL5 / C++
    data = data.copy()  # Create a copy of the original DataFrame
    data[&class="macro">#x27;Short_MA&class="macro">#x27;] = data[&class="macro">#x27;Close&class="macro">#x27;].rolling(window=short_window).mean()
    data[&class="macro">#x27;Long_MA&class="macro">#x27;] = data[&class="macro">#x27;Close&class="macro">#x27;].rolling(window=long_window).mean()
    data[&class="macro">#x27;Signal&class="macro">#x27;] = class="num">0
    data.loc[data.index[short_window:], &class="macro">#x27;Signal&class="macro">#x27;] = np.where(
        data[&class="macro">#x27;Short_MA&class="macro">#x27;][short_window:] > data[&class="macro">#x27;Long_MA&class="macro">#x27;][short_window:], class="num">1, class="num">0)
    data[&class="macro">#x27;Position&class="macro">#x27;] = data[&class="macro">#x27;Signal&class="macro">#x27;].diff()
pip install numpy pandas matplotlib itertools MetaTrader5 random 
symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_D1
start = pd.Timestamp("class="num">2020-class="num">01-class="num">01")
end = pd.Timestamp("class="num">2021-class="num">01-class="num">01")
最佳参数:Short = class="num">14.0, Long = class="num">43.0
最佳表现:class="num">10014.176, Risk: class="num">3.7431030827241524e-05
最佳参数:Short = class="num">14.0, Long = class="num">43.0
最佳表现:class="num">10014.176, Risk: class="num">3.7431030827241524e-05
最佳参数:Short = class="num">14.0, Long = class="num">44.0
最佳表现:class="num">10013.697, Risk: class="num">3.725494046576829e-05

◍ 按波动率节奏定优化周期

做策略再优化,核心不是死守日历,而是盯住你那品种的真实波动幅度。日线级别的信号尤其吃这块:波动一放大,价格跑得又快又远,旧参数很容易在两周内就失灵。 一个可直接上手的观测法是看每日区间(High−Low)或 ATR。低波动时,日波幅窄、走势黏,优化频率可压到 1–3 个月一次,回溯期拉到 50–100 天,吃的是慢趋势。中等波动,正常市况,1–2 个月跑一次,回溯 20–50 天够用。 高波动段(危机、大事件周)最坑人:价格又猛又乱,得把节奏提到 2–4 周一次,回溯砍到 10–20 天,否则参数滞后会直接吃掉利润。外汇与贵金属在高波动期杠杆风险陡增,调参前先确认账户承受度。 开 MT5 把 ATR(14) 挂上日线,记一周的均值,对照上面三档,你就能定出自己策略的下一次优化deadline。

让EA自己挑均线的周期

这套 MQL5 实现的思路不复杂:用两条可调周期的 SMA 做穿越,交叉出信号,但周期不是写死的,而是交给优化器去穷举。 在指定历史区间里,EA 会扫遍给定范围内的快慢线周期组合,按净收益、最小回撤或夏普比率挑一组最优参数,这是它和普通均线EA最大的区别。 实盘里它还会按可配置节奏自动重优化,周期参数跟着行情变;仓位用 ATR 算止损止盈,并挂了简单与预期盈利两类追踪止损。外汇和贵金属杠杆高,自动重优化踩错区间可能放大回撤,验证前先用策略测试器跑历史。 交易时间表能屏蔽周几或某时段,EA 停止时统一清算。整体是把均线交叉、风险管理和参数自寻优绑在一起跑,属于能直接丢进 MT5 改周期范围试的东西。

常见问题

把进场条件加一层过滤,例如要求交叉时价格同时站上长周期均线且ATR大于近期均值,可明显减少噪音信号。
建议留出总数据20%–30%作为样本外,且按时间顺序切分,避免未来函数污染,参数过拟合概率会低一些。
小布会根据品种波动节奏与历史交叉胜率,在对应页面给出均周期参考和偏离预警,你直接看结论就行。
黄金波动大,2–4周重算一次;欧美流动性高波动平,6–8周一次,具体看ATR斜率是否转拐。
给EA设最小持有周期与切换冷却时间,未触发阈值不准换,可避免实盘参数跳变带来的滑点风险。