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.

GratisCódigo abierto · MPL 2.0Pine Script v6TradingView

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.

Gráfico de 5 minutos del Micro E-mini Nasdaq-100 con el indicador RSI Divergence en el panel inferior: dos divergencias bajistas regulares marcadas en rojo con la etiqueta Bear y tres alcistas regulares marcadas en verde con la etiqueta Bull
Captura real con los ajustes por defecto: Micro E-mini Nasdaq-100 (MNQ), gráfico de 5 minutos. En rojo, divergencias bajistas regulares (Bear). En verde, alcistas regulares (Bull).
Gráfico de 5 minutos del Micro E-mini Nasdaq-100 con el indicador RSI Divergence con las divergencias ocultas activadas: etiquetas H Bear en ámbar junto a las regulares Bull y Bear
La misma herramienta con las divergencias ocultas activadas: las etiquetas ámbar H Bear son bajistas ocultas. Son ejemplos de cómo se ve, no recomendaciones de operar.
PRECIO Mínimo más bajo RSI 7030 Mínimo más alto Bull
Alcista regularBajista regularAlcista ocultaBajista oculta

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.

  1. Copia el código. Usa el botón de abajo.
  2. 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.
  3. Pega el código y guárdalo. Pulsa Guardar y ponle un nombre. Después, Añadir al gráfico.
  4. Revisa los ajustes. Por defecto muestra las regulares sin filtro. Activa las ocultas o el filtro de niveles si quieres.
  5. 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

RSI lengthPor defecto: 14

Período del RSI.

SourcePor defecto: Close

Precio sobre el que se calcula el RSI.

Pivotes

Pivot bars to the leftPor defecto: 5

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.

Pivot bars to the rightPor defecto: 5

Barras a la derecha necesarias para confirmar el pivote. La divergencia aparece con ese retraso. Valores menores reaccionan antes, con más ruido.

Min bars between pivotsPor defecto: 5

Distancia mínima entre los dos pivotes que se comparan.

Max bars between pivotsPor defecto: 60

Distancia máxima. Si pasan más barras, no se comparan.

Tipos de divergencia

Regular bullish · Regular bearishPor defecto: Activadas

Las divergencias regulares, que se interpretan como posible pérdida de impulso.

Hidden bullish · Hidden bearishPor defecto: Desactivadas

Las divergencias ocultas, que se interpretan como posible continuación de la tendencia.

Filtro de niveles

Only regular divergences that start in the extreme zonePor defecto: Desactivado

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.

Overbought level · Oversold levelPor defecto: 70 · 30

Los niveles de sobrecompra y de sobreventa. También dibujan las líneas del RSI.

Estilo

Draw divergence lines · Draw labelsPor defecto: Activados

Línea sobre el RSI que une los dos pivotes y etiqueta con el tipo (Bull, Bear, H Bull, H Bear).

Mark confirmed RSI pivotsPor defecto: Desactivado

Marca con un punto los pivotes ya confirmados, aunque no formen divergencia.

ColoresPor defecto: Verde, rojo, azul y ámbar

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.