三均线系统指标(EMA20/49/89)
三条可调周期的指数移动平均线,用于趋势判断和多空共振
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF指标工坊"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
// 第一条均线
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_width1 2
#property indicator_label1 "EMA快线"
// 第二条均线
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrOrange
#property indicator_width2 2
#property indicator_label2 "EMA中线"
// 第三条均线
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrMagenta
#property indicator_width3 2
#property indicator_label3 "EMA慢线"
//--- 输入参数
input group "===== 快线设置 ====="
input int FastPeriod = 20; // 快线周期(推荐20)
input color FastColor = clrDodgerBlue; // 快线颜色
input int FastWidth = 2; // 快线粗细(1-5)
input group "===== 中线设置 ====="
input int MidPeriod = 49; // 中线周期(推荐49)
input color MidColor = clrOrange; // 中线颜色
input int MidWidth = 2; // 中线粗细(1-5)
input group "===== 慢线设置 ====="
input int SlowPeriod = 89; // 慢线周期(推荐89)
input color SlowColor = clrMagenta; // 慢线颜色
input int SlowWidth = 2; // 慢线粗细(1-5)
//--- 指标缓冲区
double FastBuffer[];
double MidBuffer[];
double SlowBuffer[];
//--- 指标句柄
int FastHandle;
int MidHandle;
int SlowHandle;
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 参数合法性检查
if(FastPeriod < 1 || MidPeriod < 1 || SlowPeriod < 1)
{
Print("均线周期必须大于0");
return INIT_PARAMETERS_INCORRECT;
}
// 绑定指标缓冲区
SetIndexBuffer(0, FastBuffer, INDICATOR_DATA);
SetIndexBuffer(1, MidBuffer, INDICATOR_DATA);
SetIndexBuffer(2, SlowBuffer, INDICATOR_DATA);
// 创建EMA句柄
FastHandle = iMA(_Symbol, PERIOD_CURRENT, FastPeriod, 0, MODE_EMA, PRICE_CLOSE);
MidHandle = iMA(_Symbol, PERIOD_CURRENT, MidPeriod, 0, MODE_EMA, PRICE_CLOSE);
SlowHandle = iMA(_Symbol, PERIOD_CURRENT, SlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
if(FastHandle == INVALID_HANDLE || MidHandle == INVALID_HANDLE || SlowHandle == INVALID_HANDLE)
{
Print("创建均线句柄失败");
return INIT_FAILED;
}
// 设置绘图属性
PlotIndexSetInteger(0, PLOT_LINE_COLOR, FastColor);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, FastWidth);
PlotIndexSetInteger(1, PLOT_LINE_COLOR, MidColor);
PlotIndexSetInteger(1, PLOT_LINE_WIDTH, MidWidth);
PlotIndexSetInteger(2, PLOT_LINE_COLOR, SlowColor);
PlotIndexSetInteger(2, PLOT_LINE_WIDTH, SlowWidth);
// 设置指标标签
PlotIndexSetString(0, PLOT_LABEL, "EMA(" + IntegerToString(FastPeriod) + ")");
PlotIndexSetString(1, PLOT_LABEL, "EMA(" + IntegerToString(MidPeriod) + ")");
PlotIndexSetString(2, PLOT_LABEL, "EMA(" + IntegerToString(SlowPeriod) + ")");
// 设置指标名称
IndicatorSetString(INDICATOR_SHORTNAME,
"三均线系统(" + IntegerToString(FastPeriod) + "," +
IntegerToString(MidPeriod) + "," + IntegerToString(SlowPeriod) + ")");
// 设置指标精度
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
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 < SlowPeriod)
return 0;
// 等待指标数据计算完成
if(BarsCalculated(FastHandle) < rates_total) return 0;
if(BarsCalculated(MidHandle) < rates_total) return 0;
if(BarsCalculated(SlowHandle) < rates_total) return 0;
// 确定计算起点
int start = 0;
if(prev_calculated > 0)
start = prev_calculated - 1;
// 计算需要复制的数据量
int to_copy = rates_total - start;
// 从指标句柄复制数据到缓冲区
if(CopyBuffer(FastHandle, 0, start, to_copy, FastBuffer) <= 0)
{
Print("复制快线数据失败");
return 0;
}
if(CopyBuffer(MidHandle, 0, start, to_copy, MidBuffer) <= 0)
{
Print("复制中线数据失败");
return 0;
}
if(CopyBuffer(SlowHandle, 0, start, to_copy, SlowBuffer) <= 0)
{
Print("复制慢线数据失败");
return 0;
}
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);
}
//+------------------------------------------------------------------+作品说明
这是一个三均线系统指标,画出三条可调周期的EMA均线,常用于判断趋势方向和多空共振。
使用说明
- 安装方法:将代码保存为 TripleEMA.mq5,放入 MT5 的 MQL5/Indicators 文件夹,编译后拖到图表上即可
- 参数调节:
- 快线周期:默认20,适合短期趋势
- 中线周期:默认49,适合中期趋势
- 慢线周期:默认89,适合长期趋势
- 每条线的颜色和粗细都可以单独调整
- 信号判断:
- 多头排列:快线 > 中线 > 慢线,趋势向上
- 空头排列:快线 < 中线 < 慢线,趋势向下
- 均线粘合:三线靠近,市场震荡
- 金叉/死叉:快线穿越中线或慢线时产生信号
- 适用品种:适合黄金、外汇、指数等趋势性品种,所有周期皆可
- 建议用法:配合K线形态和成交量使用,避免在震荡市单独依赖均线信号
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个在MT5图表上画出三条指数移动平均线(EMA)的趋势指标,默认周期是20、49、89,分别代表短期、中期、长期趋势。通过观察三条均线的排列关系,交易者可以判断当前趋势方向和多空力量的强弱。
逻辑原理
指标调用MT5内置的iMA函数计算三条EMA均线,分别基于收盘价(PRICE_CLOSE)和指数加权方式(MODE_EMA)。EMA相比简单均线对近期价格更敏感,能更快反应趋势变化。
信号判断逻辑:
- 多头排列:快线(蓝色)在中线(橙色)上方,中线在慢线(紫红色)上方,三线向上发散,趋势向上
- 空头排列:快线在中线下方,中线在慢线下方,三线向下发散,趋势向下
- 均线粘合:三线靠近甚至交织,表示市场震荡,趋势不明
- 金叉/死叉:快线向上穿越中线或慢线为金叉(做多信号),向下穿越为死叉(做空信号)
指标不产生箭头或报警,只画线,需要交易者自行观察。
参数说明
- FastPeriod(默认20):快线周期,数值越小越灵敏,但假信号更多;建议10-30之间调整
- MidPeriod(默认49):中线周期,作为中期趋势参考;建议30-60之间调整
- SlowPeriod(默认89):慢线周期,代表长期趋势;建议60-200之间调整
- FastColor(默认蓝色):快线颜色,可在参数窗口修改
- FastWidth(默认2):快线粗细,1-5之间,数值越大越粗
- MidColor(默认橙色):中线颜色
- MidWidth(默认2):中线粗细
- SlowColor(默认紫红色):慢线颜色
- SlowWidth(默认2):慢线粗细
所有周期必须大于0,否则指标会报错并停止加载。
怎么用
将代码保存为 TripleEMA.mq5,放入MT5数据文件夹的 MQL5/Indicators 目录,重启MT5或按F4打开MetaEditor编译。编译成功后,在导航器窗口的"指标"列表里找到它,拖到任意图表上。
指标会在主图(价格图表窗口)上画出三条彩色均线。观察它们的相对位置和斜率:
- 三线向上且快线在上方 = 多头趋势,可以找回调做多机会
- 三线向下且快线在下方 = 空头趋势,可以找反弹做空机会
- 三线缠绕粘合 = 震荡市,等待突破方向
建议配合K线形态(如吞没、锤子线)和支撑阻力位一起使用,不要单独依靠均线交叉信号入场。
适用场景
适合有明显趋势的品种,如黄金(XAUUSD)、主要外汇对(EURUSD、GBPUSD等)、原油、指数等。所有周期都可以用,但短周期(M1、M5)假信号较多,H1、H4、D1更可靠。
不适合:窄幅震荡行情、流动性极差的小众品种、新闻发布前后的剧烈波动时段。在这些情况下,均线会频繁交叉但价格来回拉锯,假信号成本高。
风险提示
- 滞后性:均线是基于历史价格计算的,天然滞后,趋势反转时可能已经回撤较多才产生信号
- 震荡市失效:在横盘整理阶段,均线会反复交叉产生假信号,频繁进出容易亏损
- 参数敏感:周期选择对信号质量影响很大,默认的20/49/89适合日线和4小时图,但不一定适合所有品种和周期,需要自行回测优化
- 无止损逻辑:指标只提供趋势判断,不包含止损、止盈或仓位管理,必须自行设置风控
- 单一指标局限:仅用均线容易被洗盘,建议结合成交量、RSI、MACD等其他指标或价格行为分析
代码本身不会重绘(EMA是确定性计算),但均线值会随着新K线出现而更新,历史K线上的均线值不变。
常见问题
- 这个指标会重绘吗?
- 不会。EMA是确定性计算,历史K线上的均线值确定后不会改变,只有当前K线的均线值会随着价格波动实时更新。
- 默认参数20/49/89适合什么周期?
- 代码里没有限制周期,但根据经验,这组参数在H1、H4和D1图表上效果较好,M5和M15周期建议缩小参数如10/21/50,需自行测试。
- 可以用在黄金以外的品种吗?
- 可以。代码使用当前图表品种(_Symbol)和周期(PERIOD_CURRENT),适用于MT5支持的所有品种,包括外汇、贵金属、原油、指数、加密货币等。
- 能不能只显示两条均线?
- 不能直接关闭某条线,但可以把不想看的那条均线的颜色(比如SlowColor)设置为clrNone或者和背景色相同,或者把粗细(SlowWidth)设为1并调浅颜色。
- MT4能用吗?
- 不能。这是MQL5代码,只能在MetaTrader 5平台使用。MT4需要用MQL4重写,语法和函数都不同。
Triple EMA Trend System Indicator for MT5 (EMA 20/49/89)
A customizable triple exponential moving average (EMA) indicator with default periods of 20, 49, and 89. Designed for trend identification and bullish/bearish alignment analysis across all timeframes and trending instruments.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。