OPEN-SOURCE SCRIPT

ULTRA RSI 2025

565
//version=6
indicator(title="ULTRA RSI 2025", shorttitle="ULTRA RSI 2025", format=format.price, precision=2)

// ==================== CONFIGURAÇÃO VISUAL FUTURISTA ====================
cyberTheme = input.string("IC", title="🎨 Tema Visual", options=["IC", "Matrix Green", "Tron Orange", "Blade Runner Pink"], group="🎨 Visual Settings")
showGradients = input.bool(true, title="🎨 Exibir Preenchimentos em Gradiente", group="🎨 Visual Settings")
glowIntensity = input.float(0.3, title="🎨 Intensidade do Brilho", minval=0.0, maxval=1.0, step=0.1, group="🎨 Visual Settings")

// Cores para hline (usando input.color)
overboughtColor = input.color(color.new(#ff0000, 20), title="📈 Cor Sobrevendido", group="🎨 Visual Settings")
oversoldColor = input.color(color.new(#31fc09, 20), title="📉 Cor Sobrecomprado", group="🎨 Visual Settings")
midlineColor = input.color(color.new(#ffffff, 81), title="⚡ Cor da Linha Média", group="🎨 Visual Settings")

// ==================== CORES FUTURISTAS ====================
getThemeColors() =>
switch cyberTheme
"IC" =>
[color.new(#ff0000, 0), color.new(#0371d8, 0), color.new(#da2808, 30), color.new(#9D4EDD, 30)]
"Matrix Green" =>
[color.new(#00ce33, 0), color.new(#008F11, 0), color.new(#00FF41, 30), color.new(#008F11, 30)]
"Tron Orange" =>
[color.new(#FF6600, 0), color.new(#FF3300, 0), color.new(#FF6600, 30), color.new(#FF3300, 30)]
"Blade Runner Pink" =>
[color.new(#FF1493, 0), color.new(#FF69B4, 0), color.new(#FF1493, 30), color.new(#FF69B4, 30)]
=>
[color.new(#ff0000, 0), color.new(#00ff0d, 0), color.new(#00D4FF, 30), color.new(#9D4EDD, 30)]

[neonPrimary, neonSecondary, glowPrimary, glowSecondary] = getThemeColors()


// Colores adicionales cyber
cyberGreen = color.new(#39FF14, 0)
cyberRed = color.new(#FF073A, 0)
darkCyber = color.new(#0D1117, 0)
neonWhite = color.new(#FFFFFF, 0)

// ==================== CÓDIGO RSI ORIGINAL (SIN MODIFICAR) ====================
rsiLengthInput = input.int(14, minval=1, title=" RSI Length", group=" RSI Settings")
rsiSourceInput = input.source(close, " Source", group=" RSI Settings")
calculateDivergence = input.bool(false, title=" Calculate Divergence", group=" RSI Settings", display = display.data_window, tooltip = "Calculating divergences is needed in order for divergence alerts to fire.")

change = ta.change(rsiSourceInput)
up = ta.rma(math.max(change, 0), rsiLengthInput)
down = ta.rma(-math.min(change, 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

// ==================== VISUAL FUTURISTA ====================
// Color dinámico para el RSI
getRsiColor(rsiValue) =>
if rsiValue >= 80
neonPrimary // Azul neón para sobrecomprado
else if rsiValue >= 70
color.new(neonPrimary, 30)
else if rsiValue <= 20
cyberRed // Rojo cyber para sobrevendido
else if rsiValue <= 30
color.new(cyberRed, 30)
else if rsiValue > 50
color.new(cyberGreen, 40)
else
color.new(neonSecondary, 50)

rsiColor = getRsiColor(rsi)
glowColor = color.new(rsiColor, math.round(100 - glowIntensity * 100))

// Plot RSI con efecto glow futurista
rsiPlot = plot(rsi, "🔮 Cyber RSI", color=rsiColor, linewidth=3)
plot(rsi, "✨ RSI Glow 1", color=glowColor, linewidth=5)
plot(rsi, "✨ RSI Glow 2", color=color.new(rsiColor, 90), linewidth=7)

// Líneas de banda con estilo cyber
rsiUpperBand = hline(70, "🔥 Cyber Overbought", color=overboughtColor, linestyle=hline.style_dashed, linewidth=2)
midline = hline(50, " Cyber Midline", color=midlineColor, linestyle=hline.style_dotted)
rsiLowerBand = hline(30, "❄️ Cyber Oversold", color=oversoldColor, linestyle=hline.style_dashed, linewidth=2)

// Background fills futuristas
midLinePlot = plot(50, color = na, editable = false, display = display.none)

// Fill condicional usando operador ternario
backgroundFillColor = showGradients ? color.new(darkCyber, 90) : na
overboughtFillColor = showGradients ? color.new(neonPrimary, 0) : na
overboughtFillColorBottom = showGradients ? color.new(neonPrimary, 100) : na
oversoldFillColorTop = showGradients ? color.new(neonSecondary, 100) : na
oversoldFillColorBottom = showGradients ? color.new(neonSecondary, 0) : na

fill(rsiUpperBand, rsiLowerBand, color=backgroundFillColor, title="🌃 Cyber Background")
fill(rsiPlot, midLinePlot, 100, 70, top_color = overboughtFillColor, bottom_color = overboughtFillColorBottom, title = "🌌 Cyber Overbought Zone")
fill(rsiPlot, midLinePlot, 30, 0, top_color = oversoldFillColorTop, bottom_color = oversoldFillColorBottom, title = "🌌 Cyber Oversold Zone")

// ==================== SMOOTHING MA (CÓDIGO ORIGINAL) ====================
GRP = "🌊 Smoothing"
TT_BB = "Only applies when 'SMA + Bollinger Bands' is selected. Determines the distance between the SMA and the bands."
maTypeInput = input.string("SMA", "Type", options = ["None", "SMA", "SMA + Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = GRP, display = display.data_window)
maLengthInput = input.int(14, "Length", group = GRP, display = display.data_window)
bbMultInput = input.float(2.0, "BB StdDev", minval = 0.001, maxval = 50, step = 0.5, tooltip = TT_BB, group = GRP, display = display.data_window)
var enableMA = maTypeInput != "None"
var isBB = maTypeInput == "SMA + Bollinger Bands"

// Smoothing MA Calculation (CÓDIGO ORIGINAL)
ma(source, length, MAtype) =>
switch MAtype
"SMA" => ta.sma(source, length)
"SMA + Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)

// Smoothing MA plots con colores cyber
smoothingMA = enableMA ? ma(rsi, maLengthInput, maTypeInput) : na
smoothingStDev = isBB ? ta.stdev(rsi, maLengthInput) * bbMultInput : na
plot(smoothingMA, "🌊 Cyber MA", color=color.new(color.yellow, 0), linewidth=2, display = enableMA ? display.all : display.none, editable = enableMA)
bbUpperBand = plot(smoothingMA + smoothingStDev, title = "🔺 Upper Cyber Band", color=neonPrimary, linewidth=2, display = isBB ? display.all : display.none, editable = isBB)
bbLowerBand = plot(smoothingMA - smoothingStDev, title = "🔻 Lower Cyber Band", color=neonSecondary, linewidth=2, display = isBB ? display.all : display.none, editable = isBB)

// Fill para Bollinger Bands
bbFillColor = isBB ? color.new(neonPrimary, 90) : na
fill(bbUpperBand, bbLowerBand, color=bbFillColor, title="🌌 Cyber Bollinger Fill", display = isBB ? display.all : display.none, editable = isBB)

// ==================== DIVERGENCE (CÓDIGO ORIGINAL CORREGIDO) ====================
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = cyberRed
bullColor = cyberGreen
textColor = neonWhite
noneColor = color.new(color.white, 100)

// Función _inRange calculada en cada barra
_inRange(bool cond) =>
bars = ta.barssince(cond)
rangeLower <= bars and bars <= rangeUpper

plFound = false
phFound = false

bullCond = false
bearCond = false

rsiLBR = rsi[lookbackRight]

// Calcular _inRange en cada barra para evitar inconsistencias
plFoundPrev = not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight)[1])
phFoundPrev = not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight)[1])
inRangeBull = _inRange(plFoundPrev)
inRangeBear = _inRange(phFoundPrev)

if calculateDivergence
//------------------------------------------------------------------------------
// Regular Bullish
// rsi: Higher Low
plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight))
rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and inRangeBull
// Price: Lower Low
lowLBR = low[lookbackRight]
priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1)
bullCond := priceLL and rsiHL and plFound

//------------------------------------------------------------------------------
// Regular Bearish
// rsi: Lower High
phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight))
rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and inRangeBear
// Price: Higher High
highLBR = high[lookbackRight]
priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1)
bearCond := priceHH and rsiLH and phFound

// Divergence plots con estilo cyber
plot(
plFound ? rsiLBR : na,
offset = -lookbackRight,
title = "🚀 Cyber Bull Divergence",
linewidth = 3,
color = (bullCond ? bullColor : noneColor),
display = display.pane,
editable = calculateDivergence)

plotshape(
bullCond ? rsiLBR : na,
offset = -lookbackRight,
title = "🚀 Cyber Bull Signal",
text = "🚀 BULL",
style = shape.labelup,
location = location.absolute,
color = bullColor,
textcolor = textColor,
size = size.normal,
display = display.pane,
editable = calculateDivergence)

plot(
phFound ? rsiLBR : na,
offset = -lookbackRight,
title = "🔻 Cyber Bear Divergence",
linewidth = 3,
color = (bearCond ? bearColor : noneColor),
display = display.pane,
editable = calculateDivergence)

plotshape(
bearCond ? rsiLBR : na,
offset = -lookbackRight,
title = "🔻 Cyber Bear Signal",
text = "🔻 BEAR",
style = shape.labeldown,
location = location.absolute,
color = bearColor,
textcolor = textColor,
size = size.normal,
display = display.pane,
editable = calculateDivergence)

// ==================== TABLA DE INFORMACIÓN CYBER ====================
// Calcular ta.change en cada barra para consistencia
rsiChange3 = ta.change(rsi, 3)

if barstate.islast
var table infoTable = table.new(position.top_right, 2, 5,
bgcolor=color.new(darkCyber, 10),
border_width=2,
border_color=neonPrimary,
frame_width=3,
frame_color=neonSecondary)

table.clear(infoTable, 0, 0, 1, 4)

table.cell(infoTable, 0, 0, " ULTRA RSI", bgcolor=neonPrimary, text_color=neonWhite, text_size=size.small)
table.cell(infoTable, 1, 0, " INFO", bgcolor=neonSecondary, text_color=neonWhite, text_size=size.small)

table.cell(infoTable, 0, 1, " VALOR RSI", bgcolor=color.new(darkCyber, 30), text_color=neonPrimary, text_size=size.small)
table.cell(infoTable, 1, 1, str.tostring(math.round(rsi, 2)), bgcolor=color.new(darkCyber, 30), text_color=neonWhite, text_size=size.small)

rsiStatus = rsi >= 70 ? " SOBRENDIDO" : rsi <= 30 ? " SOBRECOMPRADO" : " NEUTRO"
statusColor = rsi >= 70 ? cyberRed : rsi <= 30 ? cyberGreen : neonWhite
table.cell(infoTable, 0, 2, " MOMENTO", bgcolor=color.new(darkCyber, 30), text_color=neonSecondary, text_size=size.small)
table.cell(infoTable, 1, 2, rsiStatus, bgcolor=color.new(darkCyber, 30), text_color=statusColor, text_size=size.small)

if enableMA
table.cell(infoTable, 0, 3, " EMA RSI", bgcolor=color.new(darkCyber, 30), text_color=neonPrimary, text_size=size.small)
table.cell(infoTable, 1, 3, str.tostring(math.round(smoothingMA, 2)), bgcolor=color.new(darkCyber, 30), text_color=neonWhite, text_size=size.small)

momentum = rsiChange3 > 0 ? " SUBINDO" : " CAINDO"
momentumColor = rsiChange3 > 0 ? cyberGreen : cyberRed
table.cell(infoTable, 0, 4, " TENDÊNCIA", bgcolor=color.new(darkCyber, 30), text_color=neonPrimary, text_size=size.small)
table.cell(infoTable, 1, 4, momentum, bgcolor=color.new(darkCyber, 30), text_color=momentumColor, text_size=size.small)

// ==================== ALERTS (CÓDIGO ORIGINAL) ====================
alertcondition(bullCond, title='🚀 Cyber Bullish Divergence', message="🎯 Found a new Cyber Bullish Divergence!")
alertcondition(bearCond, title='🔻 Cyber Bearish Divergence', message='🎯 Found a new Cyber Bearish Divergence!')

Declinazione di responsabilità

Le informazioni ed i contenuti pubblicati non costituiscono in alcun modo una sollecitazione ad investire o ad operare nei mercati finanziari. Non sono inoltre fornite o supportate da TradingView. Maggiori dettagli nelle Condizioni d'uso.