//@version=5
shorttitle="AlgoAlpha - 𝑽𝑾𝑹𝑺𝑰", format=[Link], precision=2, timeframe="",
indicator(title="Volume Weighted Relative Strength Index [AlgoAlpha]",
timeframe_gaps=true, explicit_plot_zorder = true)
rsiLengthInput = [Link](14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = [Link](close, "RSI Source", group="RSI Settings")
rangeLen = [Link](10, minval=1, title="Consolidation Detection Length",
group="RSI Settings")
enma = [Link](false, "Enable RSI MA", inline = "rsima", group = "RSI MA
Settings")
mat = [Link]("EMA", "", ["EMA", "SMA", "HMA", "SMMA (RMA)", "WMA", "VWMA"],
inline = "rsima", group = "RSI MA Settings")
malen = [Link](14, "RSI MA Length", group = "RSI MA Settings")
colorUp = [Link](#00ffbb, title="Up Color")
colorDown = [Link](#ff1100, title="Down Color")
// ── NEW: Overbought / Oversold level inputs ──────────────────────────────────
obLevel = [Link](80, title="Overbought Level", minval=50, maxval=99, group="RSI
Levels")
osLevel = [Link](20, title="Oversold Level", minval=1, maxval=50, group="RSI
Levels")
// ────────────────────────────────────────────────────────────────────────────
range_score(src, int length) =>
dir = src > 50 ? 1 : -1
dist = 1
t = dir + dir[1] == 0 ? 1 : 0
w = dist/([Link](dist, length))
p = [Link](t*w, length)
v = length/2
f = [Link](p, v) * (v + ((2/3) * v))
[Link]([Link](f, length*2),0)
ma(source, length, type) =>
switch type
"SMA" => [Link](source, length)
"HMA" => [Link](source, length)
"EMA" => [Link](source, length)
"SMMA (RMA)" => [Link](source, length)
"WMA" => [Link](source, length)
"VWMA" => [Link](source, length)
pine_vwrma(x, y) =>
[Link](x * volume, y) / [Link](volume, y)
up = pine_vwrma([Link]([Link](rsiSourceInput), 0), rsiLengthInput)
down = pine_vwrma(-[Link]([Link](rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
p = plot(rsi, histbase=50, color=chart.fg_color, title="RSI")
mid = plot(50, color=chart.fg_color, title="Mid line", linewidth = 2)
// ── NEW: Overbought / Oversold horizontal lines ──────────────────────────────
hline(obLevel, "Overbought", color=#e71405, linestyle=hline.style_dashed,
linewidth=2)
hline(osLevel, "Oversold", color=#6f00ff, linestyle=hline.style_dashed,
linewidth=2)
// ────────────────────────────────────────────────────────────────────────────
f = plot(90, display=[Link])
negf = plot(10, display=[Link])
fill(mid, f, top_value=90, bottom_value=80, bottom_color=na,
top_color=color.from_gradient(rsi, 20, 90, [Link](colorDown,100),
[Link](colorDown,40)))
fill(mid, negf, top_value=20, bottom_value=10,
bottom_color=color.from_gradient(rsi, 20, 90, [Link](colorUp,40),
[Link](colorUp,100)), top_color=na)
fill(p, mid, color=rsi > 50 ? [Link](colorUp, 90) : [Link](colorDown, 90),
title="Trend Fill")
fill(p, mid, rsi, 50, [Link](chart.bg_color, 1000), rsi > 50 ? colorUp :
colorDown)
plot((range_score(rsi, rangeLen))*50, style=plot.style_columns,
title="Consolidation Strength",
color=(range_score(rsi, rangeLen)) > (range_score(rsi, rangeLen))[1] ?
chart.fg_color : [Link](chart.fg_color, 50))
plot(ma(rsi, malen, mat), "RSI MA", #e41db2, display=enma ? [Link] :
[Link], style=plot.style_line, linewidth = 3)
plotchar([Link](rsi, obLevel) ? obLevel + 15 : na, "Bearish TP", "▼",
[Link], colorDown, size=[Link])
plotchar([Link](rsi, osLevel) ? osLevel - 15 : na, "Bullish TP", "▲",
[Link], colorUp, size=[Link])
// Alerts
alertcondition([Link](rsi, 50), "Bullish Trend Shift")
alertcondition([Link](rsi, 50), "Bearish Trend Shift")
alertcondition([Link](rsi, obLevel), "Bearish TP")
alertcondition([Link](rsi, osLevel), "Bullish TP")
alertcondition((range_score(rsi, rangeLen)) > 0 and (range_score(rsi, rangeLen))[1]
== 0, "Consolidating Market")
alertcondition([Link]((range_score(rsi, rangeLen)), (range_score(rsi,
rangeLen))[1]), "Consolidating to Trending Market")
alertcondition((range_score(rsi, rangeLen)) == 0 and (range_score(rsi, rangeLen))
[1] > 0, "Trending Market")