OPEN-SOURCE SCRIPT

ULTRA RSI 2025

593
//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!')

Feragatname

Bilgiler ve yayınlar, TradingView tarafından sağlanan veya onaylanan finansal, yatırım, işlem veya diğer türden tavsiye veya tavsiyeler anlamına gelmez ve teşkil etmez. Kullanım Şartları'nda daha fazlasını okuyun.