多周期趋势共振面板
日线 / 4小时 / 1小时 EMA 方向一致时给出共振信号,图表右上角一眼看清大方向
效果示意图 · AI 根据源码绘制
//+------------------------------------------------------------------+
//| 多周期EMA趋势共振面板指标 |
//| MQL5 量化交易指标 |
//+------------------------------------------------------------------+
#property copyright "Kiro MT5 Indicator"
#property link ""
#property version "1.00"
#property indicator_chart_window
#property description "显示 D1/H4/H1 三个周期的 EMA20/EMA60 多空状态"
#property description "三周期方向一致时显示共振信号"
//--- 输入参数
input int InpFastPeriod = 20; // EMA 快线周期(推荐 20)
input int InpSlowPeriod = 60; // EMA 慢线周期(推荐 60)
input int InpFontSize = 11; // 字体大小(推荐 10-14)
input int InpOffsetX = 15; // 面板右侧偏移像素(推荐 10-30)
input int InpOffsetY = 30; // 面板顶部偏移像素(推荐 20-50)
input color InpBullColor = clrLime; // 多头颜色
input color InpBearColor = clrRed; // 空头颜色
input color InpResonanceColor = clrGold; // 共振信号颜色
//--- 全局变量:指标句柄
int handleD1_Fast, handleD1_Slow; // D1 周期 EMA 句柄
int handleH4_Fast, handleH4_Slow; // H4 周期 EMA 句柄
int handleH1_Fast, handleH1_Slow; // H1 周期 EMA 句柄
//--- 标签对象名称
string labelD1 = "MTF_EMA_D1";
string labelH4 = "MTF_EMA_H4";
string labelH1 = "MTF_EMA_H1";
string labelResonance = "MTF_EMA_Resonance";
//+------------------------------------------------------------------+
//| 指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 创建 D1 周期的 EMA 句柄
handleD1_Fast = iMA(_Symbol, PERIOD_D1, InpFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
handleD1_Slow = iMA(_Symbol, PERIOD_D1, InpSlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
//--- 创建 H4 周期的 EMA 句柄
handleH4_Fast = iMA(_Symbol, PERIOD_H4, InpFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
handleH4_Slow = iMA(_Symbol, PERIOD_H4, InpSlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
//--- 创建 H1 周期的 EMA 句柄
handleH1_Fast = iMA(_Symbol, PERIOD_H1, InpFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
handleH1_Slow = iMA(_Symbol, PERIOD_H1, InpSlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
//--- 检查句柄是否创建成功
if(handleD1_Fast == INVALID_HANDLE || handleD1_Slow == INVALID_HANDLE ||
handleH4_Fast == INVALID_HANDLE || handleH4_Slow == INVALID_HANDLE ||
handleH1_Fast == INVALID_HANDLE || handleH1_Slow == INVALID_HANDLE)
{
Print("初始化失败:无法创建 EMA 指标句柄");
return(INIT_FAILED);
}
//--- 创建文字标签对象
CreateLabel(labelD1, InpOffsetX, InpOffsetY);
CreateLabel(labelH4, InpOffsetX, InpOffsetY + (InpFontSize + 5) * 1);
CreateLabel(labelH1, InpOffsetX, InpOffsetY + (InpFontSize + 5) * 2);
CreateLabel(labelResonance, InpOffsetX, InpOffsetY + (InpFontSize + 5) * 3);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 指标反初始化函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- 释放指标句柄
if(handleD1_Fast != INVALID_HANDLE) IndicatorRelease(handleD1_Fast);
if(handleD1_Slow != INVALID_HANDLE) IndicatorRelease(handleD1_Slow);
if(handleH4_Fast != INVALID_HANDLE) IndicatorRelease(handleH4_Fast);
if(handleH4_Slow != INVALID_HANDLE) IndicatorRelease(handleH4_Slow);
if(handleH1_Fast != INVALID_HANDLE) IndicatorRelease(handleH1_Fast);
if(handleH1_Slow != INVALID_HANDLE) IndicatorRelease(handleH1_Slow);
//--- 删除图表对象
ObjectDelete(0, labelD1);
ObjectDelete(0, labelH4);
ObjectDelete(0, labelH1);
ObjectDelete(0, labelResonance);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| 指标计算函数 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- 读取各周期的 EMA 最新值
double emaD1_Fast[], emaD1_Slow[];
double emaH4_Fast[], emaH4_Slow[];
double emaH1_Fast[], emaH1_Slow[];
//--- 设置数组为时间序列(最新数据索引为0)
ArraySetAsSeries(emaD1_Fast, true);
ArraySetAsSeries(emaD1_Slow, true);
ArraySetAsSeries(emaH4_Fast, true);
ArraySetAsSeries(emaH4_Slow, true);
ArraySetAsSeries(emaH1_Fast, true);
ArraySetAsSeries(emaH1_Slow, true);
//--- 复制 D1 周期数据(复制最近 2 根 K 线的数据)
if(CopyBuffer(handleD1_Fast, 0, 0, 2, emaD1_Fast) < 2 ||
CopyBuffer(handleD1_Slow, 0, 0, 2, emaD1_Slow) < 2)
{
return(0); // 数据未准备好
}
//--- 复制 H4 周期数据
if(CopyBuffer(handleH4_Fast, 0, 0, 2, emaH4_Fast) < 2 ||
CopyBuffer(handleH4_Slow, 0, 0, 2, emaH4_Slow) < 2)
{
return(0);
}
//--- 复制 H1 周期数据
if(CopyBuffer(handleH1_Fast, 0, 0, 2, emaH1_Fast) < 2 ||
CopyBuffer(handleH1_Slow, 0, 0, 2, emaH1_Slow) < 2)
{
return(0);
}
//--- 判断各周期多空状态(1=多头,-1=空头)
int trendD1 = (emaD1_Fast[0] > emaD1_Slow[0]) ? 1 : -1;
int trendH4 = (emaH4_Fast[0] > emaH4_Slow[0]) ? 1 : -1;
int trendH1 = (emaH1_Fast[0] > emaH1_Slow[0]) ? 1 : -1;
//--- 更新 D1 标签
string textD1 = (trendD1 > 0) ? "D1 ▲ 多头" : "D1 ▼ 空头";
color colorD1 = (trendD1 > 0) ? InpBullColor : InpBearColor;
ObjectSetString(0, labelD1, OBJPROP_TEXT, textD1);
ObjectSetInteger(0, labelD1, OBJPROP_COLOR, colorD1);
//--- 更新 H4 标签
string textH4 = (trendH4 > 0) ? "H4 ▲ 多头" : "H4 ▼ 空头";
color colorH4 = (trendH4 > 0) ? InpBullColor : InpBearColor;
ObjectSetString(0, labelH4, OBJPROP_TEXT, textH4);
ObjectSetInteger(0, labelH4, OBJPROP_COLOR, colorH4);
//--- 更新 H1 标签
string textH1 = (trendH1 > 0) ? "H1 ▲ 多头" : "H1 ▼ 空头";
color colorH1 = (trendH1 > 0) ? InpBullColor : InpBearColor;
ObjectSetString(0, labelH1, OBJPROP_TEXT, textH1);
ObjectSetInteger(0, labelH1, OBJPROP_COLOR, colorH1);
//--- 检查三周期共振(方向完全一致)
bool isResonance = (trendD1 == trendH4 && trendH4 == trendH1);
if(isResonance)
{
string resonanceText = (trendD1 > 0) ? "★ 三周期多头共振 ★" : "★ 三周期空头共振 ★";
ObjectSetString(0, labelResonance, OBJPROP_TEXT, resonanceText);
ObjectSetInteger(0, labelResonance, OBJPROP_COLOR, InpResonanceColor);
}
else
{
ObjectSetString(0, labelResonance, OBJPROP_TEXT, " "); // 不共振时隐藏(MT5 对空字符串会显示默认的 Label 字样,所以用一个空格)
}
//--- 刷新图表
ChartRedraw();
return(rates_total);
}
//+------------------------------------------------------------------+
//| 创建文字标签对象 |
//+------------------------------------------------------------------+
void CreateLabel(string name, int x, int y)
{
//--- 如果对象已存在则不重复创建
if(ObjectFind(0, name) >= 0)
return;
//--- 创建文字标签
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
//--- 设置标签位置(右上角)
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER); // 文字向左伸,不然会被价格轴挡住
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
//--- 设置字体属性
ObjectSetString(0, name, OBJPROP_FONT, "Microsoft YaHei");
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, InpFontSize);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrWhite);
//--- 设置其他属性
ObjectSetInteger(0, name, OBJPROP_BACK, false); // 前景显示
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); // 不可选中
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); // 在对象列表中隐藏
}
//+------------------------------------------------------------------+作品说明
这个指标通过读取三个不同时间周期的 EMA 均线交叉状态,判断多空趋势,并在图表右上角以清晰的面板形式展示。当三个周期方向完全一致时会触发"共振"信号,这是一个强烈的趋势确认信号。
使用说明
安装方法
- 将代码保存为
MultiTimeframeEMA_Panel.mq5,放入 MT5 数据文件夹的MQL5/Indicators/目录 - 在 MetaEditor 中编译(F7),确认无错误
- 在 MT5 图表中插入指标:插入 → 指标 → 自定义 → MultiTimeframeEMA_Panel
参数调整
- EMA 快线/慢线周期:默认 20/60,经典趋势组合;短线可改为 12/26
- 字体大小:11 适合 1080p 显示器;4K 显示器可调到 14-16
- 面板偏移:X 控制距右边距离,Y 控制距顶部距离,根据图表布局调整
- 颜色:多头绿色、空头红色、共振金色,可按个人喜好修改
信号解读
- 单周期状态:每行显示一个时间周期的 EMA 多空方向,快速了解不同级别趋势
- 三周期共振:当 D1、H4、H1 方向完全一致时出现金色提示,这是强趋势确认信号,适合顺势开仓
- 方向分歧:三个周期方向不一致时,说明市场处于震荡或转折阶段,建议谨慎操作
注意事项
- 指标读取多周期数据,确保历史数据已充分加载(至少 60 根 K 线)
- 共振信号强度高但频率低,不要只依赖共振做单,结合其他确认信号更佳
- 面板位置固定在右上角,不会随价格波动移动
- 指标无需占用缓冲区,不影响图表其他指标显示
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个多周期趋势共振面板指标,专门解决「看不清大方向」的问题。它同时监测日线(D1)、4 小时(H4)、1 小时(H1)三个时间周期的 EMA 均线状态,在图表右上角用清晰的文字面板实时显示每个周期的多空方向。当三个周期方向完全一致时,会触发金色的「共振」提示,这是强趋势的确认信号,适合顺势交易者寻找高胜率入场时机。
逻辑原理
指标的计算逻辑非常直接:每个时间周期分别计算两条 EMA 均线——快线(默认 20 周期)和慢线(默认 60 周期)。判断规则是:快线在慢线上方就是多头,快线在慢线下方就是空头。
具体流程是这样的:每次价格更新时,指标会读取三个周期的最新 K 线数据,分别计算出各自的快慢 EMA 值,然后比较大小。比如日线周期,如果当前 K 线的 EMA20 大于 EMA60,就判定为日线多头;H4 和 H1 同理。
共振信号的触发条件是:三个周期的方向必须完全一致。要么都是多头(三条快线都在各自慢线上方),要么都是空头(三条快线都在下方)。只要有一个周期方向不同,就不算共振。这种设计过滤掉了周期之间矛盾的情况,只保留趋势最明确的时刻。
面板上会用不同颜色标识:多头显示绿色向上箭头,空头显示红色向下箭头,共振时会额外显示一行金色的星标提示。所有判断都是基于最新 K 线的 EMA 值,实时刷新,不会回溯修改历史显示。
参数说明
- EMA 快线周期(20):快速响应价格的均线周期。默认 20 是经典趋势设置,适合中长线;短线交易者可以改成 12 或 9,反应会更灵敏但噪音也会增加。
- EMA 慢线周期(60):慢速趋势确认均线。默认 60 配合快线 20 形成经典组合;如果你改了快线,慢线建议保持 2.5-3 倍关系,比如快线 12 可以配慢线 26 或 30。
- 字体大小(11):面板文字的显示尺寸。11 适合常见的 1080p 显示器;如果用 4K 高分屏或者觉得字太小,可以调到 14-16;笔记本小屏可以降到 9-10。
- 面板右侧偏移像素(15):控制面板距离图表右边缘的距离。数值越大,面板越靠左;如果面板被价格轴遮挡,可以增大这个值到 30-50。
- 面板顶部偏移像素(30):控制面板距离图表顶部的距离。数值越大,面板越靠下;如果和其他指标重叠,可以调大这个值拉开间距。
- 多头颜色 / 空头颜色 / 共振信号颜色:面板文字的配色方案。默认是绿色多头、红色空头、金色共振;可以根据个人习惯和图表背景色自定义,建议选对比度高的颜色便于快速识别。
怎么用
将代码保存为 .mq5 文件,放入 MT5 数据文件夹的 MQL5/Indicators/ 目录(通过 MT5 菜单「文件 → 打开数据文件夹」可以快速定位),然后在 MetaEditor 中打开并编译(按 F7 键),确认没有报错。
在 MT5 图表中插入指标:点击菜单栏「插入 → 指标 → 自定义 → MultiTimeframeEMA_Panel」。指标会自动显示在图表右上角,不占用主图区域,也不会和其他画线指标冲突。
看信号的方式很简单:面板会显示四行文字,前三行分别是 D1、H4、H1 的当前状态,带向上或向下箭头。如果三行都是同一个方向,第四行就会出现金色的「三周期共振」提示。这时候说明从日线到小时线,趋势方向高度一致,是顺势开仓的强确认信号。
建议把指标挂在你常用的交易周期图表上(比如 H1 或 M15),这样既能看到当前周期的价格走势,又能通过面板随时了解更大周期的趋势背景。指标会自动读取其他周期的数据,不需要切换图表。
适用场景
这个指标适合有明确趋势的品种和行情。外汇主要货币对(如 EURUSD、GBPUSD)、黄金(XAUUSD)、原油、主要股指期货都可以用,这些品种趋势性较好,多周期共振的有效性更高。
时间周期上,指标本身监测的是 D1/H4/H1,所以适合在 H1 或更小周期(M15、M5)的图表上使用。你在小周期做单,用这个面板随时确认大方向有没有变化。如果你本身就是日线级别的波段交易者,可以考虑把参数里的周期改成 W1/D1/H4,监测更大的结构。
行情类型上,它最擅长单边趋势行情——无论是强势上涨还是持续下跌,只要三个周期方向一致,共振信号就会持续存在,这时候是最佳的顺势加仓或新开仓时机。震荡行情中,三个周期经常方向不一致,共振信号会消失,这本身也是一种提示:告诉你现在不适合追单,等方向明确再说。
不适合的情况是:快速反转的行情(EMA 滞后会让你错过转折点)、极度震荡的小波动市场(三周期很难形成共振)、重大新闻发布前后(基本面主导,技术信号失效)。另外,如果你是纯粹的剥头皮交易者,只关注 M1、M5 的瞬时波动,这个指标的参考价值有限,因为它关注的是更大级别的趋势。
风险提示
EMA 均线本身是滞后指标,它用历史价格计算,所以信号总是比实际转折晚一些。共振信号出现时,趋势往往已经走了一段,这意味着你可能错过最初的启动阶段,追进去后回撤风险会增加。不要把共振当成「立刻开仓」的指令,而应该结合支撑阻力、回调位置等其他因素确认入场点。
三周期共振的频率不高,尤其在震荡市里可能几天都等不到一次。不要因为等不到信号就降低标准,比如「两个周期一致就开仓」——这样会大幅增加假信号。如果长时间没有共振,说明市场本身就不适合趋势策略,这时候应该考虑其他交易方式或者干脆休息。
指标依赖多周期数据读取,所以首次加载时需要确保图表历史数据充足。如果你的 MT5 历史数据下载不完整(比如只有几十根 K 线),指标可能无法正确计算或者显示空白。遇到这种情况,手动切换到 D1、H4、H1 周期让数据加载完整,然后再回到你的交易周期,指标就会正常工作。
面板显示的是当前 K 线的实时状态,未完成的 K 线可能会变化。比如 H1 周期的 K 线还有 20 分钟才收盘,这期间价格大幅波动可能导致 EMA 交叉状态反复变化,面板上的多空判断也会跟着变。如果你对这种「闪烁」敏感,建议等 K 线收盘后再做决策,或者只在更大周期(D1)确认后才采取行动。
最后强调:这个指标只是趋势确认工具,不提供具体的止损止盈位置,也不管仓位大小。你需要自己制定完整的交易计划——在哪里进、在哪里出、亏多少砍、盈利了加不加仓。共振信号只是告诉你「现在大方向很明确」,怎么利用这个信息赚钱,还得靠你自己的交易系统。
常见问题
- 这个指标会重绘吗?
- 不会。指标只是读取各周期 EMA 的最新值进行比较,不会回溯修改历史显示。不过未完成的 K 线数据可能变化,导致当前 K 线的状态在收盘前反复改变,这不是重绘,是正常的实时更新。
- 默认参数 EMA20/60 适合什么周期?
- 适合 H1 及以上的中长线趋势交易。如果你做 M15 或 M5 的短线,可以把快慢线改成 12/26 或 9/21,反应会更快,但假信号也会增多,需要自己回测找平衡点。
- 可以用在 XAUUSD 以外的品种吗?
- 可以。代码没有品种限制,外汇、贵金属、原油、股指都能用。建议选择流动性好、趋势性强的品种,比如主要货币对、黄金、原油;避免冷门品种和极度震荡的小币种。
- 三周期共振信号多久出现一次?
- 没有固定频率,取决于市场状态。强趋势行情中可能持续几天都是共振状态,震荡市里可能一周都等不到一次。共振是强确认信号,频率低是正常的,不要为了追求信号而降低标准。
- MT4 能用吗?
- 不能直接用。这是 MQL5 代码,只能在 MT5 平台运行。MT4 和 MT5 的代码语法不兼容,如果你只有 MT4,需要找懂 MQL4 的人重写,或者升级到 MT5 平台。
Multi-Timeframe EMA Resonance Panel for MT5
Monitors EMA20/60 crossover status across D1, H4, and H1 timeframes to identify trend direction. Displays a real-time panel in the top-right corner showing bullish or bearish alignment for each period. Triggers a resonance signal when all three timeframes align, confirming strong trend momentum.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。