技术指标 / RSI 背离
背离工具看似简单:价格创出新的极值,而 RSI 没有。真正有用的问题是,哪些波动算数,您查看的是哪一种 RSI,以及工具需要等待多少根 K 线收盘后才能识别。本页通过明确的规则、真实的小时图和可供您核查的代码来回答这些问题。

RSI 衡量什么
相对强弱指数比较近期平均上涨幅度与平均下跌幅度,并将结果映射到 0 至 100 之间。根据 MT5 帮助文档,Wilder 在推出该指数时建议使用 14 个周期,此后 9 周期和 25 周期的版本也逐渐流行。同一帮助文档指出,RSI 通常在 70 以上见顶,在 30 以下见底。MT5 帮助:RSI
在本下载版本中,30 和 70 水平线仅供参考,不用于筛选任何背离。代码
背离比较什么
背离比较两个价格波动点与相同两根 K 线上的 RSI 读数。MT5 帮助文档将其描述为:价格创出新高或新低,而 RSI 未以自身的新高或新低予以确认。本下载版本将这一描述转化为明确的形态:MT5 帮助:RSI
- 常规看跌背离:价格形成更高的波动高点,但第二个高点处的 RSI 更低。
- 常规看涨背离:价格形成更低的波动低点,但第二个低点处的 RSI 更高。
- 隐藏看跌背离(默认关闭):波动高点更低,但第二个高点处的 RSI 更高。
- 隐藏看涨背离(默认关闭):波动低点更高,但第二个低点处的 RSI 更低。
本页不测试背离后价格是否反转,而是展示规则会标记什么、何时能够标记,以及价格仍然越过第二个波动点的真实案例。图表数据
本下载版本如何计算 RSI
该指标使用收盘价与 Wilder 平滑法。每根 K 线的价格变动拆分为上涨幅度和下跌幅度,其中一个始终为零,随后分别进行平滑处理。K 线从已加载的最早一根开始计数,起始编号为零:
change[t] = Close[t] − Close[t−1] gain[t] = max(change[t], 0) loss[t] = max(−change[t], 0) K 线 N 处的初始值: AvgGain[N] = (gain[1] + … + gain[N]) / N AvgLoss[N] = (loss[1] + … + loss[N]) / N 后续 K 线: AvgGain[t] = (AvgGain[t−1] × (N − 1) + gain[t]) / N AvgLoss[t] = (AvgLoss[t−1] × (N − 1) + loss[t]) / N RSI[t] = 100 − 100 / (1 + AvgGain[t] / AvgLoss[t])
N 为周期,默认为 14。平滑步骤采用 MT5 帮助文档中的平滑移动平均:前一个平均值乘以 N − 1,加上新值,再除以 N。MT5 的 RSI 帮助文档给出了最终公式,但未说明应使用哪一种平均值,因此本页明确说明代码所采用的方法。MT5 帮助:平滑移动平均 MT5 帮助:RSI 代码
初始值与预热
最初的平均上涨幅度和平均下跌幅度是前 14 次价格变动的简单平均值,因此第一个 RSI 值需要 15 个收盘价。在本次导出数据中,该值位于 2025-12-04 22:00 的 K 线上,等于 42.78。更早的 K 线保持空白;若只有 14 根或更少 K 线,指标则完全不绘制任何内容。代码 本页使用的数值
初始值的影响会衰减,却不会完全消失。每一步保留前一个平均值的 (N − 1) / N,因此经过 100 根 K 线后,初始值在每个平均值中的权重仍约为 0.06%。所以,从不同的首根 K 线开始或采用不同初始值的 RSI,起初会显示不同数值。在收盘价和平滑方法相同的情况下,平均值之间的差距会在每根 K 线上按该因子缩小。本页使用的数值
价格完全不变时
如果平均下跌幅度为零,公式就会出现除以零的情况。代码在平均上涨幅度为正时返回 100,在两个平均值均为零、即价格完全没有变动时返回 50。如果平均上涨幅度为零而平均下跌幅度为正,公式本身就会得出 0。代码
真实数据从未出现这些情况:一个也没有——其中 4,986 个 RSI 值没有任何一个恰好等于 0、50 或 100。测试中改用合成的横盘与单向价格序列覆盖这些情况。交叉核对
在相同条件下比较。只有收盘价、周期、平滑方法、初始值和首根 K 线都相同时,两条 RSI 线才会一致。两个背离列表还需要采用相同的枢轴点和配对规则。
指标如何发现背离
波动枢轴点
当一根 K 线的最高价严格高于其前方 5 根 K 线的最高价,且其后方 5 根 K 线的最高价均未超过它时,这根 K 线就是枢轴高点。枢轴低点则对最低价应用相反的规则:
K 线 p 处的枢轴高点: High[p] > High[j] 对于 j = p − L … p − 1
High[p] ≥ High[j] 对于 j = p + 1 … p + R
K 线 p 处的枢轴低点: Low[p] < Low[j] 对于 j = p − L … p − 1
Low[p] ≤ Low[j] 对于 j = p + 1 … p + R
L 是 PivotLeftBars,R 是 PivotRightBars。这种不对称性用于处理相等情况:右侧相同的最高价不会使枢轴点失效,左侧相同的最高价则会,因此在彼此比较范围内出现两个相同高点时,较早的 K 线成为枢轴点。真实数据中确实存在相等情况。在本次导出数据中,10 个枢轴高点和 4 个枢轴低点的右侧存在相同极值;另有 14 个高点和 4 个低点仅因左侧存在相同极值而未被选中。导出数据共有 313 个枢轴高点和 311 个枢轴低点。代码 计数
配对与背离检验
新的枢轴点得到确认后,代码仅将其与前一个同类型枢轴点比较。当两个枢轴点相距 5 至 60 根 K 线,且第一个枢轴点处已经存在 RSI 值时,才会检验这一配对。较近的枢轴点始终会阻止与更早枢轴点的比较。代码
常规看跌背离: High[p2] > High[p1] 且 RSI[p2] < RSI[p1] 常规看涨背离: Low[p2] < Low[p1] 且 RSI[p2] > RSI[p1] 隐藏看跌背离: High[p2] < High[p1] 且 RSI[p2] > RSI[p1] 隐藏看涨背离: Low[p2] > Low[p1] 且 RSI[p2] < RSI[p1] 报告所在的 K 线: c = p2 + R
所有比较均为严格比较,因此价格相同或 RSI 读数相同都不会构成背离。左侧取 5 根 K 线、右侧取 5 根时,两个同类型枢轴点之间始终至少相隔 6 根 K 线,因此默认设置下的最小距离不会产生约束。规则
设置
以下是本下载版本的输入参数。本页所有图表均采用默认值;这些值是用于说明的起点,并非优化结果。
| 输入参数 | 默认值 | 控制内容 |
|---|---|---|
RsiPeriod |
14 | 对收盘价应用 Wilder 平滑法时使用的 RSI 周期。 |
PivotLeftBars |
5 | 枢轴点之前的 K 线数量,其极值必须被枢轴点严格超越。 |
PivotRightBars |
5 | 枢轴点之后不得超过其极值的已收盘 K 线数量。这也是确认延迟。 |
MinPivotDistance |
5 | 一对枢轴点之间允许的最少 K 线数量。 |
MaxPivotDistance |
60 | 两个枢轴点之间允许的最多 K 线数量。对前一个枢轴点的搜索到此为止。 |
ShowHidden |
false | 添加隐藏背离,以点线及各自的箭头显示。 |
周期决定每次新变动的权重。Wilder 平滑法在默认周期下赋予其 1/14 的权重;采用 MT5 帮助文档提及的其他周期时,权重为 1/9 或 1/25,因此周期越短,对每根 K 线的反应越大。PivotRightBars 在速度与确认之间取舍:增大此值绝不会增加枢轴点,却会使每个背离的检测推迟相应增加的 K 线数量。MT5 帮助:RSI 本页使用的数值
解读真实案例
图 2 至 4 按照固定筛选规则从导出数据中选取。图 2 和 3 的规则根据枢轴点之间的 RSI 差值对检测结果排序,不考虑此后的价格走势。图 4 则特意选择了一个失败案例。筛选规则

