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

双色趋势通道箭头指标

liuyanyuan9413·1 小时前发布

SuperTrend 风格阶梯通道,蓝线多头粉线空头,突破打箭头

双色趋势通道箭头指标

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

TrendChannelArrows.mq5227
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#property copyright   "XAUOF 指标工坊"
#property link        "https://www.xauof.com"
#property version     "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   4

// 蓝色上轨(多头线)
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#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_ARROW
#property indicator_color3  clrAqua
#property indicator_width3  2
#property indicator_label3  "买入"

// 卖出箭头
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrHotPink
#property indicator_width4  2
#property indicator_label4  "卖出"

//--- 输入参数
input int    InpATRPeriod   = 10;    // ATR 周期(推荐 10-14)
input double InpMultiplier  = 3.0;   // ATR 倍数(推荐 2.5-3.5,越大信号越少)
input int    InpArrowGap    = 50;    // 箭头与 K 线距离(点数,推荐 30-100)

//--- 指标缓冲区
double UpLineBuffer[];      // 蓝色多头线
double DnLineBuffer[];      // 粉色空头线
double BuyArrowBuffer[];    // 买入箭头
double SellArrowBuffer[];   // 卖出箭头

//--- 全局变量
int    atrHandle;           // ATR 指标句柄
double atrData[];           // ATR 数值缓冲

//+------------------------------------------------------------------+
//| 初始化函数                                                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // 创建 ATR 指标句柄
   atrHandle = iATR(_Symbol, PERIOD_CURRENT, InpATRPeriod);
   if(atrHandle == INVALID_HANDLE)
   {
      Print("ATR 指标创建失败");
      return INIT_FAILED;
   }

   // 绑定指标缓冲区
   SetIndexBuffer(0, UpLineBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, DnLineBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, BuyArrowBuffer, INDICATOR_DATA);
   SetIndexBuffer(3, SellArrowBuffer, INDICATOR_DATA);

   // 设置箭头样式
   PlotIndexSetInteger(2, PLOT_ARROW, 233);  // 买入向上箭头
   PlotIndexSetInteger(3, PLOT_ARROW, 234);  // 卖出向下箭头

   // 设置空值
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, EMPTY_VALUE);

   // 设置指标名称
   IndicatorSetString(INDICATOR_SHORTNAME, StringFormat("趋势通道(ATR:%d×%.1f)", InpATRPeriod, InpMultiplier));
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);

   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| 反初始化函数                                                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   if(atrHandle != INVALID_HANDLE)
      IndicatorRelease(atrHandle);
}

