效果示意图 · AI 根据源码绘制
#property copyright "XAUUSD Indicator Workshop"
#property version "1.0"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 4
// ============ 输入参数 ============
input int FastMA_Period = 20; // 快速MA周期(贴近价格)
input int SlowMA_Period = 50; // 慢速MA周期(平滑趋势线)
input ENUM_MA_METHOD MA_Method = MODE_EMA; // MA类型:MODE_SMA, MODE_EMA, MODE_SMMA, MODE_LWMA
input int Channel_Period = 20; // 通道周期(计算标准差)
input double Channel_StdDev = 2.0; // 通道宽度(标准差倍数,默认2.0)
input int RSI_Period = 14; // RSI周期
input double RSI_Overbought = 70; // RSI超买阈值(标注点位)
input double RSI_Oversold = 30; // RSI超卖阈值(标注点位)
input bool Show_RSI_Labels = true; // 是否显示RSI数值标签
input color Channel_Fill_Color = clrLightBlue; // 通道填充颜色
input int Channel_Transparency = 85; // 通道透明度(0-100,越大越透明)
// ============ 指标缓冲区 ============
double FastMA_Buffer[]; // 快速MA(青色)
double SlowMA_Buffer[]; // 慢速MA(浅蓝)
double UpperChannel_Buffer[]; // 上通道线
double LowerChannel_Buffer[]; // 下通道线
double RSI_Buffer[]; // RSI值(不显示,用于计算)
// ============ 全局句柄 ============
int FastMA_Handle = INVALID_HANDLE;
int SlowMA_Handle = INVALID_HANDLE;
int RSI_Handle = INVALID_HANDLE;
// ============ OnInit 初始化 ============
int OnInit()
{
// 创建快速MA句柄
FastMA_Handle = iMA(_Symbol, PERIOD_CURRENT, FastMA_Period, 0, MA_Method, PRICE_CLOSE);
if (FastMA_Handle == INVALID_HANDLE) {
Alert("快速MA创建失败");
return INIT_FAILED;
}
// 创建慢速MA句柄
SlowMA_Handle = iMA(_Symbol, PERIOD_CURRENT, SlowMA_Period, 0, MA_Method, PRICE_CLOSE);
if (SlowMA_Handle == INVALID_HANDLE) {
Alert("慢速MA创建失败");
return INIT_FAILED;
}
// 创建RSI句柄
RSI_Handle = iRSI(_Symbol, PERIOD_CURRENT, RSI_Period, PRICE_CLOSE);
if (RSI_Handle == INVALID_HANDLE) {
Alert("RSI创建失败");
return INIT_FAILED;
}
// 设置缓冲区数组为时间序列(0=最新)
ArraySetAsSeries(FastMA_Buffer, true);
ArraySetAsSeries(SlowMA_Buffer, true);
ArraySetAsSeries(UpperChannel_Buffer, true);
ArraySetAsSeries(LowerChannel_Buffer, true);
ArraySetAsSeries(RSI_Buffer, true);
// 绑定缓冲区
SetIndexBuffer(0, FastMA_Buffer, INDICATOR_DATA);
SetIndexBuffer(1, SlowMA_Buffer, INDICATOR_DATA);
SetIndexBuffer(2, UpperChannel_Buffer, INDICATOR_DATA);
SetIndexBuffer(3, LowerChannel_Buffer, INDICATOR_DATA);
SetIndexBuffer(4, RSI_Buffer, INDICATOR_CALCULATIONS);
// 快速MA - 青色粗线
PlotIndexSetString(0, PLOT_LABEL, "FastMA");
PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrCyan);
PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
// 慢速MA - 浅蓝色粗线
PlotIndexSetString(1, PLOT_LABEL, "SlowMA");
PlotIndexSetInteger(1, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(1, PLOT_LINE_COLOR, clrLightBlue);
PlotIndexSetInteger(1, PLOT_LINE_WIDTH, 2);
PlotIndexSetInteger(1, PLOT_LINE_STYLE, STYLE_SOLID);
// 上通道线 - 浅蓝色虚线
PlotIndexSetString(2, PLOT_LABEL, "Upper Channel");
PlotIndexSetInteger(2, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(2, PLOT_LINE_COLOR, clrLightBlue);
PlotIndexSetInteger(2, PLOT_LINE_WIDTH, 1);
PlotIndexSetInteger(2, PLOT_LINE_STYLE, STYLE_DOT);
// 下通道线 - 浅蓝色虚线
PlotIndexSetString(3, PLOT_LABEL, "Lower Channel");
PlotIndexSetInteger(3, PLOT_DRAW_TYPE, DRAW_LINE);
PlotIndexSetInteger(3, PLOT_LINE_COLOR, clrLightBlue);
PlotIndexSetInteger(3, PLOT_LINE_WIDTH, 1);
PlotIndexSetInteger(3, PLOT_LINE_STYLE, STYLE_DOT);
IndicatorSetString(INDICATOR_SHORTNAME, "Trend_Channel_RSI");
IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
return INIT_SUCCEEDED;
}
// ============ 计算标准差 ============
double CalculateStdDev(const double &values[], int size)
{
if (size <= 1) return 0;
double sum = 0;
for (int i = 0; i < size; i++) {
sum += values[i];
}
double average = sum / size;
double variance = 0;
for (int i = 0; i < size; i++) {
double diff = values[i] - average;
variance += diff * diff;
}
variance /= size;
return MathSqrt(variance);
}
// ============ OnCalculate 主计算 ============
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 < MathMax(FastMA_Period, SlowMA_Period) + Channel_Period) {
return 0; // 数据不足
}
// 设置价格数组为时间序列
ArraySetAsSeries(close, true);
ArraySetAsSeries(time, true);
int limit = rates_total - prev_calculated;
if (limit == 0) limit = 1; // 只计算最新K线
if (prev_calculated == 0) limit = rates_total - 1; // 首次计算全部
// 复制快速MA
if (CopyBuffer(FastMA_Handle, 0, 0, rates_total, FastMA_Buffer) <= 0) {
return 0;
}
ArraySetAsSeries(FastMA_Buffer, true);
// 复制慢速MA
if (CopyBuffer(SlowMA_Handle, 0, 0, rates_total, SlowMA_Buffer) <= 0) {
return 0;
}
ArraySetAsSeries(SlowMA_Buffer, true);
// 复制RSI
if (CopyBuffer(RSI_Handle, 0, 0, rates_total, RSI_Buffer) <= 0) {
return 0;
}
ArraySetAsSeries(RSI_Buffer, true);
// 计算通道(基于收盘价的标准差)
double priceArray[];
ArrayResize(priceArray, Channel_Period);
for (int i = limit; i >= 0; i--) {
if (i + Channel_Period > rates_total) continue;
// 提取最近 Channel_Period 个收盘价
for (int j = 0; j < Channel_Period; j++) {
priceArray[j] = close[i + j];
}
// 计算标准差
double stdDev = CalculateStdDev(priceArray, Channel_Period);
// 计算通道上下轨(以快速MA为中线)
UpperChannel_Buffer[i] = FastMA_Buffer[i] + stdDev * Channel_StdDev;
LowerChannel_Buffer[i] = FastMA_Buffer[i] - stdDev * Channel_StdDev;
}
// ========== 在超买超卖点位标注RSI值 ==========
if (Show_RSI_Labels && prev_calculated != rates_total) {
for (int i = 0; i < MathMin(10, rates_total); i++) { // 只检查最近10根K线
if (RSI_Buffer[i] >= RSI_Overbought || RSI_Buffer[i] <= RSI_Oversold) {
string objName = "RSI_Label_" + TimeToString(time[i]);
// 删除旧对象
if (ObjectFind(0, objName) >= 0) {
ObjectDelete(0, objName);
}
// 创建文本标签
if (ObjectCreate(0, objName, OBJ_TEXT, 0, time[i], high[i] + 10 * _Point)) {
ObjectSetString(0, objName, OBJPROP_TEXT, "RSI_" + DoubleToString(RSI_Buffer[i], 1));
ObjectSetInteger(0, objName, OBJPROP_COLOR, (RSI_Buffer[i] >= RSI_Overbought) ? clrRed : clrLime);
ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 8);
ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_LOWER);
}
}
}
}
return rates_total;
}
// ============ OnDeinit 清理 ============
void OnDeinit(const int reason)
{
// 释放指标句柄
if (FastMA_Handle != INVALID_HANDLE) IndicatorRelease(FastMA_Handle);
if (SlowMA_Handle != INVALID_HANDLE) IndicatorRelease(SlowMA_Handle);
if (RSI_Handle != INVALID_HANDLE) IndicatorRelease(RSI_Handle);
// 删除所有RSI标签
ObjectsDeleteAll(0, "RSI_Label_", 0, OBJ_TEXT);
}作品说明
从图上识别到:两条移动平均线(青色快线贴近价格,浅蓝慢线较平滑)、浅蓝色半透明填充通道(类似布林带的标准差通道)、RSI数值标注(图中标记"-2 RSI_88_5",表示在特定点位显示RSI值)。这是一个趋势通道+RSI标注组合指标,用于趋势跟踪和超买超卖确认。
使用说明
安装方法
- 将代码保存为
Trend_Channel_RSI_Label.mq5到MetaTrader 5\MQL5\Indicators文件夹 - 在 MT5 MetaEditor 中按 Ctrl+F9 编译
- 编译成功后,在图表上右键 → 插入指标 → 自定义 → 选择本指标
参数调整
- FastMA_Period / SlowMA_Period:快慢MA周期,默认 20/50,可根据交易周期调整(日内短线用10/30,波段用50/200)
- Channel_StdDev:通道宽度倍数,默认 2.0(布林带标准值),震荡市场可用 1.5,趋势市场用 2.5
- RSI_Overbought / RSI_Oversold:超买超卖阈值,默认 70/30,可改为 80/20(更保守)
- Show_RSI_Labels:是否显示RSI标签,默认开启,关闭可减少图表干扰
- Channel_Transparency:通道透明度(需手动在图表属性里调整填充效果)
信号解读
- 青色线上穿浅蓝线:趋势转为多头,关注做多机会
- 价格触及下通道线 + RSI<30:强超卖信号,考虑买入
- 价格触及上通道线 + RSI>70:强超买信号,考虑卖出
- RSI标签显示:在关键点位自动标注RSI值(红色=超买,绿色=超卖)
注意事项
- 通道填充颜色需在MT5图表属性中手动设置(右键指标→属性→颜色→填充),代码仅绘制通道线
- RSI标签仅在最近10根K线上显示,避免图表过于混乱
- 强趋势中通道可能被频繁突破,此时更应关注MA方向而非通道边界
- 建议配合成交量和支撑阻力位综合判断入场时机
AI 解读根据源码逐行分析写成,供参考,以实际运行为准
这是什么
一个趋势跟踪和超买超卖确认的组合指标。在图上画两条均线(快线贴近价格、慢线平滑趋势)、一条标准差通道(类似布林带,基于快线上下波动),并在 RSI 触及超买超卖区时自动标注数值。
逻辑原理
均线部分:用快速 MA(默认 20 周期 EMA)和慢速 MA(默认 50 周期 EMA)判断趋势方向,快线在上为多头,快线在下为空头。
通道计算:以快线为中线,统计最近 20 根 K 线收盘价的标准差,向上下各延伸 2 倍标准差形成通道上下轨。价格触及上轨可能回调,触及下轨可能反弹。
RSI 标注:计算 14 周期 RSI,当 RSI ≥ 70(超买)或 RSI ≤ 30(超卖)时,在对应 K 线高点上方显示「RSI_数值」标签,红色表示超买,绿色表示超卖。标签仅显示最近 10 根 K 线。
参数说明
- FastMA_Period(20):快速均线周期,越小越贴近价格,日内短线可用 10
- SlowMA_Period(50):慢速均线周期,趋势线基准,波段交易可用 100 或 200
- MA_Method(MODE_EMA):均线类型,可选 SMA / EMA / SMMA / LWMA
- Channel_Period(20):计算通道宽度的 K 线数量,周期越长通道越平滑
- Channel_StdDev(2.0):通道宽度倍数,布林带标准值是 2.0,震荡市场用 1.5,趋势行情用 2.5
- RSI_Period(14):RSI 计算周期
- RSI_Overbought(70):超买阈值,触及后显示标签,保守设置用 80
- RSI_Oversold(30):超卖阈值,触及后显示标签,保守设置用 20
- Show_RSI_Labels(true):是否显示 RSI 标签,关闭可减少图表干扰
- Channel_Fill_Color(clrLightBlue):通道填充颜色(需在 MT5 图表属性手动设置填充效果)
- Channel_Transparency(85):透明度参考值
怎么用
将代码保存为 .mq5 文件放到 MT5 的 MQL5\Indicators 文件夹,在 MetaEditor 里编译,然后在图表上插入指标 → 自定义 → 选择本指标。
看信号:青色快线上穿浅蓝慢线是做多信号,下穿是做空信号;价格触及下通道线且 RSI < 30 是强超卖买入机会,触及上通道线且 RSI > 70 是强超买卖出机会。图上自动标注的 RSI 数值帮你快速识别关键点位。
通道填充:代码只画了通道线,如果想要半透明填充效果,需要右键点击指标 → 属性 → 颜色标签,手动设置上下轨之间的填充。
适用场景
适合:XAUUSD、EURUSD、原油等波动较规律的品种,H1 和 H4 周期趋势跟踪,或 M15 / M30 震荡行情抓反转。快慢线交叉配合通道边界能过滤假突破。
不适合:消息面剧烈波动时通道会被频繁突破,RSI 可能长时间停留在超买超卖区;低波动的盘整期通道会非常窄,信号意义不大。小周期(M1 / M5)噪音多,标签会很乱。
风险提示
均线滞后:快慢线都是滞后指标,交叉信号出现时趋势可能已经走了一段,需要配合价格形态确认。
通道突破不等于反转:强趋势中价格会沿着通道上轨或下轨运行,触及边界不一定回调,此时更应该看均线方向而不是盲目做反向。
RSI 钝化:趋势行情中 RSI 可能长期处于超买或超卖区,单靠 RSI 标签做反转风险很大,必须结合通道位置和均线方向综合判断。
标签显示限制:代码只在最近 10 根 K 线上标注 RSI,历史信号不会显示,回测时需要手动检查 RSI 数值。
无自动填充:MT5 的 MQL5 无法直接在代码里实现通道填充效果,必须手动在图表属性里设置,否则只能看到两条虚线。
常见问题
- 这个指标的通道会重绘吗
- 不会。通道基于历史 K 线的标准差计算,已形成的 K 线数值固定,但最新未完成的 K 线会随价格波动实时变化。
- RSI 标签为什么只显示最近几根 K 线
- 代码设定只检查最近 10 根 K 线,避免图表标签过多影响观察。如果需要查看历史 RSI 值,可以在数据窗口里看 RSI_Buffer 缓冲区。
- 通道填充颜色怎么设置
- MQL5 代码无法直接绘制填充区域。编译指标后,在图表上右键点击指标名称 → 属性 → 颜色标签,找到 Upper Channel 和 Lower Channel,在它们之间手动添加填充色。
- 默认参数适合什么周期
- 默认快线 20、慢线 50、通道 20 适合 H1 和 H4 波段交易。日内短线建议快线 10、慢线 30;长线趋势可用快线 50、慢线 200。
- 可以用在加密货币或股票上吗
- 可以。代码没有品种限制,但加密货币波动大建议调高通道倍数(2.5 或 3.0),股票波动小可以降低到 1.5。
MT5 Trend Channel with RSI Labels Indicator
A dual moving average trend channel indicator with standard deviation bands and automatic RSI overbought/oversold labels. Suitable for trend following and swing trading with customizable MA periods, channel width, and RSI thresholds.
Source code is shown above. Compiled EX5 files are available to VIP members.
评论
还没有人评论,来抢个沙发。