MT5指标编译通过 · EX5 12KB 自动发布 2 0

超级趋势双通道指标

kau100·2 小时前发布

绿色支撑通道+粉色阻力通道,台阶式跳跃,带填充背景显示多空区域

超级趋势双通道指标

MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子

SuperTrendChannel.mq5183
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#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);
}
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
超级趋势双通道指标 在 MT5 上的真实截图

作品说明

错误原因是 MQL5 中 PLOT_FILL_BASE 这个常量不存在。MQL5 实现填充效果需要用 DRAW_FILLING 类型,并且填充的两个缓冲区必须在 SetIndexBuffer 时按顺序绑定,填充会自动发生在相邻的两个 DRAW_FILLING 缓冲区之间。

修正方案:将填充缓冲区调整为与基准线配对,绿色填充在支撑线下方,粉色填充在阻力线上方。

使用说明

安装方法

  1. 将代码保存为 SuperTrendChannel.mq5,放到 MT5 数据文件夹的 MQL5\Indicators 目录
  2. 在 MetaEditor 中打开文件,点击编译按钮(F7),确保编译成功无错误
  3. 重启 MT5 或在导航器中右键刷新,在"自定义指标"里找到本指标
  4. 拖到黄金 1 分钟图上即可看到绿色和粉色双通道

参数调节

  • ATR_Period(ATR 周期):默认 10,数值越小通道反应越快但毛刺多,越大越平滑但滞后;黄金波动大时可用 8-12
  • ATR_Multiplier(ATR 倍数):默认 3.0,控制通道宽度;数值越大通道越宽、信号越少但越可靠,推荐 2.5-4.0
  • Channel_Smooth(通道平滑周期):默认 5,控制台阶宽度;数值越大台阶越宽、跳跃越少,推荐 3-10

信号判断

  • 做多信号:价格突破绿色支撑通道向上,进入绿色填充区域时考虑做多,止损放绿色通道下方
  • 做空信号:价格跌破粉色阻力通道向下,进入粉色填充区域时考虑做空,止损放粉色通道上方
  • 震荡区:价格在两条通道之间时为震荡,建议观望或做区间交易
  • 通道跳跃:台阶式跳跃代表市场结构变化,跳跃时刻需要重新评估持仓

注意事项

  1. 编译时如果提示 PLOT_FILL_BASE 错误,说明使用了不存在的常量,本版本已修正为 MQL5 标准的 DRAW_FILLING 实现方式
  2. 填充区域是通过 DRAW_FILLING 自动在相邻缓冲区间填充实现的,绿色区域在支撑线下方,粉色区域在阻力线上方
  3. 本指标属于趋势跟踪类型,在震荡行情中会频繁穿越通道产生假信号,建议配合成交量或其他过滤指标
  4. 黄金 1 分钟图波动剧烈,建议结合更高时间框架(5 分钟、15 分钟)的通道方向过滤信号
  5. 台阶效果是通过变化阈值实现的,如果觉得台阶太窄或太宽,调整 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 会被异常拉大导致通道失真。

风险提示

  1. 滞后性:ATR 和平滑周期都是基于历史数据,通道跳跃总是在行情走出来之后,无法预测拐点。
  2. 震荡假信号:在横盘或窄幅震荡时,价格会反复突破通道又回撤,导致频繁进出场。建议结合成交量或其他过滤指标。
  3. 台阶效应的双面性:台阶减少了毛刺,但也可能延迟对市场变化的反应。如果行情快速反转,通道需要几根 K 线才能跟上。
  4. 填充区边界任意:代码里填充区边界是通道宽度的 2 倍延伸,这个数值没有理论依据,只是为了显示效果。不要把填充区边界当作实际支撑阻力位。
  5. 参数敏感: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.

评论

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

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