黄金多周期顺势回调信号指标
H1-EMA50 判趋势 + M15-EMA21 回调 + RSI 拐头确认,画箭头提示入场点
效果示意图 · AI 根据源码绘制,仅示意画了哪些元素,细节以实际运行为准
//+------------------------------------------------------------------+
//| 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.
评论
还没有人评论,来抢个沙发。