黄金三均线交叉信号指标
三条EMA(20/50/200)+ 金叉死叉箭头提示,适合趋势交易
#property copyright "XAUOF 指标工坊"
#property version "1.0"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 5
// 均线1(短期)
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_width1 2
#property indicator_label1 "快线EMA"
// 均线2(中期)
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_width2 2
#property indicator_label2 "中线EMA"
// 均线3(长期)
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrGold
#property indicator_width3 2
#property indicator_label3 "慢线EMA"
// 买入箭头
#property indicator_type4 DRAW_ARROW
#property indicator_color4 clrLime
#property indicator_width4 3
#property indicator_label4 "买入信号"
// 卖出箭头
#property indicator_type5 DRAW_ARROW
#property indicator_color5 clrRed
#property indicator_width5 3
#property indicator_label5 "卖出信号"
//--- 输入参数
input int FastMA_Period = 20; // 快线周期(蓝色):推荐 20
input int MidMA_Period = 50; // 中线周期(红色):推荐 50
input int SlowMA_Period = 200; // 慢线周期(黄色):推荐 200
input ENUM_MA_METHOD MA_Method = MODE_EMA; // 均线类型:EMA 更灵敏
input ENUM_APPLIED_PRICE AppliedPrice = PRICE_CLOSE; // 应用价格:收盘价
input bool ShowArrows = true; // 是否显示箭头:true=显示买卖信号
input int ArrowDistance = 30; // 箭头距离K线的点数:调整箭头位置
//--- 指标缓冲区
double FastMABuffer[]; // 快线缓冲区
double MidMABuffer[]; // 中线缓冲区
double SlowMABuffer[]; // 慢线缓冲区
double BuyArrowBuffer[]; // 买入箭头缓冲区
double SellArrowBuffer[];// 卖出箭头缓冲区
//--- 指标句柄
int fastHandle;
int midHandle;
int slowHandle;
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 绑定缓冲区到绘图
SetIndexBuffer(0, FastMABuffer, INDICATOR_DATA);
SetIndexBuffer(1, MidMABuffer, INDICATOR_DATA);
SetIndexBuffer(2, SlowMABuffer, INDICATOR_DATA);
SetIndexBuffer(3, BuyArrowBuffer, INDICATOR_DATA);
SetIndexBuffer(4, SellArrowBuffer, INDICATOR_DATA);
//--- 设置箭头代码
PlotIndexSetInteger(3, PLOT_ARROW, 233); // 买入向上箭头
PlotIndexSetInteger(4, PLOT_ARROW, 234); // 卖出向下箭头
//--- 设置数组为时间序列(0 为最新)
ArraySetAsSeries(FastMABuffer, true);
ArraySetAsSeries(MidMABuffer, true);
ArraySetAsSeries(SlowMABuffer, true);
ArraySetAsSeries(BuyArrowBuffer, true);
ArraySetAsSeries(SellArrowBuffer, true);
//--- 创建均线指标句柄
fastHandle = iMA(_Symbol, PERIOD_CURRENT, FastMA_Period, 0, MA_Method, AppliedPrice);
midHandle = iMA(_Symbol, PERIOD_CURRENT, MidMA_Period, 0, MA_Method, AppliedPrice);
slowHandle = iMA(_Symbol, PERIOD_CURRENT, SlowMA_Period, 0, MA_Method, AppliedPrice);
//--- 检查句柄是否有效
if(fastHandle == INVALID_HANDLE || midHandle == INVALID_HANDLE || slowHandle == INVALID_HANDLE)
{
Print("均线指标句柄创建失败!");
return(INIT_FAILED);
}
//--- 指标名称
IndicatorSetString(INDICATOR_SHORTNAME, "三均线交叉系统");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 自定义指标迭代函数 |
//+------------------------------------------------------------------+
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线数量是否足够
if(rates_total < SlowMA_Period)
return(0);
//--- 设置价格数组为时间序列
ArraySetAsSeries(close, true);
ArraySetAsSeries(low, true);
ArraySetAsSeries(high, true);
//--- 从指标句柄拷贝均线数值
if(CopyBuffer(fastHandle, 0, 0, rates_total, FastMABuffer) <= 0)
{
Print("快线数据拷贝失败!");
return(0);
}
if(CopyBuffer(midHandle, 0, 0, rates_total, MidMABuffer) <= 0)
{
Print("中线数据拷贝失败!");
return(0);
}
if(CopyBuffer(slowHandle, 0, 0, rates_total, SlowMABuffer) <= 0)
{
Print("慢线数据拷贝失败!");
return(0);
}
//--- 计算起始位置
int start = prev_calculated > 0 ? prev_calculated - 1 : SlowMA_Period;
//--- 主循环:生成买卖信号
for(int i = start; i < rates_total - 1 && i >= 1; i++)
{
//--- 初始化箭头缓冲区为空值
BuyArrowBuffer[i] = EMPTY_VALUE;
SellArrowBuffer[i] = EMPTY_VALUE;
//--- 跳过没有足够历史数据的K线
if(i >= rates_total - 1)
continue;
//--- 只在显示箭头开关打开时计算信号
if(!ShowArrows)
continue;
//--- 买入信号:快线上穿中线 且 价格在慢线上方
// 当前K线:快线 > 中线,上一根K线:快线 <= 中线(发生金叉)
if(FastMABuffer[i] > MidMABuffer[i] &&
FastMABuffer[i+1] <= MidMABuffer[i+1] &&
close[i] > SlowMABuffer[i])
{
// 在K线低点下方绘制向上箭头
BuyArrowBuffer[i] = low[i] - ArrowDistance * _Point;
}
//--- 卖出信号:快线下穿中线 且 价格在慢线下方
// 当前K线:快线 < 中线,上一根K线:快线 >= 中线(发生死叉)
if(FastMABuffer[i] < MidMABuffer[i] &&
FastMABuffer[i+1] >= MidMABuffer[i+1] &&
close[i] < SlowMABuffer[i])
{
// 在K线高点上方绘制向下箭头
SellArrowBuffer[i] = high[i] + ArrowDistance * _Point;
}
}
//--- 返回当前计算的K线数量
return(rates_total);
}
//+------------------------------------------------------------------+
//| 指标卸载函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- 释放指标句柄
if(fastHandle != INVALID_HANDLE)
IndicatorRelease(fastHandle);
if(midHandle != INVALID_HANDLE)
IndicatorRelease(midHandle);
if(slowHandle != INVALID_HANDLE)
IndicatorRelease(slowHandle);
}作品说明
我看到图上有以下几个关键元素:
- 三条不同颜色的移动平均线:
- 蓝色线(看起来是短期均线,约 20 周期)
- 红色线(中期均线,约 50 周期)
- 黄色线(长期均线,约 200 周期)
- 买卖信号箭头:
- 绿色向上箭头标记买入信号(出现在价格下方)
- 红色向下箭头标记卖出信号(出现在价格上方)
- 信号逻辑看起来是:短期均线上穿中期均线且价格在长期均线上方时买入,短期均线下穿中期均线且价格在长期均线下方时卖出
- 价格蜡烛图:标准的 XAUUSD(黄金)K线图
现在为您复刻这套指标:
使用说明
安装步骤:
- 将代码保存为
GoldenTripleMA_Signals.mq5 - 放入 MT5 的
MQL5\Indicators目录 - 在 MetaEditor 中编译(F7)
- 重启 MT5 或刷新导航器
- 从导航器拖到 XAUUSD 图表上
参数调整:
- 快线周期 20:捕捉短期趋势,数值越小越灵敏但假信号多
- 中线周期 50:过滤噪音,确认趋势方向
- 慢线周期 200:判断大趋势,价格在其上方看多,下方看空
- 箭头距离 30 点:调整箭头到K线的距离,避免重叠遮挡
- 均线类型 EMA:指数移动平均更贴近当前价格,也可改为 SMA
信号解读:
- 绿色向上箭头:快线上穿中线 + 价格在慢线上方 = 买入信号(做多)
- 红色向下箭头:快线下穿中线 + 价格在慢线下方 = 卖出信号(做空)
- 三条均线多头排列(蓝>红>黄):强势上涨,持有多单
- 三条均线空头排列(蓝<红<黄):强势下跌,持有空单
注意事项:
- 震荡行情中会有假突破,建议结合 RSI/MACD 等指标过滤
- 箭头出现在已完成的K线上,不建议在当前K线未收盘时抢跑
- 慢线(黄色 200 周期)是关键支撑/阻力,价格远离时谨慎追单
- 建议在 H1 或 H4 周期使用,M5/M15 假信号较多
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个基于三条指数移动平均线(EMA)交叉的趋势跟踪指标,在 MT5 图表上同时画出 20/50/200 三条均线,并在快线(蓝色 20 周期)上穿或下穿中线(红色 50 周期)时,结合价格与慢线(黄色 200 周期)的位置关系,在图表上打出绿色向上箭头(买入信号)或红色向下箭头(卖出信号)。适合不想盯盘计算均线交叉的趋势交易者。
逻辑原理
指标用 iMA 函数分别计算三条 EMA,默认应用收盘价。信号逻辑是经典的双均线金叉死叉 + 长期均线过滤:
- 买入信号(绿色向上箭头):当前 K 线快线数值大于中线,且前一根 K 线快线小于等于中线(刚发生金叉),同时当前收盘价在慢线上方(确认大趋势向上),箭头画在当前 K 线低点下方 30 点(默认)处。
- 卖出信号(红色向下箭头):当前 K 线快线数值小于中线,且前一根 K 线快线大于等于中线(刚发生死叉),同时当前收盘价在慢线下方(确认大趋势向下),箭头画在当前 K 线高点上方 30 点处。
慢线(200 周期)起过滤作用,只在价格站上慢线时接受金叉做多信号,价格跌破慢线时接受死叉做空信号,避免在震荡市中频繁进出。
参数说明
- FastMA_Period(默认 20):快线周期。数值越小越灵敏,能更早捕捉趋势转折,但假信号也多;数值越大越平滑,滞后但稳定。
- MidMA_Period(默认 50):中线周期。与快线构成交叉信号的基准线,50 是常用的中期趋势周期。
- SlowMA_Period(默认 200):慢线周期。判断长期趋势方向和主要支撑阻力位,200 是市场公认的牛熊分界线。
- MA_Method(默认 MODE_EMA):均线类型。EMA(指数移动平均)对近期价格反应更快,也可改为 SMA(简单移动平均)、SMMA、LWMA。
- AppliedPrice(默认 PRICE_CLOSE):应用价格。收盘价是最常用的,也可选开盘价、最高价、最低价、中位价等。
- ShowArrows(默认 true):是否显示箭头。关闭后只画三条均线不显示信号,适合只看均线排列的交易者。
- ArrowDistance(默认 30):箭头距离 K 线的点数。调大避免箭头和 K 线重叠看不清,调小让箭头更贴近价格。
怎么用
将代码保存为 .mq5 文件,放入 MT5 安装目录的 MQL5\Indicators 文件夹,在 MetaEditor 里编译(按 F7),然后重启 MT5 或刷新导航器窗口。从导航器的"指标"列表把它拖到 XAUUSD(或任何品种)的图表上,图表会出现三条彩色均线和箭头。
看信号:绿色向上箭头出现在 K 线下方时考虑做多,红色向下箭头出现在 K 线上方时考虑做空。箭头画在已完成的 K 线上,不要在当前 K 线未收盘时抢跑。配合三条均线的排列关系:蓝色快线在最上方、红色中线在中间、黄色慢线在最下方是多头排列(强势上涨),反过来是空头排列(强势下跌)。价格远离慢线时谨慎追单,等回调靠近慢线再进。
适用场景
这套逻辑适合有明显趋势的品种和周期。黄金(XAUUSD)、原油、外汇主要货币对在 H1(1 小时)或 H4(4 小时)图上效果较好,趋势持续时间够长,均线交叉后有足够利润空间。不适合 M5、M15 等短周期,因为小周期噪音多,均线频繁缠绕,假突破信号多。
震荡市中(价格在慢线附近横盘、快中线反复缠绕)会出现连续的金叉死叉假信号,这时最好等价格明确突破慢线并拉开距离后再参与。适合配合 RSI、MACD 等震荡指标过滤:比如 RSI 超买超卖区域反转时的均线交叉信号更可靠。
风险提示
均线是滞后指标,交叉信号出现时趋势已经走了一段,入场点不是最优,可能吃掉部分利润或在趋势末端接盘。快线和中线周期差距不大时(20 和 50),交叉后可能很快再次交叉(假突破),连续止损。代码逻辑是前一根 K 线满足条件就画箭头,不会重绘,但信号出现在 K 线收盘后,实盘进场有滑点和延迟。
慢线过滤虽然减少了震荡市的无效信号,但也会错过趋势初期的机会(价格刚突破慢线但快中线还未金叉)。200 周期均线在小周期图上计算需要大量历史数据,刚上市的品种或周末跳空后可能数据不足导致均线失真。这个指标只管进场信号,不管止损止盈,需要交易者自己设定风险管理规则,比如慢线作为止损位、或固定点数 / ATR 倍数止损。
常见问题
- 这个指标会重绘吗?信号会消失吗?
- 不会重绘。代码逻辑是检测前一根 K 线和当前 K 线的均线位置关系,箭头画在已完成的 K 线上后不会改变。但信号出现在 K 线收盘后,当根 K 线未收盘时看到的均线交叉不算数。
- 可以用在 XAUUSD 以外的品种吗?
- 可以。代码用 _Symbol 自动适应当前图表品种,外汇、原油、指数、股票都能用。但不同品种的波动特性不同,可能需要调整均线周期和箭头距离参数,建议先在历史数据上回测。
- MT4 能用吗?
- 不能直接用。这是 MQL5 代码,MT4 用的是 MQL4 语言,语法和函数不同。MT4 需要重写,主要改 iMA 的调用方式和缓冲区设置逻辑。
- 参数默认值(20/50/200)适合什么周期?
- 默认值是市场通用配置,在 H1 和 H4 周期黄金上比较稳定。如果用在 M15 等短周期,建议把快线和中线周期缩小(比如 10/30)减少滞后;如果用在 D1 日线,可以保持默认或放大到 30/60/250。
- 为什么有时均线交叉了但没有箭头?
- 因为代码加了慢线过滤条件。快线上穿中线(金叉)时,如果收盘价在慢线下方,不会显示买入箭头;快线下穿中线(死叉)时,如果收盘价在慢线上方,不会显示卖出箭头。这是为了过滤震荡市的假信号,只在大趋势方向一致时才提示。
Golden Triple EMA Crossover Signal Indicator for MT5
A trend-following indicator for MT5 featuring three EMAs (20/50/200). It displays buy/sell arrows when the fast EMA crosses the mid EMA, filtered by price position relative to the slow EMA. Suitable for H1/H4 timeframes on trending markets like XAUUSD.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。