HalfTrend 半趋势通道箭头指标
蓝红双色半趋势线配ATR波动带,趋势反转那一根K线给出箭头并提醒。
MT5 真机运行截图 · 服务器把编译好的 EX5 挂到黄金 H1 图表上截的,你装上去看到的就是这个样子
//+------------------------------------------------------------------+
//| HalfTrend_MT5.mq5|
//| MT4 版 HalfTrend 的 MQL5 完整移植版 |
//+------------------------------------------------------------------+
#property copyright "XAUOF 指标工坊"
#property link "https://www.xauof.com"
#property version "1.00"
#property description "HalfTrend 半趋势线:趋势线变色 + ATR 波动带 + 反转箭头 + 信号提醒"
#property indicator_chart_window
#property indicator_buffers 15
#property indicator_plots 6
//--- 1号图形:上涨趋势线(蓝色粗线)
#property indicator_label1 "HalfTrend上涨线"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- 2号图形:下跌趋势线(红色粗线)
#property indicator_label2 "HalfTrend下跌线"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2
//--- 3号图形:上涨波动带(蓝色色带,画在趋势线下方 1 倍半ATR区间)
#property indicator_label3 "上涨带上沿;上涨带下沿"
#property indicator_type3 DRAW_HISTOGRAM2
#property indicator_color3 clrDodgerBlue
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//--- 4号图形:下跌波动带(红色色带,画在趋势线上方)
#property indicator_label4 "下跌带上沿;下跌带下沿"
#property indicator_type4 DRAW_HISTOGRAM2
#property indicator_color4 clrRed
#property indicator_style4 STYLE_SOLID
#property indicator_width4 1
//--- 5号图形:买入箭头
#property indicator_label5 "买入箭头"
#property indicator_type5 DRAW_ARROW
#property indicator_color5 clrDodgerBlue
#property indicator_width5 3
//--- 6号图形:卖出箭头
#property indicator_label6 "卖出箭头"
#property indicator_type6 DRAW_ARROW
#property indicator_color6 clrRed
#property indicator_width6 3
//+------------------------------------------------------------------+
//| 输入参数 |
//+------------------------------------------------------------------+
input int InpAmplitude = 2; // 半趋势灵敏度(原Amplitude,越大越慢,推荐2-6)
input int InpAtrPeriod = 100; // ATR周期(决定色带厚度和箭头距离,推荐100)
input bool InpShowBands = true; // 是否显示ATR波动色带
input bool InpShowArrows = true; // 是否显示反转箭头
input bool InpAlertsOn = true; // 信号提醒总开关
input bool InpAlertsOnCurrent = false; // true=当前K线就提醒(可能重画);false=等K线收盘(推荐)
input bool InpAlertsMessage = true; // 是否弹窗提醒
input bool InpAlertsSound = true; // 是否声音提醒
input bool InpAlertsEmail = false; // 是否邮件提醒(需先在终端配置邮箱)
//+------------------------------------------------------------------+
//| 指标缓冲区 |
//+------------------------------------------------------------------+
double UpLine[]; // 0 上涨趋势线
double DnLine[]; // 1 下跌趋势线
double UpBandHi[]; // 2 上涨色带上沿
double UpBandLo[]; // 3 上涨色带下沿
double DnBandHi[]; // 4 下跌色带上沿
double DnBandLo[]; // 5 下跌色带下沿
double ArrUp[]; // 6 买入箭头
double ArrDn[]; // 7 卖出箭头
//--- 下面是不绘图的中间缓冲区:保存每根K线算完时的内部状态,
//--- 这样新Tick只需要重算最后两根K线,不必每次从头跑一遍。
double TrendState[]; // 8 0=上涨 1=下跌
double NextTrendState[]; // 9 0=等待转多 1=等待转空
double MinHighState[]; // 10 阶段最低的高点
double MaxLowState[]; // 11 阶段最高的低点
double AtrBuf[]; // 12 ATR数值
double LowMaBuf[]; // 13 最低价均线
double HighMaBuf[]; // 14 最高价均线
//+------------------------------------------------------------------+
//| 全局变量 |
//+------------------------------------------------------------------+
int g_amplitude = 2; // 实际使用的灵敏度
int g_atrPeriod = 100; // 实际使用的ATR周期
int g_firstBar = 2; // 第一根可以参与计算的K线序号
int g_atrHandle = INVALID_HANDLE; // ATR 指标句柄
int g_lowMaHandle = INVALID_HANDLE; // 最低价SMA句柄
int g_highMaHandle = INVALID_HANDLE; // 最高价SMA句柄
//+------------------------------------------------------------------+
//| 初始化 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 参数合法性检查
if(InpAmplitude < 1)
{
Print("HalfTrend 参数错误:灵敏度 InpAmplitude 必须大于或等于 1");
return(INIT_PARAMETERS_INCORRECT);
}
if(InpAtrPeriod < 1)
{
Print("HalfTrend 参数错误:ATR周期 InpAtrPeriod 必须大于或等于 1");
return(INIT_PARAMETERS_INCORRECT);
}
g_amplitude = InpAmplitude;
g_atrPeriod = InpAtrPeriod;
//--- 需要足够的历史:均线要 amplitude 根,ATR 要 atrPeriod 根,再留 1 根给“前一根”引用
g_firstBar = MathMax(g_amplitude, g_atrPeriod) + 1;
//--- 绑定缓冲区(注意:绝不调用 ArraySetAsSeries,索引 0 永远是最老的K线)
SetIndexBuffer(0, UpLine, INDICATOR_DATA);
SetIndexBuffer(1, DnLine, INDICATOR_DATA);
SetIndexBuffer(2, UpBandHi, INDICATOR_DATA);
SetIndexBuffer(3, UpBandLo, INDICATOR_DATA);
SetIndexBuffer(4, DnBandHi, INDICATOR_DATA);
SetIndexBuffer(5, DnBandLo, INDICATOR_DATA);
SetIndexBuffer(6, ArrUp, INDICATOR_DATA);
SetIndexBuffer(7, ArrDn, INDICATOR_DATA);
SetIndexBuffer(8, TrendState, INDICATOR_CALCULATIONS);
SetIndexBuffer(9, NextTrendState, INDICATOR_CALCULATIONS);
SetIndexBuffer(10, MinHighState, INDICATOR_CALCULATIONS);
SetIndexBuffer(11, MaxLowState, INDICATOR_CALCULATIONS);
SetIndexBuffer(12, AtrBuf, INDICATOR_CALCULATIONS);
SetIndexBuffer(13, LowMaBuf, INDICATOR_CALCULATIONS);
SetIndexBuffer(14, HighMaBuf, INDICATOR_CALCULATIONS);
//--- 空值统一用 EMPTY_VALUE,没有信号的K线不画任何东西
for(int p = 0; p < 6; p++)
{
PlotIndexSetDouble(p, PLOT_EMPTY_VALUE, EMPTY_VALUE);
PlotIndexSetInteger(p, PLOT_DRAW_BEGIN, g_firstBar);
}
//--- 箭头代码:233 向上箭头、234 向下箭头
PlotIndexSetInteger(4, PLOT_ARROW, 233);
PlotIndexSetInteger(5, PLOT_ARROW, 234);
PlotIndexSetInteger(4, PLOT_ARROW_SHIFT, 0);
PlotIndexSetInteger(5, PLOT_ARROW_SHIFT, 0);
//--- 开关控制显示
if(!InpShowBands)
{
PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_NONE);
PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_NONE);
}
if(!InpShowArrows)
{
PlotIndexSetInteger(4, PLOT_DRAW_TYPE, DRAW_NONE);
PlotIndexSetInteger(5, PLOT_DRAW_TYPE, DRAW_NONE);
}
//--- MQL5 的 iATR / iMA 返回的是“句柄”,必须在这里创建一次并长期保存
g_atrHandle = iATR(_Symbol, PERIOD_CURRENT, g_atrPeriod);
g_lowMaHandle = iMA(_Symbol, PERIOD_CURRENT, g_amplitude, 0, MODE_SMA, PRICE_LOW);
g_highMaHandle = iMA(_Symbol, PERIOD_CURRENT, g_amplitude, 0, MODE_SMA, PRICE_HIGH);
if(g_atrHandle == INVALID_HANDLE || g_lowMaHandle == INVALID_HANDLE || g_highMaHandle == INVALID_HANDLE)
{
Print("HalfTrend 初始化失败:无法创建 ATR 或均线句柄,错误代码 ", GetLastError());
return(INIT_FAILED);
}
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
IndicatorSetString(INDICATOR_SHORTNAME,
"HalfTrend MT5 (" + IntegerToString(g_amplitude) + "," + IntegerToString(g_atrPeriod) + ")");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 卸载时释放句柄 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
if(g_atrHandle != INVALID_HANDLE) IndicatorRelease(g_atrHandle);
if(g_lowMaHandle != INVALID_HANDLE) IndicatorRelease(g_lowMaHandle);
if(g_highMaHandle != INVALID_HANDLE) IndicatorRelease(g_highMaHandle);
}
//+------------------------------------------------------------------+
//| 主计算函数 |
//+------------------------------------------------------------------+
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[])
{
//--- 历史不够就什么都不画,避免越界
if(rates_total < g_firstBar + 2)
return(0);
//--- 等 ATR 和两条均线都算完,否则这一轮直接退出,下个Tick再来
if(BarsCalculated(g_atrHandle) < rates_total) return(0);
if(BarsCalculated(g_lowMaHandle) < rates_total) return(0);
if(BarsCalculated(g_highMaHandle) < rates_total) return(0);
//--- 把句柄里的数值拷进本地缓冲区(拷进非时间序列数组,索引0=最老K线)
if(CopyBuffer(g_atrHandle, 0, 0, rates_total, AtrBuf) < rates_total) return(0);
if(CopyBuffer(g_lowMaHandle, 0, 0, rates_total, LowMaBuf) < rates_total) return(0);
if(CopyBuffer(g_highMaHandle, 0, 0, rates_total, HighMaBuf) < rates_total) return(0);
int start = 0;
if(prev_calculated <= 0 || prev_calculated > rates_total)
{
//--- 第一次加载或历史被刷新:全部清空后重建“种子”K线
ArrayInitialize(UpLine, EMPTY_VALUE);
ArrayInitialize(DnLine, EMPTY_VALUE);
ArrayInitialize(UpBandHi, EMPTY_VALUE);
ArrayInitialize(UpBandLo, EMPTY_VALUE);
ArrayInitialize(DnBandHi, EMPTY_VALUE);
ArrayInitialize(DnBandLo, EMPTY_VALUE);
ArrayInitialize(ArrUp, EMPTY_VALUE);
ArrayInitialize(ArrDn, EMPTY_VALUE);
ArrayInitialize(TrendState, 0.0);
ArrayInitialize(NextTrendState, 0.0);
ArrayInitialize(MinHighState, 0.0);
ArrayInitialize(MaxLowState, 0.0);
//--- 循环里第一根要读 i-1,所以先手工填好 g_firstBar-1 这根“种子”K线
int seed = g_firstBar - 1;
double seedAtr = (AtrBuf[seed] > 0.0) ? AtrBuf[seed] * 0.5 : (high[seed] - low[seed]) * 0.5;
if(seedAtr <= 0.0) seedAtr = 10 * _Point;
TrendState[seed] = 0.0; // 从上涨状态起步
NextTrendState[seed] = 0.0;
MinHighState[seed] = high[seed];
MaxLowState[seed] = low[seed];
UpLine[seed] = low[seed];
DnLine[seed] = EMPTY_VALUE;
UpBandHi[seed] = UpLine[seed];
UpBandLo[seed] = UpLine[seed] - seedAtr;
start = g_firstBar;
}
else
{
//--- 正常Tick:只回算最后两根,既省CPU,反转连接点也不会错位
start = prev_calculated - 2;
if(start < g_firstBar) start = g_firstBar;
}
//==================================================================
// 主循环:索引递增,i-1 就是前一根K线
//==================================================================
for(int i = start; i < rates_total && !IsStopped(); i++)
{
//--- 先把本根K线的箭头清空,只有真正反转的那一根才会被赋值
ArrUp[i] = EMPTY_VALUE;
ArrDn[i] = EMPTY_VALUE;
//--- 最近 amplitude 根(含当前根)的最低价与最高价
double lowprice = low[i];
double highprice = high[i];
for(int k = i - g_amplitude + 1; k <= i; k++)
{
if(k < 0 || k >= rates_total) continue; // 索引保护
if(low[k] < lowprice) lowprice = low[k];
if(high[k] > highprice) highprice = high[k];
}
//--- 最低价均线、最高价均线、半个ATR
double lowma = NormalizeDouble(LowMaBuf[i], _Digits);
double highma = NormalizeDouble(HighMaBuf[i], _Digits);
double atr = AtrBuf[i] * 0.5;
if(atr <= 0.0) atr = (high[i] - low[i]) * 0.5; // 兜底,防止色带和箭头贴在线上
if(atr <= 0.0) atr = 10 * _Point;
//--- 取出前一根K线算完时留下的内部状态
bool nexttrend = (NextTrendState[i-1] > 0.5);
double minhighprice = MinHighState[i-1];
double maxlowprice = MaxLowState[i-1];
if(minhighprice <= 0.0) minhighprice = high[i-1];
if(maxlowprice <= 0.0) maxlowprice = low[i-1];
TrendState[i] = TrendState[i-1]; // 默认延续前一根的趋势方向
//--- 状态机第一段:正在等待“转为下跌”
// 把阶段内最高的低点往上抬,一旦最高价均线跌破它、且收盘跌破前一根最低价 → 转空
if(nexttrend)
{
maxlowprice = MathMax(lowprice, maxlowprice);
if(highma < maxlowprice && close[i] < low[i-1])
{
TrendState[i] = 1.0; // 1 = 下跌
nexttrend = false;
minhighprice = highprice;
}
}
//--- 状态机第二段:正在等待“转为上涨”
// 把阶段内最低的高点往下压,一旦最低价均线站上它、且收盘突破前一根最高价 → 转多
if(!nexttrend)
{
minhighprice = MathMin(highprice, minhighprice);
if(lowma > minhighprice && close[i] > high[i-1])
{
TrendState[i] = 0.0; // 0 = 上涨
nexttrend = true;
maxlowprice = lowprice;
}
}
if(TrendState[i] < 0.5)
{
//================= 上涨:画蓝线 =================
if(TrendState[i-1] > 0.5)
{
//--- 刚刚由跌转涨:蓝线从红线的位置接上,保证两条线视觉上连续
double joint = DnLine[i-1];
if(joint == EMPTY_VALUE || joint <= 0.0) joint = maxlowprice;
UpLine[i] = joint;
UpLine[i-1] = UpLine[i];
//--- 只在反转这一根K线下方画买入箭头
ArrUp[i] = UpLine[i] - 2.0 * atr;
}
else
{
//--- 趋势延续:蓝线只允许抬高,不允许回落(跟踪止损式支撑)
double prevUp = UpLine[i-1];
if(prevUp == EMPTY_VALUE || prevUp <= 0.0) prevUp = maxlowprice;
UpLine[i] = MathMax(maxlowprice, prevUp);
}
UpBandHi[i] = UpLine[i]; // 蓝色色带:趋势线 → 趋势线-ATR/2
UpBandLo[i] = UpLine[i] - atr;
DnLine[i] = EMPTY_VALUE;
DnBandHi[i] = EMPTY_VALUE;
DnBandLo[i] = EMPTY_VALUE;
}
else
{
//================= 下跌:画红线 =================
if(TrendState[i-1] < 0.5)
{
//--- 刚刚由涨转跌:红线从蓝线的位置接上
double joint = UpLine[i-1];
if(joint == EMPTY_VALUE || joint <= 0.0) joint = minhighprice;
DnLine[i] = joint;
DnLine[i-1] = DnLine[i];
//--- 只在反转这一根K线上方画卖出箭头
ArrDn[i] = DnLine[i] + 2.0 * atr;
}
else
{
//--- 趋势延续:红线只允许压低,不允许回升(跟踪式压力)
double prevDn = DnLine[i-1];
if(prevDn == EMPTY_VALUE || prevDn <= 0.0) prevDn = minhighprice;
DnLine[i] = MathMin(minhighprice, prevDn);
}
DnBandHi[i] = DnLine[i] + atr; // 红色色带:趋势线 → 趋势线+ATR/2
DnBandLo[i] = DnLine[i];
UpLine[i] = EMPTY_VALUE;
UpBandHi[i] = EMPTY_VALUE;
UpBandLo[i] = EMPTY_VALUE;
}
//--- 把本根算完的状态存起来,供下一根K线使用
NextTrendState[i] = (nexttrend ? 1.0 : 0.0);
MinHighState[i] = minhighprice;
MaxLowState[i] = maxlowprice;
}
//--- 处理提醒
ManageAlerts(time, rates_total);
return(rates_total);
}
//+------------------------------------------------------------------+
//| 检查最新信号并触发提醒 |
//+------------------------------------------------------------------+
void ManageAlerts(const datetime &time[], const int rates_total)
{
if(!InpAlertsOn || rates_total < 2)
return;
//--- 索引 rates_total-1 是当前未收盘K线,rates_total-2 是最后一根已收盘K线
int whichBar = InpAlertsOnCurrent ? (rates_total - 1) : (rates_total - 2);
if(whichBar < 0 || whichBar >= rates_total)
return;
if(ArrUp[whichBar] != EMPTY_VALUE) DoAlert(time[whichBar], "向上");
if(ArrDn[whichBar] != EMPTY_VALUE) DoAlert(time[whichBar], "向下");
}
//+------------------------------------------------------------------+
//| 真正发出提醒(同一根K线同一方向只提醒一次) |
//+------------------------------------------------------------------+
void DoAlert(const datetime barTime, const string direction)
{
static string previousAlert = "";
static datetime previousTime = 0;
if(previousAlert == direction && previousTime == barTime)
return;
previousAlert = direction;
previousTime = barTime;
string message = _Symbol + " " + EnumToString((ENUM_TIMEFRAMES)Period()) +
" 于 " + TimeToString(TimeLocal(), TIME_MINUTES|TIME_SECONDS) +
" 出现 HalfTrend " + direction + " 信号";
if(InpAlertsMessage) Alert(message);
if(InpAlertsEmail) SendMail(_Symbol + " HalfTrend 信号", message);
if(InpAlertsSound) PlaySound("alert2.wav");
}
//+------------------------------------------------------------------+作品说明
从 MT4 移植到 MQL5 的核心改动有四处:① iATR/iMA 改成 OnInit 建句柄 + OnCalculate 里 CopyBuffer 取值;② 去掉所有 ArraySetAsSeries,循环方向由「从右往左」翻转成 i 递增、i-1 代表前一根;③ iLowest/iHighest/iLow/iHigh 换成对 high[]/low[] 直接做区间扫描;④ 波动带原来是 MT4 的 DRAW_HISTOGRAM(主图里会从底部拉满),MT5 改用 DRAW_HISTOGRAM2 画成趋势线与 ±ATR 之间的真实色带。状态机逻辑、箭头位置、提醒去重全部保持原版行为。
使用说明
安装
- MT5 菜单「文件 → 打开数据文件夹」,进入
MQL5\Indicators,把HalfTrend_MT5.mq5放进去。 - 回到 MetaEditor 按 F7 编译(0 errors, 0 warnings),刷新导航器后双击挂到图上。
参数怎么调
InpAmplitude(灵敏度):默认 2 最灵敏、信号多。黄金 M5/M15 建议 3-4,H1/H4 建议 2-3;数值越大趋势线越钝,反转确认越慢但假信号更少。InpAtrPeriod:只影响色带厚度和箭头与趋势线的距离,不影响买卖信号,默认 100 即可。InpShowBands/InpShowArrows:关掉色带可以让主图更干净,关掉箭头仍然保留提醒。InpAlertsOnCurrent:设false(默认)只在K线收盘后提醒,信号不会重画;设true会在当前K线内提前提醒,但价格回去后信号可能消失。
信号怎么看
- 蓝线在K线下方 = 多头趋势,蓝线本身就是跟踪止损位(只抬不落)。
- 红线在K线上方 = 空头趋势,红线是跟踪压力位(只压不升)。
- 蓝↑箭头出现在由跌转涨的那一根K线下方,红↓箭头出现在由涨转跌的那一根上方——每次反转只画一个箭头,不会出现箭头墙。
- 顺势做法:出现↑箭头后做多,止损放蓝线下方,蓝线转红平仓;反向同理。
注意事项
- 需要至少
max(灵敏度, ATR周期)+3根历史K线才开始绘图,新品种或小周期刚打开时左侧没有线是正常的,按一下 Home 加载历史即可。 - 这是趋势跟踪型指标,反转点必然滞后于最高/最低点,不要当抄底摸顶工具用;震荡行情里连续两三次反转属正常现象,建议配合更大周期方向过滤。
- 邮件提醒需要先在「工具 → 选项 → 邮件」里配置 SMTP,否则
SendMail不会发出。 - 本指标只画线、给箭头和提醒,不会自动下单。
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
HalfTrend 是一个趋势跟踪型指标,核心逻辑是用「半趋势线」追踪价格当前方向,在多空转换的那一根 K 线给出箭头并发出提醒。它画两条线——蓝线追踪上涨、红线追踪下跌,同时用 ATR 波动带标示出可能的支撑阻力范围。
逻辑原理
趋势判断
指标先算出最近 灵敏度 根 K 线内的最低价和最高价,再分别对最低价和最高价做 灵敏度 周期的简单均线(SMA)。进入多头状态后,只要「最低价均线」突破阶段最高低点、且当前收盘价突破前一根最高价,就判定要转空;反向逻辑判定转多。
趋势线行为
- 蓝线(上涨):每一根都取最近
灵敏度根内的最低价与前一根蓝线的较高值,只能抬升不能下跌——这就是跟踪止损的效果 - 红线(下跌):只能压低不能上升——像跟踪的压力位
- 反转时线条无缝衔接,从一条线的末端直接延伸为另一条线
波动带与箭头
波动带是以趋势线为中心、宽度为「半个 ATR」的色带(上涨时在线下方,下跌时在线上方)。反转箭头只出现在转向的那一根 K 线上——多转空时箭头在红线上方,空转多时箭头在蓝线下方,每次反转恰好一个箭头,不会连续出现。
参数说明
- InpAmplitude(2):灵敏度。控制最低/最高价均线的周期,也决定区间扫描的范围。数值越大,趋势线越钝、反转确认越晚、假信号越少;越小越灵敏、信号越频繁。黄金 M5/M15 建议 3-4,H1/H4 建议 2-3。
- InpAtrPeriod(100):ATR 周期。只影响色带的宽度和箭头距离趋势线的远近,不影响买卖信号逻辑本身,一般保持默认。
- InpShowBands(true):是否显示 ATR 波动色带。关掉可让主图更清爽。
- InpShowArrows(true):是否显示反转箭头。关掉后仍保留提醒。
- InpAlertsOn(true):总提醒开关。
- InpAlertsOnCurrent(false):false = 等 K 线收盘后才提醒,不会重画(推荐);true = 当前 K 线内提前提醒,但价格回落后信号可能消失。
- InpAlertsMessage(true):是否弹窗提醒。
- InpAlertsSound(true):是否声音提醒。
- InpAlertsEmail(false):是否邮件提醒,需要在 MT5「工具 → 选项 → 邮件」里提前配置 SMTP。
怎么用
- 把
HalfTrend_MT5.mq5放进MQL5\Indicators文件夹,MetaEditor 按 F7 编译,刷新导航器后双击挂到图上。 - 第一次打开或新品种可能左侧没有线,按 Home 键加载历史 K 线即可。
- 看到蓝↑箭头出现在 K 线下方,说明由跌转涨,可考虑顺势做多,止损放在蓝线下方;看到红↓箭头在 K 线上方,说明由涨转跌,可顺势做空,止损放在红线上方。
- 蓝线本身就是动态止损位(只抬不落),红线也是(只压不升),跟踪效果自动生效。
适用场景
适合
- 趋势明显的品种(黄金、主要货币对)和周期(M15 及以上)
- 顺势交易风格,不做抄底摸顶
- 配合更大周期的方向过滤效果更佳
不适合
- 震荡行情、没有明显趋势的段位(会频繁反转,假信号连续)
- 小周期(M1/M5 在高波动时尤其容易被噪音错信)
- 用来精确找最高/最低点(这指标天生滞后)
风险提示
- 滞后性:反转点必然晚于价格真实的高低点,这是所有趋势跟踪指标的天性,不是 bug。
- 假信号在震荡行情里堆积:价格在支撑阻力间反复震荡时,连续两三次反转属正常,单独看箭头容易追高杀低,强烈建议用更大周期确认方向。
- 邮件提醒需要配置:
SendMail函数需要终端已正确配置 SMTP,否则邮件不会发出,但界面上不会报错。 - 不自动下单:这指标只画线、给箭头和提醒,交易决定和风险管理完全由交易者负责。
- 重绘:当
InpAlertsOnCurrent设为 true 时,当前未收盘 K 线的箭头会被重画;设为 false 时不会重画(该模式下只在 K 线收盘后给一次信号)。
常见问题
- 这个指标会重绘吗?
- 默认不会。因为 `InpAlertsOnCurrent` 默认是 false,指标只在 K 线收盘后才在最后一根上画箭头和记录信号。如果改成 true,当前未收盘的 K 线会被重画。
- 参数默认值 Amplitude=2 适合什么周期?
- 默认的 2 最灵敏,适合 M5/M15 这种快节奏行情。如果在 H1/H4 或更大周期上信号太频繁,建议改到 3-4 来过滤噪音。
- 可以用在黄金以外的品种吗?
- 代码里没有品种限制,理论上任何品种都能挂。但这是趋势指标,只适合有明显趋势的品种(主要货币对、商品、指数);在小周期或高波动品种上容易产生噪音。
- 邮件提醒为什么收不到?
- 需要在 MT5「工具 → 选项 → 邮件」里配置 SMTP 服务器、发件人和密码,否则 `SendMail` 函数虽然会被执行但邮件不会真的发出。建议先用弹窗和声音提醒测试。
- MT4 能用这个指标吗?
- 这是 MQL5 代码,只能在 MT5 里用。MT4 版本是独立的原始代码(源码注释里提到是从 MT4 移植过来的),需要分别下载。
HalfTrend Semi-Trend Channel Indicator for MT5 with Reversal Arrows
A trend-following indicator combining semi-trend lines, ATR bands, and reversal arrows for MT5. Displays blue/red trend channels with visual alerts on trend reversals. Useful for trending markets with adjustable sensitivity parameters.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。