MT4指标编译通过 · EX4 11KB 1 0

黄金多周期顺势回调信号指标

liuyanyuan9413·1 小时前发布

H1-EMA50 判趋势 + M15-EMA21 回调 + RSI 拐头确认,画箭头提示入场点

黄金多周期顺势回调信号指标

效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准

XAUUSD_Trend_Pullback_System.mq4148
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
//+------------------------------------------------------------------+

//|                  XAUUSD 日内顺势三件套(MQL4 版)                  |

//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed

//--- 输入参数

extern int    EMA50Period = 50;           // H1 周期 EMA50(趋势过滤)

extern int    EMA21Period = 21;           // M15 周期 EMA21(回调支撑/阻力)

extern int    RSIPeriod   = 14;           // RSI 周期

extern double RSIOversold = 40.0;         // RSI 做多拐头区(低于此值后向上穿越)

extern double RSIOverbought = 60.0;       // RSI 做空拐头区(高于此值后向下穿越)

extern double PullbackTolerance = 0.001;  // 回调容差(0.1% 允许误差)


//--- 指标缓冲区

double BuyBuffer[];    // 做多箭头

double SellBuffer[];   // 做空箭头


//+------------------------------------------------------------------+

//| 初始化                                                           |

//+------------------------------------------------------------------+

int init()
{
   // 绑定缓冲区

   SetIndexBuffer(0, BuyBuffer);
   SetIndexBuffer(1, SellBuffer);
   
   // 箭头样式

   SetIndexStyle(0, DRAW_ARROW, EMPTY, 2);
   SetIndexArrow(0, 233);  // 向上箭头

   SetIndexEmptyValue(0, EMPTY_VALUE);
   
   SetIndexStyle(1, DRAW_ARROW, EMPTY, 2);
   SetIndexArrow(1, 234);  // 向下箭头

   SetIndexEmptyValue(1, EMPTY_VALUE);
   
   // 标签

   SetIndexLabel(0, "做多信号");
   SetIndexLabel(1, "做空信号");
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+

//| 逐根 K 线计算                                                    |

//+------------------------------------------------------------------+

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[])
{
   // 计算起始位置(首次计算全部,之后只算新 K 线)

   int limit;
   if(prev_calculated == 0)
      limit = rates_total - EMA50Period - 3;  // 留出足够历史数据

   else
      limit = rates_total - prev_calculated;
   
   if(limit < 0) return(0);
   
   // 从旧到新遍历(MQL4 数组 0 是最新 K 线,循环必须倒序)

   for(int i = limit; i >= 0; i--)
   {
      // 默认无信号

      BuyBuffer[i] = EMPTY_VALUE;
      SellBuffer[i] = EMPTY_VALUE;
      
      // 确保有足够历史数据(需要访问 i+2)

      if(i + 2 >= rates_total) continue;
      
      // ═══════════════════════════════════

      // 1. 获取 H1 周期 50 EMA(趋势)

      // ═══════════════════════════════════

      double ema50_0 = iMA(NULL, PERIOD_H1, EMA50Period, 0, MODE_EMA, PRICE_CLOSE, i);
      double ema50_1 = iMA(NULL, PERIOD_H1, EMA50Period, 0, MODE_EMA, PRICE_CLOSE, i+1);
      double ema50_2 = iMA(NULL, PERIOD_H1, EMA50Period, 0, MODE_EMA, PRICE_CLOSE, i+2);
      
      if(ema50_0 == 0 || ema50_1 == 0 || ema50_2 == 0) continue;
      
      // ═══════════════════════════════════

      // 2. 获取 M15 周期 21 EMA(回调位)

      // ═══════════════════════════════════

      double ema21_0 = iMA(NULL, PERIOD_M15, EMA21Period, 0, MODE_EMA, PRICE_CLOSE, i);
      double ema21_1 = iMA(NULL, PERIOD_M15, EMA21Period, 0, MODE_EMA, PRICE_CLOSE, i+1);
      
      if(ema21_0 == 0 || ema21_1 == 0) continue;
      
      // ═══════════════════════════════════

      // 3. 获取 RSI(动量确认)

      // ═══════════════════════════════════

      double rsi_0 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);
      double rsi_1 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i+1);
      double rsi_2 = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i+2);
      
      if(rsi_0 == 0 || rsi_1 == 0 || rsi_2 == 0) continue;
      
      // ═══════════════════════════════════

      // 做多条件

      // ═══════════════════════════════════

      // 趋势向上:前一根收盘在 H1-EMA50 上方 且 EMA50 斜率向上

      bool trendUp = (close[i+1] > ema50_1) && (ema50_1 > ema50_2);
      
      // 回调到 M15-EMA21 附近:前一根最低价触及 EMA21(允许 0.1% 误差),收盘价收回上方

      bool pullback = (low[i+1] <= ema21_1 * (1 + PullbackTolerance)) && 
                      (close[i+1] > ema21_1);
      
      // RSI 拐头:前两根在超卖区下方,前一根回到上方且未过热(<55)

      bool rsiLong = (rsi_2 < RSIOversold) && 
                     (rsi_1 >= RSIOversold) && 
                     (rsi_1 < 55);
      
      if(trendUp && pullback && rsiLong)
      {
         BuyBuffer[i] = low[i] - 15 * Point;  // 箭头画在当前 K 线下方

      }
      
      // ═══════════════════════════════════

      // 做空条件

      // ═══════════════════════════════════

      // 趋势向下:前一根收盘在 H1-EMA50 下方 且 EMA50 斜率向下

      bool trendDn = (close[i+1] < ema50_1) && (ema50_1 < ema50_2);
      
      // 回调到 M15-EMA21 附近:前一根最高价触及 EMA21,收盘价收回下方

      bool pullbackShort = (high[i+1] >= ema21_1 * (1 - PullbackTolerance)) && 
                           (close[i+1] < ema21_1);
      
      // RSI 拐头:前两根在超买区上方,前一根回到下方且未过冷(>45)

      bool rsiShort = (rsi_2 > RSIOverbought) && 
                      (rsi_1 <= RSIOverbought) && 
                      (rsi_1 > 45);
      
      if(trendDn && pullbackShort && rsiShort)
      {
         SellBuffer[i] = high[i] + 15 * Point;  // 箭头画在当前 K 线上方

      }
   }
   
   return(rates_total);
}
//+------------------------------------------------------------------+