//+------------------------------------------------------------------+
//| 主计算函数                                                         |
//+------------------------------------------------------------------+
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(atrHandle) < rates_total)
      return 0;

   // 拷贝 ATR 数据
   if(CopyBuffer(atrHandle, 0, 0, rates_total, atrData) < rates_total)
      return 0;

   // 确定起始位置
   int start = (prev_calculated > InpATRPeriod) ? prev_calculated - 1 : InpATRPeriod;

   // 首次运行初始化
   if(prev_calculated == 0)
   {
      ArrayInitialize(UpLineBuffer, EMPTY_VALUE);
      ArrayInitialize(DnLineBuffer, EMPTY_VALUE);
      ArrayInitialize(BuyArrowBuffer, EMPTY_VALUE);
      ArrayInitialize(SellArrowBuffer, EMPTY_VALUE);

      // 初始化前几根为空
      for(int i = 0; i < InpATRPeriod; i++)
      {
         UpLineBuffer[i] = EMPTY_VALUE;
         DnLineBuffer[i] = EMPTY_VALUE;
      }

      // 第一根有效 K 线初始化:根据收盘价与中线关系决定初始趋势
      if(rates_total > InpATRPeriod)
      {
         double hl2 = (high[InpATRPeriod] + low[InpATRPeriod]) / 2.0;
         double atr = atrData[InpATRPeriod];
         double upBand = hl2 - InpMultiplier * atr;
         double dnBand = hl2 + InpMultiplier * atr;

         if(close[InpATRPeriod] > hl2)
         {
            // 初始多头
            UpLineBuffer[InpATRPeriod] = upBand;
            DnLineBuffer[InpATRPeriod] = EMPTY_VALUE;
         }
         else
         {
            // 初始空头
            UpLineBuffer[InpATRPeriod] = EMPTY_VALUE;
            DnLineBuffer[InpATRPeriod] = dnBand;
         }
      }

      start = InpATRPeriod + 1;
   }

   // 计算主逻辑
   for(int i = start; i < rates_total && !IsStopped(); i++)
   {
      // 先清空箭头
      BuyArrowBuffer[i] = EMPTY_VALUE;
      SellArrowBuffer[i] = EMPTY_VALUE;

      if(i < 1) continue;

      double hl2 = (high[i] + low[i]) / 2.0;
      double atr = atrData[i];

      // 计算基础上下轨
      double upBand = hl2 - InpMultiplier * atr;
      double dnBand = hl2 + InpMultiplier * atr;

      // 判断前一根趋势状态
      bool prevWasUp = (UpLineBuffer[i-1] != EMPTY_VALUE && UpLineBuffer[i-1] > 0);

      if(prevWasUp)
      {
         // 前一根是多头(蓝线)
         // 上轨只能上升不能下降(台阶效果)
         if(upBand > UpLineBuffer[i-1])
            UpLineBuffer[i] = upBand;
         else
            UpLineBuffer[i] = UpLineBuffer[i-1];

         // 检查是否跌破蓝线 → 翻空
         if(close[i] < UpLineBuffer[i])
         {
            // 翻空:启动粉线,打卖出箭头
            DnLineBuffer[i] = dnBand;
            UpLineBuffer[i] = EMPTY_VALUE;
            SellArrowBuffer[i] = high[i] + InpArrowGap * _Point;
         }
         else
         {
            // 维持多头
            DnLineBuffer[i] = EMPTY_VALUE;
         }
      }
      else
      {
         // 前一根是空头(粉线)
         // 下轨只能下降不能上升(台阶效果)
         if(dnBand < DnLineBuffer[i-1])
            DnLineBuffer[i] = dnBand;
         else
            DnLineBuffer[i] = DnLineBuffer[i-1];

         // 检查是否突破粉线 → 翻多
         if(close[i] > DnLineBuffer[i])
         {
            // 翻多:启动蓝线,打买入箭头
            UpLineBuffer[i] = upBand;
            DnLineBuffer[i] = EMPTY_VALUE;
            BuyArrowBuffer[i] = low[i] - InpArrowGap * _Point;
         }
         else
         {
            // 维持空头
            UpLineBuffer[i] = EMPTY_VALUE;
         }
      }
   }

   return rates_total;
}
//+------------------------------------------------------------------+
MT5 运行截图 · 完整视图带价格轴和时间轴的整张图表(约 150 根 H1 K 线),上面的封面是它最近 80 根 K 线的放大视图
双色趋势通道箭头指标 在 MT5 上的真实截图

作品说明

识别结果

从图上识别到:

  1. 两条阶梯线:蓝色(青色)线和粉红色线,呈现"台阶"状,像是通道上下轨或移动止损线,不是普通均线
  2. 买卖箭头:蓝色向上箭头(买入信号)出现在蓝线附近,粉红色向下箭头(卖出信号)出现在粉红线附近
  3. 逻辑推测:这是一个趋势追踪通道指标,类似 SuperTrend 或 Parabolic SAR 的变体——价格突破粉线时翻多(蓝线启动,打蓝色箭头),跌破蓝线时翻空(粉线启动,打粉色箭头),台阶效果来自"只在突破时更新、持有期间锁定"的逻辑

参数推测:ATR 周期 10,倍数 3.0(经典 SuperTrend 配置)



使用说明

安装步骤

  1. 将代码保存为 TrendChannelArrows.mq5,放入 MT5 的 MQL5\Indicators 文件夹
  2. MetaEditor 里编译(F7),无报错后关闭
  3. 回到 MT5 主界面,导航器→指标→刷新,找到"TrendChannelArrows"拖到图表上

参数调节

  • ATR 周期:默认 10。越大通道越平滑,信号越少;越小反应越灵敏,假信号多
  • ATR 倍数:默认 3.0。越大通道越宽,只抓大趋势;越小越紧贴价格,频繁翻仓
  • 箭头距离:默认 50 点,控制箭头与 K 线的垂直间距,按品种小数点调整(黄金用 50-100,外汇用 10-30)

信号解读

  • 蓝色向上箭头:价格突破粉线,趋势翻多,多头线(蓝色)启动 → 做多或平空
  • 粉色向下箭头:价格跌破蓝线,趋势翻空,空头线(粉色)启动 → 做空或平多
  • 持仓期间:多头时看蓝线作为移动止损,空头时看粉线作为移动止损

注意事项

  • 这是趋势追踪指标,震荡市会来回打脸,适合单边行情
  • 箭头只在翻转那一根 K 线出现,历史上不会每根都有
  • 建议结合更大周期趋势或关键支撑阻力过滤信号,避免逆势接飞刀

AI 解读根据源码逐行分析写成,供参考,以实际运行为准

