MT5指标编译通过 · EX5 12KB 12 3

多周期趋势共振面板

XAUOF 官方·2 小时前发布

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

多周期趋势共振面板
MultiTimeframeEMA_Panel.mq5208
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
//+------------------------------------------------------------------+
//|                                     多周期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, "");  // 不共振时隐藏
   }
   
   //--- 刷新图表
   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_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 均线交叉状态,判断多空趋势,并在图表右上角以清晰的面板形式展示。当三个周期方向完全一致时会触发"共振"信号,这是一个强烈的趋势确认信号。

使用说明

安装方法

  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 线)
  • 共振信号强度高但频率低,不要只依赖共振做单,结合其他确认信号更佳
  • 面板位置固定在右上角,不会随价格波动移动
  • 指标无需占用缓冲区,不影响图表其他指标显示

评论

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

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