图 2 中,第二个高点比第一个高出 0.00039,而 RSI 低了 18.99 点。两个序列基于不同的价格:枢轴点使用最高价和最低价,RSI 使用收盘价。创出第二个高点的 K 线收于 1.16168,比自身最高价低 0.00420,比前一收盘价低 0.00212,因此 RSI 恰好在创出新高的那根 K 线上记录了下跌。本页使用的数值

图 3 中的第二个低点仅比第一个低 0.00009,即 9 个点,该品种的最小价格变动单位为 0.00001;与此同时,RSI 高出 26.22 点。规则未设置最小幅度,因此如此微小的差异与其他差异一样有效。此处枢轴 K 线的收盘价同样远离其极值:收于 1.16176,比自身最低价高 0.00355,比前一收盘价高 0.00272。本页使用的数值
这两个案例都不是根据结果挑选的。图 2 确认后,接下来 24 根 K 线中没有任何最高价超过枢轴点 2。图 3 确认后,价格在 2026-05-21 16:00 跌破枢轴点 2,最低价为 1.15757,距确认 K 线已有 18 根 K 线。图表记录

图 4 的检测符合规则:价格高点更高,RSI 却低了 17.88 点。未能实现的是对反转的预期。价格先跌至 1.15237 的低点,时间为 2026-04-07 05:00,随后继续上涨,创出更高的高点。图表记录 本页使用的数值
样本显示了什么
在默认设置下,导出数据包含 73 个常规背离:29 个看跌背离和 44 个看涨背离。开启 ShowHidden 后,新增 43 个隐藏看跌背离和 29 个隐藏看涨背离,总数为 145。这些计数仅描述该样本在这些规则下的情况,并非命中率,也未测试任何交易表现。计数
背离描述的是两个已经发生的波动。价格接下来如何变化,是另一个问题。
何时才能识别背离
确认延迟
枢轴点需要右侧有 5 根已收盘 K 线,因此检测器必须等到其中最后一根 K 线收盘后,才能识别枢轴点 2。代码将箭头放在该确认 K 线上,而非枢轴点 2 上;两个 RSI 读数之间的连线也在同一时刻出现。图表上最新的 K 线被视为仍在形成,因此它绝不会用于确认枢轴点。代码