作品说明

我看到了一段 MQL5 代码,但你要求的是 MQL4 平台。这段代码使用了 MQL5 独有的语法(指标句柄、CopyBuffer、PlotIndexSetInteger 等),无法在 MT4 上运行。

我从代码逻辑识别到的交易系统:

  • 趋势过滤:H1 周期 50 EMA 判断大方向(价格在上方为多头,在下方为空头)
  • 入场触发:M15 周期 21 EMA 作为回调支撑/阻力位,价格回踩后反弹
  • 动量确认:RSI(14) 在超卖区(<40)拐头向上做多,超买区(>60)拐头向下做空
  • 信号输出:满足条件时在 K 线下方画绿色向上箭头(做多),上方画红色向下箭头(做空)

现在我将其改写为 真正能在 MT4 上运行的 MQL4 版本


使用说明

1. 安装方法

  • 将代码保存为 XAUUSD_Trend_Pullback_System.mq4,放入 MT4 的 MQL4/Indicators 目录
  • 重启 MT4 或右键导航器点击"刷新"
  • 拖到黄金(XAUUSD)图表上,建议使用 M5 或 M15 周期图表

2. 参数调整

  • EMA50Period:H1 周期趋势线,默认 50,数值越大趋势越稳定但滞后
  • EMA21Period:M15 周期回调支撑/阻力,默认 21,可尝试 20-30
  • RSIPeriod:动量指标周期,默认 14(标准值)
  • RSIOversold / RSIOverbought:做多拐头区 40、做空拐头区 60,可根据市场波动调整(波动大时改为 35/65)
  • PullbackTolerance:回调容差 0.001(0.1%),避免错过刚好贴线的机会