这是什么

这是一个趋势追踪通道指标,在图表上画两条台阶状的线:蓝色(多头线)和粉色(空头线)。当价格突破粉线时翻多,打蓝色向上箭头;跌破蓝线时翻空,打粉色向下箭头。逻辑类似 SuperTrend,但视觉上更清晰,通道线在持仓期间会随趋势移动但不会回撤,形成阶梯式止损效果。

逻辑原理

指标用 ATR(平均真实波幅)来计算通道宽度。每根 K 线先算出中线(最高价+最低价)÷2,然后用中线减去 ATR×倍数得到蓝色上轨,加上 ATR×倍数得到粉色下轨。

多头状态时只显示蓝线,且蓝线只能上移不能下移(台阶效果),收盘价跌破蓝线时翻空,粉线启动并打粉色箭头。空头状态时只显示粉线,粉线只能下移不能上移,收盘价突破粉线时翻多,蓝线启动并打蓝色箭头。

初始趋势判断:第一根有效 K 线收盘价高于中线视为多头,低于中线视为空头。

参数说明

  • ATR 周期(默认 10):计算波动率的回溯周期。数值越大通道越平滑,信号越少但更可靠;越小反应越灵敏,但假信号增多。推荐 10-14。
  • ATR 倍数(默认 3.0):控制通道宽度。倍数越大通道越宽,只抓大趋势,频率低;越小越贴近价格,翻仓频繁。推荐 2.5-3.5,震荡市可调高到 4-5 减少假信号。
  • 箭头距离(默认 50):箭头与 K 线的垂直间距,单位是点(Point)。黄金等报价 5 位小数的品种用 50-100,外汇 3 位小数的用 10-30,避免箭头被 K 线盖住。

怎么用

TrendChannelArrows.mq5 放进 MT5 的 MQL5\Indicators 文件夹,MetaEditor 里编译后回到主界面,从导航器拖到图表上。适合挂在任意周期和品种的图表,黄金、外汇、指数都可以。

看信号:蓝色向上箭头出现时做多或平空,粉色向下箭头出现时做空或平多。持仓期间把蓝线(多头)或粉线(空头)当作移动止损位。箭头只在趋势翻转那根 K 线出现,不是每根都有。

适用场景

适合单边趋势行情,特别是突破关键位后的延续阶段,或者消息面驱动的定向行情。推荐在 H1 和 H4 周期使用,日线也可以抓大波段。黄金、原油、主要外汇对表现较稳定。

不适合震荡市和窄幅整理,横盘时会频繁打脸来回翻仓。也不适合波动极小的冷门品种,ATR 太小会导致通道过窄。建议结合更大周期趋势方向过滤,或者在关键支撑阻力附近再入场。

风险提示

  1. 滞后性:箭头是收盘价突破后才出现,可能已经跑了一段,不是抄底摸顶工具。
  2. 震荡市陷阱:横盘时会反复翻转,连续止损。可以提高 ATR 倍数或结合更大周期过滤。
  3. 不会重绘:箭头和通道线历史上不会改变位置,但这也意味着错的信号会保留在图上。
  4. 止损距离大:ATR×3.0 的通道比较宽,单笔止损可能较大,注意仓位管理。
  5. 初始判断依赖首根 K 线:如果刚加载指标时正好在趋势中段,初始方向可能需要一次翻转才准确。

常见问题

这个指标会重绘吗
不会。箭头和通道线一旦画出就不会改变位置,历史信号是真实的翻转记录。
可以用在黄金以外的品种吗
可以。代码没有品种限制,外汇、原油、指数都能用,但需要根据品种调整箭头距离参数(外汇用 10-30,黄金用 50-100)。
默认参数适合什么周期
ATR 周期 10、倍数 3.0 适合 H1 到 H4 周期的趋势行情。更小周期(M15/M5)建议把倍数调到 3.5-4.0 减少假信号,日线可以降到 2.5 增加灵敏度。
震荡市能用吗
不建议。横盘时会来回打箭头频繁翻仓,最好等突破或者结合更大周期趋势方向只做顺势单。
箭头出现后还能进场吗
可以,但要快。箭头是收盘价突破后才打,可能已经跑了几十点。建议等回踩通道线时加仓,或者在更小周期等回调入场。

Dual-Color Trend Channel with Arrows for MT5

A SuperTrend-style indicator that plots stepped channel lines (aqua for uptrend, pink for downtrend) and displays arrows when price breaks through, providing clear trend-following signals with trailing stop levels based on ATR.

Source code is shown above. Compiled EX5 files are available to VIP members.

评论

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

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