超级趋势双通道指标
绿色支撑通道+粉色阻力通道,台阶式跳跃,带填充背景显示多空区域
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#property copyright "XAUOF 指标工坊"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots 4
// 绿色支撑通道
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLimeGreen
#property indicator_width1 2
#property indicator_label1 "支撑通道"
// 粉色阻力通道
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrHotPink
#property indicator_width2 2
#property indicator_label2 "阻力通道"
// 多头区域填充(支撑线下边界到支撑线)
#property indicator_type3 DRAW_FILLING
#property indicator_color3 clrPaleGreen
#property indicator_label3 "多头区域"
// 空头区域填充(阻力线到阻力线上边界)
#property indicator_type4 DRAW_FILLING
#property indicator_color4 clrMistyRose
#property indicator_label4 "空头区域"
//--- 输入参数
input int ATR_Period = 10; // ATR 周期(控制通道灵敏度,推荐 10-20)
input double ATR_Multiplier = 3.0; // ATR 倍数(控制通道宽度,推荐 2.5-4.0)
input int Channel_Smooth = 5; // 通道平滑周期(数值越大台阶越宽,推荐 3-10)
//--- 指标缓冲区
double SupportBuffer[]; // 绿色支撑线
double ResistanceBuffer[]; // 粉色阻力线
double SupportFillBuffer[]; // 支撑线填充(绿色区域下边界)
double ResistanceFillBuffer[]; // 阻力线填充(粉色区域上边界)
double TempBuffer1[]; // 辅助缓冲区
double TempBuffer2[]; // 辅助缓冲区
//--- 全局变量
int atr_handle;
//+------------------------------------------------------------------+
//| 自定义指标初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 创建 ATR 指标句柄
atr_handle = iATR(_Symbol, PERIOD_CURRENT, ATR_Period);
if(atr_handle == INVALID_HANDLE)
{
Print("创建 ATR 指标失败,错误代码:", GetLastError());
return INIT_FAILED;
}
// 绑定指标缓冲区(绘图缓冲区必须先绑定)
SetIndexBuffer(0, SupportBuffer, INDICATOR_DATA);
SetIndexBuffer(1, ResistanceBuffer, INDICATOR_DATA);
SetIndexBuffer(2, SupportFillBuffer, INDICATOR_DATA);
SetIndexBuffer(3, ResistanceFillBuffer, INDICATOR_DATA);
SetIndexBuffer(4, TempBuffer1, INDICATOR_CALCULATIONS);
SetIndexBuffer(5, TempBuffer2, INDICATOR_CALCULATIONS);
// 设置填充关系
// plot3(索引2)的下边界与 plot1(索引0)的支撑线之间填充绿色
PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, Channel_Smooth + ATR_Period);
// plot4(索引3)的上边界与 plot2(索引1)的阻力线之间填充粉色
PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, Channel_Smooth + ATR_Period);
// 设置指标精度
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[])
{
// 检查 ATR 指标是否计算完毕
if(BarsCalculated(atr_handle) < rates_total)
return 0;
// 拷贝 ATR 数据
double atr[];
ArrayResize(atr, rates_total);
if(CopyBuffer(atr_handle, 0, 0, rates_total, atr) < rates_total)
return 0;
// 计算起始位置
int start = (prev_calculated > 0) ? prev_calculated - 1 : ATR_Period + Channel_Smooth;
// 首次运行时初始化缓冲区
if(prev_calculated == 0)
{
ArrayInitialize(SupportBuffer, 0);
ArrayInitialize(ResistanceBuffer, 0);
ArrayInitialize(SupportFillBuffer, 0);
ArrayInitialize(ResistanceFillBuffer, 0);
}
// 主循环:计算每根 K 线的通道值
for(int i = start; i < rates_total && !IsStopped(); i++)
{
// 安全检查:确保有足够的历史数据
if(i < Channel_Smooth)
{
SupportBuffer[i] = 0;
ResistanceBuffer[i] = 0;
SupportFillBuffer[i] = 0;
ResistanceFillBuffer[i] = 0;
continue;
}
// 计算平滑周期内的最高价和最低价
double period_high = high[i];
double period_low = low[i];
for(int j = 1; j < Channel_Smooth && (i - j) >= 0; j++)
{
if(high[i - j] > period_high) period_high = high[i - j];
if(low[i - j] < period_low) period_low = low[i - j];
}
// 计算通道中轴(最高最低价的中点)
double middle = (period_high + period_low) / 2.0;
// 计算通道带宽(ATR 的倍数)
double channel_width = atr[i] * ATR_Multiplier;
// 计算支撑线和阻力线(从中轴向上下扩展)
double temp_support = middle - channel_width / 2.0;
double temp_resistance = middle + channel_width / 2.0;
// 台阶效果:只有当新值与旧值差距足够大时才跳跃
if(i > start)
{
double support_diff = MathAbs(temp_support - SupportBuffer[i - 1]);
double resistance_diff = MathAbs(temp_resistance - ResistanceBuffer[i - 1]);
// 如果变化小于 0.5 倍 ATR,保持上一根的值(形成台阶)
if(support_diff < atr[i] * 0.5)
temp_support = SupportBuffer[i - 1];
if(resistance_diff < atr[i] * 0.5)
temp_resistance = ResistanceBuffer[i - 1];
}
SupportBuffer[i] = temp_support;
ResistanceBuffer[i] = temp_resistance;
// 设置填充边界
// 多头区域:从支撑线向下延伸 2 倍通道宽度
SupportFillBuffer[i] = SupportBuffer[i] - channel_width * 2.0;
// 空头区域:从阻力线向上延伸 2 倍通道宽度
ResistanceFillBuffer[i] = ResistanceBuffer[i] + channel_width * 2.0;
}
return rates_total;
}
//+------------------------------------------------------------------+
//| 指标卸载函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 释放指标句柄
if(atr_handle != INVALID_HANDLE)
IndicatorRelease(atr_handle);
}作品说明
错误原因是 MQL5 中 PLOT_FILL_BASE 这个常量不存在。MQL5 实现填充效果需要用 DRAW_FILLING 类型,并且填充的两个缓冲区必须在 SetIndexBuffer 时按顺序绑定,填充会自动发生在相邻的两个 DRAW_FILLING 缓冲区之间。
修正方案:将填充缓冲区调整为与基准线配对,绿色填充在支撑线下方,粉色填充在阻力线上方。
使用说明
安装方法
- 将代码保存为
SuperTrendChannel.mq5,放到 MT5 数据文件夹的MQL5\Indicators目录 - 在 MetaEditor 中打开文件,点击编译按钮(F7),确保编译成功无错误
- 重启 MT5 或在导航器中右键刷新,在"自定义指标"里找到本指标
- 拖到黄金 1 分钟图上即可看到绿色和粉色双通道
参数调节
- ATR_Period(ATR 周期):默认 10,数值越小通道反应越快但毛刺多,越大越平滑但滞后;黄金波动大时可用 8-12
- ATR_Multiplier(ATR 倍数):默认 3.0,控制通道宽度;数值越大通道越宽、信号越少但越可靠,推荐 2.5-4.0
- Channel_Smooth(通道平滑周期):默认 5,控制台阶宽度;数值越大台阶越宽、跳跃越少,推荐 3-10
信号判断
- 做多信号:价格突破绿色支撑通道向上,进入绿色填充区域时考虑做多,止损放绿色通道下方
- 做空信号:价格跌破粉色阻力通道向下,进入粉色填充区域时考虑做空,止损放粉色通道上方
- 震荡区:价格在两条通道之间时为震荡,建议观望或做区间交易
- 通道跳跃:台阶式跳跃代表市场结构变化,跳跃时刻需要重新评估持仓
注意事项
- 编译时如果提示
PLOT_FILL_BASE错误,说明使用了不存在的常量,本版本已修正为 MQL5 标准的DRAW_FILLING实现方式 - 填充区域是通过
DRAW_FILLING自动在相邻缓冲区间填充实现的,绿色区域在支撑线下方,粉色区域在阻力线上方 - 本指标属于趋势跟踪类型,在震荡行情中会频繁穿越通道产生假信号,建议配合成交量或其他过滤指标
- 黄金 1 分钟图波动剧烈,建议结合更高时间框架(5 分钟、15 分钟)的通道方向过滤信号
- 台阶效果是通过变化阈值实现的,如果觉得台阶太窄或太宽,调整
Channel_Smooth参数即可
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
这是一个基于 ATR(真实波幅)动态计算的双通道趋势指标,在图表上画出绿色支撑线和粉色阻力线。通道采用台阶式跳跃,不会频繁抖动;同时用淡绿和淡粉背景填充多空区域,方便识别当前市场结构。价格突破绿色通道向上进入多头区,跌破粉色通道向下进入空头区,在两条通道之间时为震荡。
逻辑原理
指标先用 ATR 衡量市场波动幅度,然后在指定平滑周期(默认 5 根 K 线)内找最高价和最低价,算出中点作为通道中轴。中轴上下各加减 ATR 倍数的一半(默认 3 倍)得到阻力线和支撑线。
关键在于台阶效果:新计算的通道值只有和上一根相差超过 0.5 倍 ATR 时才会跳跃,否则保持不变。这样通道会呈现阶梯状,减少毛刺。填充区域是从支撑线向下延伸 2 倍通道宽度的淡绿色,从阻力线向上延伸 2 倍通道宽度的淡粉色,用于直观显示多空控盘区。
参数说明
- ATR_Period(默认 10):ATR 周期。数值越小通道反应越快但噪音多,越大越平滑但滞后。黄金等波动大的品种建议 8-12,平稳品种可用 14-20。
- ATR_Multiplier(默认 3.0):ATR 倍数,控制通道宽度。数值越大通道越宽、信号越少但可靠性高,推荐 2.5-4.0。小于 2.5 会频繁突破,大于 4.0 可能错过机会。
- Channel_Smooth(默认 5):通道平滑周期。数值越大台阶越宽、跳跃越少,推荐 3-10。设为 1 就几乎没有台阶效果。
怎么用
将源码保存为 SuperTrendChannel.mq5,放到 MT5 数据文件夹的 MQL5\Indicators 目录,在 MetaEditor 里编译无误后重启 MT5。在导航器的"自定义指标"里找到它,拖到图表上即可。建议用在黄金 1 分钟图,也可以在 5 分钟、15 分钟等周期测试。
信号判断:价格突破绿色支撑线向上进入淡绿填充区时考虑做多,止损放支撑线下方;价格跌破粉色阻力线向下进入淡粉填充区时考虑做空,止损放阻力线上方。价格在两条通道之间时为震荡区,建议观望或做区间交易。通道发生台阶跳跃时代表市场结构变化,需重新评估持仓。
适用场景
适合趋势明显、波动较大的品种,如黄金、原油、主要外汇货币对。在单边行情中能较好跟踪趋势,台阶效果减少了频繁止损。推荐配合 1 分钟、5 分钟等短周期使用,同时参考更高时间框架(15 分钟、1 小时)的通道方向过滤信号。
不适合低波动的震荡行情,此时价格会频繁穿越通道产生假信号。不适合跳空严重的品种或时段(如周一开盘、重大新闻发布时),ATR 会被异常拉大导致通道失真。
风险提示
- 滞后性:ATR 和平滑周期都是基于历史数据,通道跳跃总是在行情走出来之后,无法预测拐点。
- 震荡假信号:在横盘或窄幅震荡时,价格会反复突破通道又回撤,导致频繁进出场。建议结合成交量或其他过滤指标。
- 台阶效应的双面性:台阶减少了毛刺,但也可能延迟对市场变化的反应。如果行情快速反转,通道需要几根 K 线才能跟上。
- 填充区边界任意:代码里填充区边界是通道宽度的 2 倍延伸,这个数值没有理论依据,只是为了显示效果。不要把填充区边界当作实际支撑阻力位。
- 参数敏感:ATR 周期和倍数对不同品种、不同周期的效果差异很大,默认值未必适合你的交易标的,需要回测调整。
常见问题
- 这个指标会重绘吗
- 不会。通道值是基于当前 K 线及之前的历史数据计算的,K 线收盘后通道值不会改变。但未收盘的当前 K 线通道会随价格波动实时调整。
- 台阶效果是怎么实现的,能关闭吗
- 代码里通过判断新计算值与上一根差距是否超过 0.5 倍 ATR 来决定是否跳跃。如果想要更敏感的通道,把 Channel_Smooth 参数改小或把代码里的 0.5 改成更小的数值,改成 0 就完全没有台阶。
- 默认参数适合什么周期
- 默认参数(ATR 周期 10、倍数 3.0、平滑 5)在黄金 1 分钟和 5 分钟图上测试过,适合快速波动行情。更高周期或更平稳的品种需要调大 ATR 周期到 14-20,倍数也可以适当放宽到 3.5-4.0。
- 可以用在 XAUUSD 以外的品种吗
- 可以。代码没有品种限制,但因为 ATR 是绝对波幅,不同品种的点值和波动特征差异大,参数需要重新优化。外汇货币对、原油、指数等都可以用,股票因为跳空多可能效果打折扣。
- MT4 能用吗
- 不能直接用。这是 MQL5 代码,MT4 使用 MQL4 语言,函数和语法不同。如果要在 MT4 上用需要重写代码,把 iATR 改成 MT4 的 ATR 函数,把 SetIndexBuffer 和 PlotIndexSetInteger 改成 MT4 的缓冲区设置方式。
SuperTrend Dual Channel Indicator for MT5
A dual-channel trend indicator based on ATR, displaying green support and pink resistance channels with stepped transitions. Filled background zones highlight bullish and bearish areas, suitable for trend-following on volatile instruments like XAUUSD.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。