MT5指标编译通过 · EX5 13KB 37 7

多周期趋势共振面板

XAUOF 官方·1 天前发布

日线 / 4小时 / 1小时 EMA 方向一致时给出共振信号,图表右上角一眼看清大方向

多周期趋势共振面板

效果示意图 · AI 根据源码绘制

MultiTimeframeEMA_Panel.mq5209
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//+------------------------------------------------------------------+
//|                                     多周期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);      // 在对象列表中隐藏
}
//+------------------------------------------------------------------+
真实 MT5 运行截图服务器把编译好的 EX5 挂到黄金 H1 图表上截的,上面的封面就是照着它画的
多周期趋势共振面板 在 MT5 上的真实截图

作品说明

这个指标通过读取三个不同时间周期的 EMA 均线交叉状态,判断多空趋势,并在图表右上角以清晰的面板形式展示。当三个周期方向完全一致时会触发"共振"信号,这是一个强烈的趋势确认信号。

使用说明

安装方法

  1. 将代码保存为 MultiTimeframeEMA_Panel.mq5,放入 MT5 数据文件夹的 MQL5/Indicators/ 目录
  2. 在 MetaEditor 中编译(F7),确认无错误
  3. 在 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.

评论

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

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