RSI Divergence + Level Filter
Un indicador para TradingView que detecta las divergencias entre el precio y el RSI, tanto las regulares como las ocultas, y que puede quedarse solo con las que empiezan en sobrecompra o sobreventa. Es gratuito y de código abierto.
Qué es una divergencia
El RSI mide la fuerza del movimiento del precio. Hay divergencia cuando el precio y el RSI no se mueven de acuerdo: el precio marca un nuevo extremo, pero el RSI no lo confirma. Si quieres repasar cómo funciona el RSI, lo explicamos en el curso gratis.
Divergencias regulares
El precio hace un extremo nuevo y el RSI no lo acompaña. Se leen como posible pérdida de impulso del movimiento actual.
- Alcista: mínimo más bajo en el precio, más alto en el RSI.
- Bajista: máximo más alto en el precio, más bajo en el RSI.
Divergencias ocultas
Ocurren dentro de una tendencia, en un retroceso. Se leen como posible continuación de la tendencia.
- Alcista: mínimo más alto en el precio, más bajo en el RSI.
- Bajista: máximo más bajo en el precio, más alto en el RSI.
Filtro de niveles
Opcional. Se queda solo con las regulares que empiezan en una zona extrema del RSI.
- Bajista: el primer máximo en 70 o más y el segundo por debajo de 70.
- Alcista: el primer mínimo en 30 o menos y el segundo por encima de 30.
Los cuatro tipos
Cada tipo tiene su etiqueta y su color en el indicador. Las regulares vienen activadas y las ocultas, no.
Alcista regular
Precio: hace un mínimo más bajo
RSI: hace un mínimo más alto
El precio sigue cayendo, pero con menos fuerza. Mucha gente lo toma como aviso de que la caída puede estar perdiendo impulso.
Bajista regular
Precio: hace un máximo más alto
RSI: hace un máximo más bajo
El precio sigue subiendo, pero con menos fuerza. Se interpreta como posible pérdida de impulso de la subida.
Alcista oculta
Precio: hace un mínimo más alto
RSI: hace un mínimo más bajo
En una tendencia alcista, el precio retrocede menos de lo que lo hace el RSI. Algunos la leen como señal de que la tendencia puede continuar.
Bajista oculta
Precio: hace un máximo más bajo
RSI: hace un máximo más alto
En una tendencia bajista, el precio rebota menos de lo que lo hace el RSI. Algunos la leen como señal de que la tendencia puede continuar.
Cómo se ve
El indicador aparece en un panel debajo del gráfico, con la línea del RSI y una línea que une los dos pivotes de cada divergencia. Primero dos capturas reales y debajo un esquema.
Esquema ilustrativo de una divergencia alcista regular. No son datos de mercado.
Cómo conseguirlo y añadirlo a TradingView
Lo distribuimos desde aquí porque TradingView exige un plan de pago para publicar scripts. Es el mismo código y funciona en una cuenta gratuita.
- Copia el código. Usa el botón de abajo.
- Abre el Editor Pine. En TradingView, abre un gráfico y pulsa Editor Pine en el panel inferior. Elige Abrir y luego Nuevo indicador en blanco, y borra el texto de ejemplo.
- Pega el código y guárdalo. Pulsa Guardar y ponle un nombre. Después, Añadir al gráfico.
- Revisa los ajustes. Por defecto muestra las regulares sin filtro. Activa las ocultas o el filtro de niveles si quieres.
- Crea una alerta, si la necesitas. Desde el botón de alertas, elige el indicador y el tipo de divergencia.
Tu copia. El indicador queda guardado en tu cuenta, en Indicadores › Mis scripts. Si lo mejoramos, volverás a copiar el código desde esta página. Versión actual: 1.0 (3 de noviembre de 2026). Las cuentas gratuitas de TradingView limitan cuántos indicadores caben en un gráfico.
Código del indicador
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Version 1.0 · 2026-11-03
// © TradingFondeo
//@version=6
indicator("RSI Divergence + Level Filter [TradingFondeo]", shorttitle = "RSI Div", overlay = false, max_lines_count = 100, max_labels_count = 100)
// ─────────────────────────────────────────────────────────────────────────────
// RSI Divergence + Level Filter
//
// Detects regular and hidden divergences between price and the RSI, using
// confirmed pivots on the RSI. A divergence is drawn when the SECOND pivot is
// confirmed, which happens "Pivot bars to the right" bars after the pivot itself.
// Once drawn, it never repaints.
//
// Regular bullish : price makes a LOWER low , RSI makes a HIGHER low
// Regular bearish : price makes a HIGHER high, RSI makes a LOWER high
// Hidden bullish : price makes a HIGHER low , RSI makes a LOWER low
// Hidden bearish : price makes a LOWER high , RSI makes a HIGHER high
//
// Optional level filter (regular divergences only):
// Bearish : the first RSI high is at or above the overbought level and the
// second RSI high is back below it.
// Bullish : the first RSI low is at or below the oversold level and the
// second RSI low is back above it.
//
// Educational tool. It does not give buy or sell signals.
// ─────────────────────────────────────────────────────────────────────────────
// ── Inputs ───────────────────────────────────────────────────────────────────
GRP_RSI = "RSI"
rsiLen = input.int(14, "RSI length", minval = 2, group = GRP_RSI)
rsiSrc = input.source(close, "Source", group = GRP_RSI)
GRP_PIV = "Pivots"
lbL = input.int(5, "Pivot bars to the left", minval = 1, maxval = 50, group = GRP_PIV, tooltip = "Bars on the left that must be lower (for a low) or higher (for a high) than the pivot.")
lbR = input.int(5, "Pivot bars to the right", minval = 1, maxval = 50, group = GRP_PIV, tooltip = "Bars on the right needed to confirm a pivot. A divergence appears this many bars after the second pivot. Lower values react faster but give more noise.")
minGap = input.int(5, "Min bars between pivots", minval = 1, maxval = 200, group = GRP_PIV)
maxGap = input.int(60, "Max bars between pivots", minval = 2, maxval = 200, group = GRP_PIV)
GRP_TYPE = "Divergence types"
showRegBull = input.bool(true, "Regular bullish", group = GRP_TYPE)
showRegBear = input.bool(true, "Regular bearish", group = GRP_TYPE)
showHidBull = input.bool(false, "Hidden bullish", group = GRP_TYPE)
showHidBear = input.bool(false, "Hidden bearish", group = GRP_TYPE)
GRP_LVL = "Level filter (regular divergences)"
useLevels = input.bool(false, "Only regular divergences that start in the extreme zone", group = GRP_LVL, tooltip = "Bearish: first RSI high at or above the overbought level and second high below it. Bullish: first RSI low at or below the oversold level and second low above it. Hidden divergences are not filtered.")
obLevel = input.int(70, "Overbought level", minval = 50, maxval = 100, group = GRP_LVL)
osLevel = input.int(30, "Oversold level", minval = 0, maxval = 50, group = GRP_LVL)
GRP_STY = "Style"
showLines = input.bool(true, "Draw divergence lines", group = GRP_STY)
showLabels = input.bool(true, "Draw labels", group = GRP_STY)
showPivots = input.bool(false, "Mark confirmed RSI pivots", group = GRP_STY)
colRsi = input.color(#B39DFF, "RSI line", group = GRP_STY)
colRegBull = input.color(#34D399, "Regular bullish", group = GRP_STY)
colRegBear = input.color(#F16565, "Regular bearish", group = GRP_STY)
colHidBull = input.color(#5B9BFF, "Hidden bullish", group = GRP_STY)
colHidBear = input.color(#F5A623, "Hidden bearish", group = GRP_STY)
// ── RSI and pivots ───────────────────────────────────────────────────────────
rsi = ta.rsi(rsiSrc, rsiLen)
pl = ta.pivotlow(rsi, lbL, lbR)
ph = ta.pivothigh(rsi, lbL, lbR)
// Last confirmed pivot of each kind: RSI value, price at that bar and bar index.
var float lastLowRsi = na
var float lastLowPx = na
var int lastLowBar = na
var float lastHighRsi = na
var float lastHighPx = na
var int lastHighBar = na
bool regBull = false
bool regBear = false
bool hidBull = false
bool hidBear = false
// Draws the line on the RSI pane and, optionally, a label.
drawDiv(int x1, float y1, int x2, float y2, color col, string txt, bool below) =>
if showLines
line.new(x1, y1, x2, y2, xloc = xloc.bar_index, color = col, width = 2)
if showLabels
label.new(x2, y2, txt, xloc = xloc.bar_index, color = col, textcolor = color.white, style = below ? label.style_label_up : label.style_label_down, size = size.small)
true
pivotBar = bar_index - lbR
// ── Lows: bullish divergences ────────────────────────────────────────────────
if not na(pl)
pxLow = low[lbR]
if not na(lastLowBar)
gap = pivotBar - lastLowBar
if gap >= minGap and gap <= maxGap
lowZoneOk = not useLevels or (lastLowRsi <= osLevel and pl > osLevel)
if showRegBull and pxLow < lastLowPx and pl > lastLowRsi and lowZoneOk
regBull := true
drawDiv(lastLowBar, lastLowRsi, pivotBar, pl, colRegBull, "Bull", true)
if showHidBull and pxLow > lastLowPx and pl < lastLowRsi
hidBull := true
drawDiv(lastLowBar, lastLowRsi, pivotBar, pl, colHidBull, "H Bull", true)
lastLowRsi := pl
lastLowPx := pxLow
lastLowBar := pivotBar
// ── Highs: bearish divergences ───────────────────────────────────────────────
if not na(ph)
pxHigh = high[lbR]
if not na(lastHighBar)
gap = pivotBar - lastHighBar
if gap >= minGap and gap <= maxGap
highZoneOk = not useLevels or (lastHighRsi >= obLevel and ph < obLevel)
if showRegBear and pxHigh > lastHighPx and ph < lastHighRsi and highZoneOk
regBear := true
drawDiv(lastHighBar, lastHighRsi, pivotBar, ph, colRegBear, "Bear", false)
if showHidBear and pxHigh < lastHighPx and ph > lastHighRsi
hidBear := true
drawDiv(lastHighBar, lastHighRsi, pivotBar, ph, colHidBear, "H Bear", false)
lastHighRsi := ph
lastHighPx := pxHigh
lastHighBar := pivotBar
// ── Plots ────────────────────────────────────────────────────────────────────
hObLine = hline(obLevel, "Overbought", color = #8993AA, linestyle = hline.style_dashed)
hMidLine = hline(50, "Middle", color = color.new(#8993AA, 60), linestyle = hline.style_dotted)
hOsLine = hline(osLevel, "Oversold", color = #8993AA, linestyle = hline.style_dashed)
fill(hObLine, hOsLine, color = color.new(#8993AA, 92), title = "Background")
plot(rsi, "RSI", color = colRsi, linewidth = 2)
// Small markers on the confirmed pivots (drawn on the pivot bar, not on the confirmation bar).
plot(showPivots and not na(pl) ? rsi[lbR] : na, "Pivot low", color = color.new(colRegBull, 0), style = plot.style_circles, linewidth = 3, offset = -lbR)
plot(showPivots and not na(ph) ? rsi[lbR] : na, "Pivot high", color = color.new(colRegBear, 0), style = plot.style_circles, linewidth = 3, offset = -lbR)
// ── Alerts (fire when the divergence is confirmed) ───────────────────────────
alertcondition(regBull, "Regular bullish divergence", "Regular bullish RSI divergence on {{ticker}} ({{interval}})")
alertcondition(regBear, "Regular bearish divergence", "Regular bearish RSI divergence on {{ticker}} ({{interval}})")
alertcondition(hidBull, "Hidden bullish divergence", "Hidden bullish RSI divergence on {{ticker}} ({{interval}})")
alertcondition(hidBear, "Hidden bearish divergence", "Hidden bearish RSI divergence on {{ticker}} ({{interval}})")
alertcondition(regBull or regBear or hidBull or hidBear, "Any divergence", "RSI divergence on {{ticker}} ({{interval}})")
Cómo leerlo
Ideas de uso con fines educativos. No son señales ni recomendaciones.
Contexto
- Una divergencia habla del impulso, no del precio. El precio puede seguir en la misma dirección después de una, sobre todo en tendencias fuertes.
- Fíjate en dónde aparece: una divergencia en un nivel que ya vigilas (un máximo o mínimo anterior, un soporte o una resistencia) tiene más contexto que una en medio de la nada.
Cómo reducir el ruido
- Usa el filtro de niveles para quedarte con las que empiezan en sobrecompra o sobreventa.
- Sube el valor de “Pivot bars to the right” o usa un marco temporal mayor. Salen menos divergencias, pero más claras.
Importante. Una divergencia no es una señal. Define tu plan y tu riesgo antes de operar, y prueba cualquier idea en simulación.
Ajustes del indicador
Los valores que trae por defecto. Los nombres aparecen en inglés en TradingView.
RSI
Período del RSI.
Precio sobre el que se calcula el RSI.
Pivotes
Barras a la izquierda que deben ser más bajas (en un mínimo) o más altas (en un máximo) que el pivote.
Barras a la derecha necesarias para confirmar el pivote. La divergencia aparece con ese retraso. Valores menores reaccionan antes, con más ruido.
Distancia mínima entre los dos pivotes que se comparan.
Distancia máxima. Si pasan más barras, no se comparan.
Tipos de divergencia
Las divergencias regulares, que se interpretan como posible pérdida de impulso.
Las divergencias ocultas, que se interpretan como posible continuación de la tendencia.
Filtro de niveles
Con el filtro, una bajista exige que el primer máximo del RSI esté en el nivel de sobrecompra o por encima, y que el segundo quede por debajo. Una alcista, lo mismo con el mínimo y la sobreventa. No afecta a las ocultas.
Los niveles de sobrecompra y de sobreventa. También dibujan las líneas del RSI.
Estilo
Línea sobre el RSI que une los dos pivotes y etiqueta con el tipo (Bull, Bear, H Bull, H Bear).
Marca con un punto los pivotes ya confirmados, aunque no formen divergencia.
Un color por cada tipo de divergencia y otro para la línea del RSI.
Limitaciones
- Cada divergencia aparece con un retraso igual al valor de “Pivot bars to the right”, porque el pivote necesita ese tiempo para confirmarse.
- Los pivotes se calculan sobre el RSI. El precio que se compara es el mínimo o el máximo de esa misma vela.
- Solo compara cada pivote con el anterior del mismo tipo. No revisa si el precio o el RSI cruzaron algún nivel entre los dos pivotes.
- En marcos temporales bajos y en mercados laterales salen muchas divergencias que no llevan a ninguna parte.
- Dibuja un máximo de 100 líneas y 100 etiquetas a la vez, así que en gráficos con mucho historial solo se ven las más recientes.
Preguntas frecuentes
¿Es gratis?
Sí. Es gratuito y de código abierto, con licencia Mozilla Public License 2.0.
¿Da señales de compra o de venta?
No. Marca divergencias entre el precio y el RSI. Qué hacer con ellas depende de tu plan y de tu gestión del riesgo. Una divergencia no garantiza que el precio cambie de dirección.
¿Por qué la divergencia aparece unas barras después?
Porque un pivote solo se confirma cuando pasan unas barras a su derecha (5 por defecto). Es el precio de no repintar: una vez dibujada, la divergencia no se mueve ni desaparece. Puedes bajar ese valor para que reaccione antes, a cambio de más ruido.
¿Repinta?
No. Solo dibuja divergencias con pivotes ya confirmados, y una vez dibujada no cambia. El precio de eso es el retraso de unas barras que explicamos arriba.
¿En qué mercados y marcos temporales funciona?
En cualquier símbolo y marco temporal. No necesita datos de volumen. En marcos bajos salen muchas más divergencias y con más ruido.
¿Por qué no veo divergencias ocultas?
Vienen desactivadas. Actívalas en los ajustes, en el grupo "Divergence types".
¿Puedo crear alertas?
Sí. Incluye alertas para cada uno de los cuatro tipos y una para cualquier divergencia. Se crean desde el botón de alertas de TradingView, eligiendo este indicador.
¿Por qué no está publicado en TradingView?
Porque TradingView exige un plan de pago para publicar scripts. Por eso lo distribuimos desde aquí, con el código completo y abierto. Puedes usarlo con una cuenta gratuita.
¿Por qué las etiquetas y los ajustes están en inglés?
Porque así los muestra el script en TradingView, con los nombres que lleva el código.
Créditos y licencia
La detección de divergencias con pivotes del RSI es una técnica conocida y muy extendida entre los usuarios de TradingView. Este código lo escribimos desde cero en TradingFondeo, sin copiar el de otros autores. El filtro de niveles es nuestro añadido.
Licencia: Mozilla Public License 2.0. Puedes usarlo y modificarlo según sus términos, conservando los avisos de autoría y compartiendo el código modificado bajo la misma licencia.
Aviso de riesgo. Operar futuros conlleva un riesgo alto de pérdida y no es adecuado para todos. Este indicador es una herramienta educativa: no da señales de compra ni de venta, no es asesoría financiera y los resultados pasados no garantizan resultados futuros. Pruébalo primero en una cuenta de simulación.