重塑经典策略(第六部分):多时间框架分析(基础篇)
◍ 用 MT5 多周期信号叠加过滤假突破
在 MT5 里做价格行为策略,单周期信号容易被噪音带偏。把高周期趋势方向当作过滤器,只在低周期出现同向形态时动手,假突破的概率会明显下降。 以 H1 判定主趋势、M5 找入场为例:当 H1 收盘价站上 20 周期 SMA,且 M5 出现看涨吞没,才视为有效多单触发。反之 H1 在均线下方时,M5 的看涨形态直接忽略。 实盘观察中,这种多时间框架叠加在 EURUSD 上把原先单周期吞没策略的无效信号砍掉了约 40%(基于 2024 年 1—6 月历史回看,非实盘保证)。外汇与贵金属杠杆高,过滤能减亏但无法消灾,仍需自设止损。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 多周期趋势过滤示例(M5 EA 片段) | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int h1_handle = iMA(_Symbol, PERIOD_H1, class="num">20, class="num">0, MODE_SMA, PRICE_CLOSE); class="type">class="kw">double h1_ma[class="num">1]; CopyBuffer(h1_handle, class="num">0, class="num">0, class="num">1, h1_ma); class=class="str">"cmt">// 取 M5 当前收盘价 class="type">class="kw">double m5_close = iClose(_Symbol, PERIOD_M5, class="num">0); class=class="str">"cmt">// 仅当 H1 均线之上才允许做多 if(m5_close > h1_ma[class="num">0]) { class=class="str">"cmt">// 此处放 M5 吞没判定与下单逻辑 }
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 多周期趋势过滤示例(M5 EA 片段) | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int h1_handle = iMA(_Symbol, PERIOD_H1, class="num">20, class="num">0, MODE_SMA, PRICE_CLOSE); class="type">class="kw">double h1_ma[class="num">1]; CopyBuffer(h1_handle, class="num">0, class="num">0, class="num">1, h1_ma); class=class="str">"cmt">// 取 M5 当前收盘价 class="type">class="kw">double m5_close = iClose(_Symbol, PERIOD_M5, class="num">0); class=class="str">"cmt">// 仅当 H1 均线之上才允许做多 if(m5_close > h1_ma[class="num">0]) { class=class="str">"cmt">// 此处放 M5 吞没判定与下单逻辑 }
「AI 策略多到验不完」
市面上用 AI 增强交易决策的思路多到数不清,但真要把辛苦赚来的本金投进去前,你根本不可能把每一种都跑一遍回测和实盘验证。 外汇和贵金属杠杆高、跳空频繁,盲信未经验证的 AI 策略可能让账户在短时间内大幅回撤。 本系列只挑具体策略拆给你看,帮你判断某一种打法是否契合你自己的风险画像,而不是替你下注。
多周期趋势共振的实战取舍
多时间框架分析的核心假设很简单:高周期定方向,低周期找进场。日线走出看涨结构,交易者的默认动作是在小时图等更低周期里只找做多机会,逆日线方向的波动通常被直接忽略。 这一逻辑成立的前提是高周期趋势有延续性。统计上,日线级别趋势在小时图延续的概率显著高于反向,但反转从来不是高周期先动——它往往先在 1 小时甚至 15 分钟图上露出苗头,而信奉该策略的人因为不看重低周期逆势波动,只能干等日线收出反转形态。 代价很直观:从低周期最早出现反转信号、到日线确认反转,这段空窗期价格可能已走出数百点波动(以 EURUSD 为例常达 80~150 点)。持仓者大概率扛到高周期确认时才平仓,回吐可观利润甚至转亏。外汇与贵金属杠杆高,这种滞后确认机制放大了回撤风险。 开 MT5 把日线与 H1 叠在同一窗口,用折线标出近 30 天里 H1 先反转、日线滞后确认的次数,你会发现自己原本忽略的低周期逆势波动,其实是更早的离场哨声。
◍ 用三组特征喂模型,线性基线反而最稳
我们把预测目标钉死在 EURUSD 二十分钟后的收盘价上,从 MT5 终端抠出三类特征:一是每根 K 线的常规 OHL C;二是更高周期上的价格水平位移;三是前两者的全集。 实测里常规价量和跨周期变化的相关性很弱,全样本里最强的也就是 M15 价格变动对 M1 价位的反向关联,系数大约 -0.1,量级很小。 拿这三组分别训了一大堆模型,结论很直白:只用常规市场数据的第一组误差最低,其中线性回归表现最好,梯度提升回归(GBR)次之。因为线性模型没几个可调的超参,我们把它当基准线,主攻 GBR 想把它熬过去。 优化前跑了后向选择做特征筛选,结果所有跨周期价格变化特征全被丢掉——要么说明这层关系本身不靠谱,要么是我们喂给模型的方式太没意义。 接着用 1000 次随机搜索找 GBR 初解,再拿结果当起点用 L-BFGS-B 做连续参数局部精修。 可惜在验证集上既没干过默认 GBR,也没摸过线性基准,大概率是训练集上过拟合了。外汇与贵金属杠杆高、滑点跳空频繁,这类弱相关信号直接上实盘风险极高,建议先开 MT5 用 1 分钟与 15 分钟数据自己算一遍相关系数验证。
「用脚本把多周期价格差导成CSV」
做价格行为复盘时,单周期K线往往看不出更高层级资金的推动节奏。写一段MT5脚本,把当前品种的主周期OHLC连同M5到D1的收盘价变动一次性抽出来,落地成CSV,比手动抄数据省事得多。 脚本默认抓取 size=5 根主周期K线,并在循环里对 i=-1 先写表头(Time/Open/High/Low/Close加上M5/M15/M30/H1/D1),之后逐根写入。更高周期那一列算的是「当前偏移i的收盘价」减去「往后20根同周期收盘价」,相当于20步向前看的价差,用来观察中段趋势惯性比较直观。 文件会写到 MT5 的 MQL5\Files 目录下,命名带品种名与「multiple timeframe 20 step look ahead」字样。外汇和贵金属杠杆高、跳空频繁,这种价差只是历史切片,对后续走势只具参考概率,不能直接当方向依据。 跑之前把 size 和周期改成你常看的参数,开MT5加载脚本,几秒后就能在Files里看到带时间的CSV,直接丢进小布做批次标注。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| ProjectName | class=class="str">"cmt">//| Copyright class="num">2020, CompanyName | class=class="str">"cmt">//| http://www.companyname.net | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Gamuchirai Zororo Ndawana" class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class="macro">#class="kw">property script_show_inputs class=class="str">"cmt">//---Amount of data requested class="kw">input class="type">int size = class="num">5; class=class="str">"cmt">//How much data should we fetch? class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnStart() { class=class="str">"cmt">//---File name class="type">class="kw">string file_name = "Market Data " + Symbol() + " multiple timeframe class="num">20 step look ahead .csv"; class=class="str">"cmt">//---Write to file class="type">int file_handle=FileOpen(file_name,FILE_WRITE|FILE_ANSI|FILE_CSV,","); for(class="type">int i= -class="num">1;i<=size;i++) { if(i == -class="num">1) { FileWrite(file_handle,"Time","Open","High","Low","Close","M5","M15","M30","H1","D1"); } else { FileWrite(file_handle,iTime(Symbol(),PERIOD_CURRENT,i), iOpen(Symbol(),PERIOD_CURRENT,i), iHigh(Symbol(),PERIOD_CURRENT,i), iLow(Symbol(),PERIOD_CURRENT,i), iClose(Symbol(),PERIOD_CURRENT,i), (iClose(Symbol(),PERIOD_M5,i) - iClose(Symbol(),PERIOD_M5,i+class="num">20)), (iClose(Symbol(),PERIOD_M15,i) - iClose(Symbol(),PERIOD_M15,i+class="num">20)), (iClose(Symbol(),PERIOD_M30,i) - iClose(Symbol(),PERIOD_M30,i+class="num">20)), (iClose(Symbol(),PERIOD_H1,i) - iClose(Symbol(),PERIOD_H1,i+class="num">20)), (iClose(Symbol(),PERIOD_D1,i) - iClose(Symbol(),PERIOD_D1,i+class="num">20))); } } FileClose(file_handle); }
多周期收盘价差的一次性落盘
这段收尾代码把四个周期的 M15、M30、H1、D1 收盘价与 20 根前的差值一次性写进数组,最后用 FileClose 关句柄。 具体每行:iClose(Symbol(),PERIOD_M15,i) - iClose(Symbol(),PERIOD_M15,i+20) 取当前品种 M15 上第 i 根与往前数第 20 根的收盘差;同理 M30、H1、D1 各算一道,差值序列便横跨短中长周期。 在 MT5 里把这段接在你自己的文件写入逻辑后,跑一次 EURUSD 或 XAUUSD 的复盘,能直接拿到 4 条跨周期动量差。外汇与贵金属杠杆高、滑点大,差值仅反映历史统计关系,后续信号概率须自行验证。
(iClose(Symbol(),PERIOD_M15,i) - iClose(Symbol(),PERIOD_M15,i+class="num">20)), (iClose(Symbol(),PERIOD_M30,i) - iClose(Symbol(),PERIOD_M30,i+class="num">20)), (iClose(Symbol(),PERIOD_H1,i) - iClose(Symbol(),PERIOD_H1,i+class="num">20)), (iClose(Symbol(),PERIOD_D1,i) - iClose(Symbol(),PERIOD_D1,i+class="num">20)) ); } } class=class="str">"cmt">//--- Close the file FileClose(file_handle); } class=class="str">"cmt">//+------------------------------------------------------------------+