3. 信号解读

  • 绿色向上箭头:H1 趋势向上 + 价格回调到 M15-EMA21 + RSI 从超卖区拐头 → 顺势做多机会
  • 红色向下箭头:H1 趋势向下 + 价格反弹到 M15-EMA21 + RSI 从超买区拐头 → 顺势做空机会
  • 箭头出现在信号 K 线上,后续 K 线不会重复画(避免箭头墙)

4. 交易建议

  • 止损:多单设在 M15-EMA21 下方 10-20 点,空单设在上方
  • 止盈:可用 ATR 倍数(1.5-2 倍)或看下一个关键支撑/阻力
  • 时段:欧美盘(北京时间 15:00-23:00)信号质量最佳,亚盘波动小易假突破
  • 过滤:重大新闻前后 30 分钟不交易

5. 注意事项

  • 此指标是辅助工具,不能盲目跟单,需结合盘面结构、支撑阻力位综合判断
  • 震荡市(价格在 H1-EMA50 上下反复穿越)会频繁出现假信号,建议暂停使用
  • 回测时注意:箭头只在信号 K 线出现,不会提前预警,实盘需等 K 线收盘确认

AI 解读根据源码逐行分析写成,供参考,以实际运行为准

这是什么

这是一个专为黄金(XAUUSD)日内交易设计的多周期顺势回调指标。它用 H1 大周期的 50 均线判断趋势方向,等价格回调到 M15 小周期的 21 均线附近时,再用 RSI 拐头确认动量反转,满足条件后在图表上画箭头提示入场点。适合不想追高杀跌、喜欢等回调后顺势接的交易者。

逻辑原理

指标分三层过滤:

1. 趋势过滤(H1-EMA50) 代码会去 H1 小时图读取 50 周期指数均线。做多要求前一根 K 线收盘价在 EMA50 上方,且 EMA50 本身斜率向上(当前值 > 前一根值);做空反之。这样确保只在大趋势明确时才找机会。

2. 回调触发(M15-EMA21) 趋势确认后,等价格回调。代码检查前一根 K 线的最低价是否触及或穿过 M15 的 21 均线(允许 0.1% 容差,避免差 1 个点就错过),同时收盘价要收回均线上方,说明回调结束开始反弹。做空逻辑相反:最高价触及 EMA21 且收盘收回下方。

3. 动量确认(RSI 拐头) 最后用 RSI(14) 确认动能反转。做多要求前两根 K 线 RSI 在超卖区(<40)下方,前一根 K 线 RSI 回到 40 以上且不超过 55(避免已经过热);做空要求前两根在超买区(>60)上方,前一根回到 60 以下且不低于 45。这样过滤掉虚假的均线触碰。

三个条件同时满足时,在当前 K 线下方画绿色向上箭头(做多信号)或上方画红色向下箭头(做空信号)。箭头只在信号 K 线出现一次,后续不会重绘或消失。

参数说明

  • EMA50Period(默认 50):H1 周期趋势均线的周期。数值越大趋势越平滑但反应越慢,黄金波动大可以用 40-60。
  • EMA21Period(默认 21):M15 周期回调均线的周期。经典值是 20 或 21,也可以试 30(更保守)。
  • RSIPeriod(默认 14):RSI 指标的计算周期,标准值 14 通用性好,不建议改。
  • RSIOversold(默认 40.0):做多时 RSI 拐头区的下边界。黄金波动大时可以降到 35,会增加信号但质量可能下降。
  • RSIOverbought(默认 60.0):做空时 RSI 拐头区的上边界。可以提高到 65 过滤更多假信号。
  • PullbackTolerance(默认 0.001):回调容差(0.1%)。价格离 EMA21 在这个比例内都算触及,避免刚好差几个点就不出信号。

怎么用

把文件放到 MT4 的 MQL4/Indicators 文件夹,重启 MT4 或右键导航器点"刷新"。拖到黄金图表上,建议用 M5 或 M15 周期图(方便看清 K 线细节)。指标会自动读取 H1 和 M15 数据,不需要切换周期。

