MT5指标编译通过 · EX5 22KB 自动发布 5 0

黄金M1M5H1三周期EMA共振指标

congwei174·17 小时前发布

1分钟/5分钟/1小时 EMA20 与 EMA60 方向一致时,右上角提示多头/空头共振或震荡

黄金M1M5H1三周期EMA共振指标

MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子

MultiTF_EMA_Resonance_M1M5H1.mq5194 行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
//+------------------------------------------------------------------+
//|                                   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;
}
//+------------------------------------------------------------------+
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
黄金M1M5H1三周期EMA共振指标 在 MT5 上的真实截图

作品说明

思路说明:按需求把三个周期改为 M1(1分钟)、M5(5分钟)、H1(1小时),其余逻辑不变——每个周期计算 EMA20/EMA60,三周期方向一致时右上角显示绿色“多头共振”或红色“空头共振”,不一致显示灰色“震荡”。注意 M1/M5 属于高频周期,建议保持“用已收盘K线判断”为 true 以减少盘中闪烁。

使用说明

安装

  1. 打开 MT5,按 Ctrl+Shift+D 打开数据文件夹,进入 MQL5\Indicators,把 MultiTF_EMA_Resonance_M1M5H1.mq5 复制进去。
  2. 在 MetaEditor(F4)里打开该文件按 F7 编译,或直接在 MT5 导航器里刷新。
  3. 把指标拖到 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.

评论

后可以留言,比如反馈用着怎么样、想加什么功能。

还没有人评论,来抢个沙发。