它会重绘吗?
检测结果一旦写入,只要已收盘的历史数据不变,就会保持原位。原生测试逐根重放全部 5,000 根 K 线,先为最新 K 线提供一个发生变化的中间报价,再提供其最终值,并在每一步检查检测结果是否只在确认 K 线上出现,且此后不再改变。与任何 RSI 一样,最新 K 线上的 RSI 值仍会随每次报价而变动。如果价格历史本身发生变化,例如下载了更早的历史数据,终端会将 prev_calculated 设为零传入,指标则基于新数据重新计算全部内容。原生测试 MQL5 参考:OnCalculate
在用于定义波动的 K 线收盘之前,无法确认该波动。
与其他工具结合
检测器仅比较两个波动点与两个 RSI 读数,不涉及其他内容。任何附加条件都是需要您自行定义和测试的独立规则。本指南未测试以下任何附加条件:
- 价格水平。图 2 至 5 中的点线延伸了枢轴点 2 的价格水平。价格之后是否越过该水平,可从图表中看出;图 3 至 5 中确实发生了这种情况。
- RSI 水平。例如仅保留低于 30 的看涨背离,这样的筛选条件将构成新的输入。本下载版本绘制了 30 和 70 水平线,但不以此筛选。
- 其他 RSI 读数。MT5 帮助文档还描述了 RSI 线本身的顶部与底部、图表形态、失败摆动以及支撑或阻力。检测器不寻找这些情况。
- 趋势筛选与更高时间周期。采用移动平均线等趋势筛选条件,或在更高时间周期上应用相同规则,都会改变最终保留的检测结果。本页未衡量这两种做法。
局限性
- 检测器描述过去的 K 线,不进行预测,也不报告任何命中率或交易结果。
- 按照设计,每个检测结果都在枢轴点 2 之后 5 根 K 线收盘时出现。
- 微小差异也算数。在 621 对被检验的枢轴点中,最小价格差为 0.00001,即该品种的最小价格变动单位;最小 RSI 差为 0.05 点。有 1 对枢轴点的价格完全相同,按照规则不构成背离。
- 枢轴点使用最高价和最低价,而 RSI 使用收盘价。带有长影线的 K 线可能创出新的极值,却仍收在远离该极值的位置,图 2 和 3 就是如此。
- 只比较相邻的枢轴点,间距最多为 60 根 K 线。非相邻波动点之间的背离不会被报告。
- 已加载历史数据起始位置附近的数值取决于初始值,可能与其他 RSI 实现不同。
- 时间采用交易服务器时钟,采集时为 UTC+3;未对历史夏令时变更建模。图表压缩了周末及其他时间间隔。
- MQL4 文件尚未在 MT4 中编译或运行。
使用指标
以下步骤适用于 MT5。.mq4 文件面向 MT4,尚未在该平台上测试。
- 下载下方的 .mq5 源码或已编译的 .ex5 文件。
- 打开数据文件夹(在 MetaEditor 中选择“文件 › 打开数据文件夹”),然后将文件复制到 MQL5\Indicators 文件夹。
- 如果您使用源码,请在 MetaEditor 中打开并按 F7 编译。这将生成 .ex5 文件。
- 在 MT5 的 Navigator 窗口中,将指标拖到图表上。它会在独立指标窗口中打开,使用自己的刻度,固定范围为 0 至 100。
- 保留默认值以与本页一致,或在加载指标时修改设置表中的输入参数。
检查了哪些内容
MQL5 文件的计算部分仅重命名了入口函数,随后编译为测试程序,并在 MT5 数学测试器中对相同的 5,000 根 K 线运行。采用相同规则的独立参考实现处理了相同的数据行。其 Wilder 平均值使用指数加权平均,这是同一递推关系的另一种算术形式。测试框架范围 MQL5 参考:测试 指数加权平均
全部 4,986 个 RSI 值的差异均在 4.97e-14 点以内,其中 2,139 个逐位一致。通过测试的容差为 1e-9 点:远高于预期约 1e-13 点的浮点噪声,也远比指标显示的 2 位小数精细。开启 ShowHidden 后,全部 145 个检测结果在类型、确认 K 线和两个枢轴 K 线上完全一致。没有任何判定接近容差:所有被检验配对中的最小 RSI 差为 0.05 点。交叉核对 构建日志
原生程序通过了 41 项检查,总计 41 项,覆盖预热与初始值、横盘与单向价格、相等的高低点、答案已知的背离、历史数据不足、重复报价、变化中的未收盘 K 线、新增 K 线、逐根 K 线重放,以及默认 ShowHidden 设置。交叉核对脚本通过了 24 项比较,总计 24 项。原生测试 交叉核对
这些检查覆盖算术计算与更新逻辑,不涵盖实时图表上的绘制、MT4 或交易结果。测试框架范围
风险警告。交易存在风险,您可能亏损。该指标仅标记过去的价格与 RSI 形态:它不预测价格、不下单、不保护订单,也不管理风险。示例用于说明规则,并非交易信号,本页任何内容均不承诺结果。
常见问题
什么是 RSI 背离?
它指两个价格波动点与相同两根 K 线上的 RSI 读数不一致。在常规看跌背离中,价格形成更高的波动高点,而第二个高点处的 RSI 更低。在常规看涨背离中,价格形成更低的波动低点,而第二个低点处的 RSI 更高。
本下载版本如何计算 RSI?
它使用收盘价和 Wilder 平滑法,周期为 14。最初的平均上涨幅度和平均下跌幅度是前 14 次价格变动的简单平均值;之后,每次新变动以 1/14 的权重计入。使用不同平滑方法的 RSI 在整个序列中都会产生不同数值。若平滑方法相同,但初始值或首根 K 线不同,则差异在历史数据起始位置附近最大,随后逐渐减小。
为什么背离会在波动点之后 5 根 K 线才出现?
只有当波动点右侧的 5 根 K 线都已收盘,且未超过该波动点的极值时,它才成为枢轴点。指标在这些 K 线中的最后一根上报告背离,不会将其移回枢轴 K 线,因此图表显示的是指标在当时能够获知的信息。
指标会重绘吗?
确认后,只要已收盘的历史数据不变,就不会重绘。对全部 5,000 根 K 线进行原生重放,并在每根新 K 线上加入一个中间报价,未发现任何提前出现、后来移动或改变的检测结果。正在形成的 K 线上的 RSI 值仍会随每次报价变化;若已加载的历史数据发生变化,例如下载了更早的历史数据,指标就会重新计算全部内容。
什么是隐藏背离?
隐藏看跌背离是波动高点更低、RSI 却更高;隐藏看涨背离是波动低点更高、RSI 却更低。它们默认关闭。将 ShowHidden 设为 true 后,会以点线及各自的箭头绘制。交叉核对在开启此设置的情况下对其进行了比较;原生测试确认,默认设置不会绘制任何隐藏背离,并且常规背离保持不变。
背离是否意味着价格会反转?
本页并未证明这一点。它描述的是固定规则下的一个样本,图 3、4 和 5 均显示价格在确认后越过了第二个波动点。未测试任何命中率或交易结果。
我可以在 MT4 中使用 MQL4 文件吗?
.mq4 文件包含与已测试的 MQL5 文件相同的计算部分,并采用 MT4 风格的缓冲区设置。它仅经过静态审查:未在 MT4 中编译或运行。使用前,请在 MT4 随附的 MetaEditor 中编译,并检查编译日志中的错误和警告。
来源与可复现性
MT5 帮助:相对强弱指数:范围、Wilder 建议的周期与常用替代周期、通常的顶部与底部、背离及公式。
MT5 帮助:移动平均线:平滑移动平均公式。
MQL5 参考:OnCalculate:prev_calculated 值,以及价格数据变化后的完整重算。
MQL5 参考:copy_rates_from_pos:导出时的 K 线位置;位置零为当前 K 线,导出时跳过该 K 线。
MQL5 参考:测试:原生测试使用的数学计算模式。
参考库文档:指数加权平均:独立核对使用的 adjust=False 递推关系。
MetaEditor 帮助:平台结构:数据文件夹与指标文件夹。
MT5 帮助:算法交易:MQL5\Indicators 文件夹及使用 F7 编译。
MT5 帮助:技术指标:从 Navigator 加载指标以及独立指标窗口。
本页和图表使用的数值 · 导出的 K 线 · 导出数据来源记录 · 参考 RSI 与枢轴点 · 参考检测结果 · 原生 MQL5 缓冲区 · 原生 MQL5 检测结果 · 交叉核对 · 原生测试运行 · 构建日志 · 编译日志 · 规格说明
图表压缩了 K 线之间的周末及其他时间间隔。时间为导出时终端的交易服务器时钟。示例固定不变,以便复现,并非实时市场评论。
杠杆产品可能迅速造成亏损;中国大陆居民不得通过境外经纪商进行差价合约或外汇零售交易。




