双色趋势通道箭头指标
SuperTrend 风格阶梯通道,蓝线多头粉线空头,突破打箭头
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
#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;
}
//+------------------------------------------------------------------+作品说明
识别结果
从图上识别到:
- 两条阶梯线:蓝色(青色)线和粉红色线,呈现"台阶"状,像是通道上下轨或移动止损线,不是普通均线
- 买卖箭头:蓝色向上箭头(买入信号)出现在蓝线附近,粉红色向下箭头(卖出信号)出现在粉红线附近
- 逻辑推测:这是一个趋势追踪通道指标,类似 SuperTrend 或 Parabolic SAR 的变体——价格突破粉线时翻多(蓝线启动,打蓝色箭头),跌破蓝线时翻空(粉线启动,打粉色箭头),台阶效果来自"只在突破时更新、持有期间锁定"的逻辑
参数推测:ATR 周期 10,倍数 3.0(经典 SuperTrend 配置)
使用说明
安装步骤
- 将代码保存为
TrendChannelArrows.mq5,放入 MT5 的MQL5\Indicators文件夹 - MetaEditor 里编译(F7),无报错后关闭
- 回到 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 太小会导致通道过窄。建议结合更大周期趋势方向过滤,或者在关键支撑阻力附近再入场。
风险提示
- 滞后性:箭头是收盘价突破后才出现,可能已经跑了一段,不是抄底摸顶工具。
- 震荡市陷阱:横盘时会反复翻转,连续止损。可以提高 ATR 倍数或结合更大周期过滤。
- 不会重绘:箭头和通道线历史上不会改变位置,但这也意味着错的信号会保留在图上。
- 止损距离大:ATR×3.0 的通道比较宽,单笔止损可能较大,注意仓位管理。
- 初始判断依赖首根 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.
评论
还没有人评论,来抢个沙发。