使用Python和MQL5进行交易策略的自动参数优化·进阶篇
双均线交叉怎么定买卖点
双均线交叉(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 把信号变成进出场仓位变动。
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 改周期范围试的东西。