绿色箭头出现在 K 线下方时是做多信号,红色箭头出现在上方时是做空信号。箭头在信号 K 线收盘时画出,实盘操作建议等当前 K 线收盘后下一根开盘时入场,止损设在 M15-EMA21 下方(多单)或上方(空单)10-20 点,止盈可以用 ATR 倍数或看下一个阻力位。

适用场景

适合黄金的趋势行情,尤其是欧美盘(北京时间下午 3 点到晚上 11 点)波动大且方向性强的时段。H1 趋势明确时(价格持续在 EMA50 上方或下方运行)信号质量最高。适合 XAUUSD、XAGUSD 这类贵金属,其他品种需要自己测试参数。

不适合横盘震荡市,比如价格在 H1-EMA50 上下反复穿越、均线走平时,会频繁出现趋势判断错误导致假信号。也不适合亚洲盘早盘(波动小,回调后可能继续回调而不是反转)。重大新闻发布前后半小时不要用,价格会无视技术指标直接跳空。

风险提示

滞后性:指标用前一根 K 线的数据判断条件,当前 K 线才出箭头,意味着最佳入场点已经过了几分钟到十几分钟。实盘需要等 K 线收盘确认信号,无法提前预判。

震荡市假信号:横盘时价格会反复触碰 EMA21 且 RSI 来回穿越区间,产生大量无效信号。如果发现一小时内出现 3 个以上反向箭头,说明行情不适合这套逻辑,应该停止交易。

趋势反转失效:指标是顺势回调策略,如果 H1 趋势刚开始反转(比如多头末期),会继续给出做多信号但实际上趋势已经走完。需要结合更大周期(H4 或 D1)的支撑阻力位判断趋势是否健康。

滑点和点差:箭头出现时价格已经离 EMA21 反弹了一小段,加上 MT4 下单滑点和黄金较大的点差(2-5 美元),实际入场成本会比信号价高。止损空间要留够,否则容易被扫。

不是全自动系统:这只是一个信号提示工具,不会自动下单。每个箭头都需要人工判断当前盘面结构、是否临近重要支撑阻力、消息面是否平静,盲目跟单会亏。

常见问题

这个指标会重绘吗?
不会。箭头只在信号 K 线出现时画出,后续 K 线不会修改或删除之前的箭头。代码里用 prev_calculated 机制保证只计算新 K 线,历史信号固定不变。
可以用在其他品种上吗?
代码没有限制品种,但参数是针对黄金(XAUUSD)波动特性调的。如果用在欧美、镑美等外汇对,建议把 RSI 超买超卖区改窄(比如 35/65),回调容差也要根据点值调整。原油、股指需要自己回测优化参数。
默认参数适合什么周期的图表?
指标读取的是 H1 和 M15 数据,跟你图表开什么周期无关。但为了看清信号细节,建议把图表开在 M5 或 M15。默认参数适合黄金的日内波段(持仓几小时到半天),如果做超短线剥头皮需要改用更小的 EMA 周期。
为什么有时候趋势很明显也不出信号?
因为必须同时满足三个条件:H1 趋势向上、M15 回调到 EMA21、RSI 拐头。如果价格回调幅度不够(没碰到 EMA21)或者 RSI 一直在中间区域没进超买超卖区,就不会出箭头。这是为了过滤低质量信号,宁可错过也不要做错。
箭头出现后应该立即入场还是等下一根 K 线?
代码里箭头是在当前 K 线画出的,说明条件刚满足。实盘建议等这根 K 线收盘确认信号有效,下一根 K 线开盘时入场,避免信号 K 线还没走完就反转。着急的话可以在信号 K 线内入场,但要接受可能被假突破打止损的风险。

Multi-Timeframe EMA-RSI Pullback Signal Indicator for MT4

Uses H1 50-EMA for trend direction and M15 21-EMA for pullback zones. RSI reversal confirms entry momentum. Designed for XAUUSD intraday trending markets with non-repainting arrows.

Source code is shown above. Compiled EX4 files are available to VIP members.

评论

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

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