黄金M1M5H1三周期EMA共振指标
1分钟/5分钟/1小时 EMA20 与 EMA60 方向一致时,右上角提示多头/空头共振或震荡
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
//+------------------------------------------------------------------+
//| MultiTF_EMA_Resonance_M1M5H1.mq5 |
//| XAUOF 指标工坊 | 多周期趋势共振 |
//+------------------------------------------------------------------+
#property copyright "XAUOF 指标工坊"
#property version "1.10"
#property description "M1/M5/H1 三周期 EMA20/EMA60 方向一致时,右上角显示多头/空头共振"
#property indicator_chart_window // 主图窗口(只显示文字面板,不画线)
#property indicator_buffers 0 // 不需要绘图缓冲区
#property indicator_plots 0 // 不需要绘图曲线
//+------------------------------------------------------------------+
//| 可调参数(每个参数带中文说明) |
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES InpTF1 = PERIOD_M1; // 小周期(推荐 M1 一分钟)
input ENUM_TIMEFRAMES InpTF2 = PERIOD_M5; // 中周期(推荐 M5 五分钟)
input ENUM_TIMEFRAMES InpTF3 = PERIOD_H1; // 大周期(推荐 H1 一小时)
input int InpFastEMA = 20; // 快线 EMA 周期(推荐 20)
input int InpSlowEMA = 60; // 慢线 EMA 周期(推荐 60)
input bool InpUseClosedBar = true; // true=用已收盘K线判断(更稳定不闪烁),false=用当前K线
input int InpFontSize = 14; // 小字字号(推荐 14)
input color InpBullColor = clrLime; // 多头共振文字颜色(推荐绿色)
input color InpBearColor = clrRed; // 空头共振文字颜色(推荐红色)
input color InpFlatColor = clrGray; // 震荡文字颜色(推荐灰色)
input int InpXOffset = 15; // 面板距右上角水平距离(像素,推荐 15)
input int InpYOffset = 20; // 面板距右上角垂直距离(像素,推荐 20)
//--- 全局变量:三个周期各自的快慢 EMA 句柄
int hFast[3]; // 快线(EMA20)句柄
int hSlow[3]; // 慢线(EMA60)句柄
ENUM_TIMEFRAMES tfArr[3]; // 三个周期的数组,方便循环
string g_prefix = "MTF_RES_"; // 图上对象的名称前缀
string g_lastMain = ""; // 缓存上一次主标题,避免每 tick 重绘
//+------------------------------------------------------------------+
//| 初始化:创建 EMA 句柄和文字对象 |
//+------------------------------------------------------------------+
int OnInit()
{
tfArr[0] = InpTF1;
tfArr[1] = InpTF2;
tfArr[2] = InpTF3;
//--- 第一步:每个周期创建快、慢两条 EMA 的句柄(只创建一次)
for(int k = 0; k < 3; k++)
{
hFast[k] = iMA(_Symbol, tfArr[k], InpFastEMA, 0, MODE_EMA, PRICE_CLOSE);
hSlow[k] = iMA(_Symbol, tfArr[k], InpSlowEMA, 0, MODE_EMA, PRICE_CLOSE);
if(hFast[k] == INVALID_HANDLE || hSlow[k] == INVALID_HANDLE)
{
Print("EMA 句柄创建失败,周期索引 = ", k);
return INIT_FAILED;
}
}
//--- 创建右上角的主标题和三行周期明细文字
CreateLabel(g_prefix + "MAIN", InpXOffset, InpYOffset, "计算中...", clrSilver, InpFontSize + 6);
for(int k = 0; k < 3; k++)
{
int y = InpYOffset + InpFontSize + 12 + k * (InpFontSize + 4); // 三行小字依次往下排
CreateLabel(g_prefix + "SUB" + IntegerToString(k), InpXOffset, y, "...", clrSilver, InpFontSize);
}
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| 反初始化:删除图上对象、释放句柄 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, g_prefix); // 删除本指标创建的所有文字对象
for(int k = 0; k < 3; k++)
{
if(hFast[k] != INVALID_HANDLE) IndicatorRelease(hFast[k]);
if(hSlow[k] != INVALID_HANDLE) IndicatorRelease(hSlow[k]);
}
ChartRedraw();
}
//+------------------------------------------------------------------+
//| 主计算:读取三个周期的 EMA,判断方向是否共振 |
//+------------------------------------------------------------------+
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[])
{
int dir[3]; // 每个周期的方向:+1 多,-1 空,0 走平
double f[2], s[2]; // 临时数组:拷出来的快/慢 EMA 数值
for(int k = 0; k < 3; k++)
{
//--- 第二步:先确认句柄的数据已经算好(M1/M5 历史数据可能还没下载完)
if(BarsCalculated(hFast[k]) < InpSlowEMA || BarsCalculated(hSlow[k]) < InpSlowEMA)
return 0; // 数据没准备好,等下一个 tick 再来
//--- 从句柄拷出最近 2 根 K 线的 EMA 值:f[0]=前一根(已收盘),f[1]=当前根
if(CopyBuffer(hFast[k], 0, 0, 2, f) < 2) return 0;
if(CopyBuffer(hSlow[k], 0, 0, 2, s) < 2) return 0;
//--- 选择用已收盘 K 线还是当前 K 线来判断(默认已收盘,信号更稳定)
int idx = InpUseClosedBar ? 0 : 1;
//--- 核心逻辑:快线 EMA20 在慢线 EMA60 上方 = 该周期看多,下方 = 看空
if(f[idx] > s[idx]) dir[k] = 1;
else if(f[idx] < s[idx]) dir[k] = -1;
else dir[k] = 0;
}
//--- 共振判断:三个周期方向完全一致才算共振,否则视为震荡
string mainText;
color mainColor;
if(dir[0] == 1 && dir[1] == 1 && dir[2] == 1) // 全部向上
{
mainText = "多头共振";
mainColor = InpBullColor;
}
else if(dir[0] == -1 && dir[1] == -1 && dir[2] == -1) // 全部向下
{
mainText = "空头共振";
mainColor = InpBearColor;
}
else // 方向不一致
{
mainText = "震荡";
mainColor = InpFlatColor;
}
//--- 主标题只在文字变化时更新,避免每个 tick 都重绘闪烁
if(mainText != g_lastMain)
{
SetLabel(g_prefix + "MAIN", mainText, mainColor);
g_lastMain = mainText;
}
//--- 更新三行小字:显示每个周期各自的方向
for(int k = 0; k < 3; k++)
{
string arrow = (dir[k] == 1) ? " ↑ 多" : (dir[k] == -1) ? " ↓ 空" : " → 平";
color c = (dir[k] == 1) ? InpBullColor : (dir[k] == -1) ? InpBearColor : InpFlatColor;
SetLabel(g_prefix + "SUB" + IntegerToString(k), TFName(tfArr[k]) + arrow, c);
}
ChartRedraw();
return rates_total;
}
//+------------------------------------------------------------------+
//| 创建一个右上角的文字对象 |
//+------------------------------------------------------------------+
void CreateLabel(const string name, int x, int y, const string text, const color clr, int size)
{
if(ObjectFind(0, name) < 0)
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);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size);
ObjectSetString (0, name, OBJPROP_FONT, "Arial Black");
ObjectSetString (0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false); // 不允许鼠标拖动
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true); // 对象列表里隐藏
}
//+------------------------------------------------------------------+
//| 更新已有文字对象的内容和颜色 |
//+------------------------------------------------------------------+
void SetLabel(const string name, const string text, const color clr)
{
if(ObjectFind(0, name) < 0) return; // 对象不存在就不动,防止越界报错
ObjectSetString (0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
}
//+------------------------------------------------------------------+
//| 把周期枚举转成简短文字,如 PERIOD_M1 -> "M1" |
//+------------------------------------------------------------------+
string TFName(ENUM_TIMEFRAMES tf)
{
string s = EnumToString(tf);
StringReplace(s, "PERIOD_", "");
return s;
}
//+------------------------------------------------------------------+作品说明
思路说明:按需求把三个周期改为 M1(1分钟)、M5(5分钟)、H1(1小时),其余逻辑不变——每个周期计算 EMA20/EMA60,三周期方向一致时右上角显示绿色“多头共振”或红色“空头共振”,不一致显示灰色“震荡”。注意 M1/M5 属于高频周期,建议保持“用已收盘K线判断”为 true 以减少盘中闪烁。
使用说明
安装
- 打开 MT5,按
Ctrl+Shift+D打开数据文件夹,进入MQL5\Indicators,把MultiTF_EMA_Resonance_M1M5H1.mq5复制进去。 - 在 MetaEditor(F4)里打开该文件按 F7 编译,或直接在 MT5 导航器里刷新。
- 把指标拖到 XAUUSD(或其他品种)图表上即可,面板固定显示在右上角。
参数怎么调
- 三个周期默认 M1 / M5 / H1,可按需改成 M5 / M15 / H1 等组合。
快线/慢线 EMA 周期默认 20/60;M1/M5 上想更灵敏可改 10/30,想过滤噪音可改 30/100。用已收盘K线判断默认 true(强烈推荐保持),M1/M5 信号变化极快,用已收盘 K 线可避免盘中来回闪烁。- 颜色、字号、面板位置均可自定义。
信号怎么看
- 绿色「多头共振」:M1、M5、H1 的 EMA20 全部在 EMA60 上方,短线顺势做多。
- 红色「空头共振」:三个周期 EMA20 全部在 EMA60 下方,短线顺势做空。
- 灰色「震荡」:方向不一致,建议观望。
- 下方三行小字显示每个周期各自方向(↑ 多 / ↓ 空 / → 平),可观察共振的形成与瓦解过程。
注意事项
- M1/M5 属于高频周期,共振状态切换会比较频繁,建议配合 H1 大方向过滤,只做与 H1 一致方向的信号。
- 首次挂载时 M1 历史数据可能尚未下载,面板会短暂显示“计算中...”,几秒后自动刷新。
- 本指标只做提示、不自动下单;1 分钟级别交易请严格控制点差与滑点成本。
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个 MT5 多周期趋势提示指标。它在图表右上角放一个小面板,同时盯着 M1、M5、H1 三个周期的 EMA20 和 EMA60,三个周期方向一致时显示绿色「多头共振」或红色「空头共振」,不一致时显示灰色「震荡」。它解决的问题是:短线交易者来回切周期看均线,容易看花眼,这个面板一眼看完。
逻辑原理
逻辑很简单。对每个周期分别算两条 EMA:快线 EMA20、慢线 EMA60,都用收盘价。快线在慢线上方,该周期记为多(↑);在下方记为空(↓);相等记为平(→)。
然后做共振判断:三个周期全部为多,显示「多头共振」;全部为空,显示「空头共振」;只要有一个不一致,就显示「震荡」。
面板下方还有三行小字,分别显示 M1、M5、H1 各自的方向箭头,可以看到共振是怎么形成、怎么瓦解的。
默认用已收盘 K 线的 EMA 值判断(参数可关),这样 M1/M5 上信号不会每 tick 跳来跳去。指标只做提示,不自动下单。
参数说明
- InpTF1(PERIOD_M1):小周期,默认 1 分钟,可改成 M5 等。
- InpTF2(PERIOD_M5):中周期,默认 5 分钟。
- InpTF3(PERIOD_H1):大周期,默认 1 小时。
- InpFastEMA(20):快线 EMA 周期。想更灵敏可改小,如 10。
- InpSlowEMA(60):慢线 EMA 周期。想过滤噪音可改大,如 100。
- InpUseClosedBar(true):true 用已收盘 K 线判断,信号稳定不闪烁;false 用当前 K 线,更即时但会盘中变动。建议保持 true。
- InpFontSize(14):小字字号。
- InpBullColor(clrLime):多头共振文字颜色。
- InpBearColor(clrRed):空头共振文字颜色。
- InpFlatColor(clrGray):震荡文字颜色。
- InpXOffset(15)/ InpYOffset(20):面板距右上角的像素距离。
怎么用
把 .mq5 文件放进数据文件夹的 MQL5\Indicators 目录,在 MetaEditor 里编译(F7),然后拖到图表上即可。面板固定在右上角,不需要挂在特定周期图表上——它自己会去读三个周期的数据。看到绿色「多头共振」考虑顺势做多,红色「空头共振」考虑顺势做空,灰色就观望。下方三行小字可以观察哪个周期先掉队。
适用场景
适合短线、超短线交易者,尤其是做黄金(XAUUSD)这类波动大的品种。默认 M1/M5/H1 组合偏剥头皮风格。也可以把参数改成 M5/M15/H1,节奏会慢一些。适合趋势行情;震荡市里三个周期方向反复切换,「震荡」状态会占大部分时间,此时最好不做。
风险提示
- EMA 是滞后指标,共振出现时趋势往往已走了一段,追高追低要小心。
- M1/M5 信号切换频繁,即使关掉当前 K 线判断,共振状态也可能在几根 K 线内瓦解。
- 1 分钟级别交易点差和滑点占比很大,成本会吃掉不少利润。
- 首次挂载时 M1 历史数据可能没下载完,面板会短暂显示「计算中...」,等几秒自动刷新。
- 本指标不构成任何收益保证,只是方向提示工具。
常见问题
- 这个指标会重绘吗?
- 默认参数下用已收盘 K 线判断,已出现的信号不会重绘。如果把 InpUseClosedBar 设为 false,用当前 K 线判断,盘中信号会随价格变动而变化。
- 可以用在 XAUUSD 以外的品种吗?
- 可以。代码里没有限制品种,指标用当前图表的 _Symbol 计算,外汇、指数等品种都能用,需自行测试效果。
- MT4 能用吗?
- 不能。这是 MQL5 指标,用了 iMA 句柄等 MT5 专有的写法,需要 MT5 平台。
- 参数默认值适合什么周期?
- 默认 M1/M5/H1 组合适合剥头皮和超短线。如果觉得信号太频繁,可以把 InpTF1、InpTF2 改成 M5、M15,节奏会慢一些。
- 指标会自动下单吗?
- 不会。它只在图表右上角显示文字提示,没有任何交易指令,进场出场需要自己操作。
Multi-Timeframe EMA Resonance Indicator for MT5 (M1/M5/H1)
This MT5 indicator checks the EMA20/EMA60 relationship on three timeframes (M1, M5, H1 by default) and shows a panel in the chart's upper-right corner. When all three timeframes agree, it displays a green Bullish Resonance or red Bearish Resonance label; otherwise it shows gray Ranging. Each timeframe's individual direction is also listed.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。