// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © rhapsodyz
//@version=5
indicator(title="RSI with Boll", shorttitle="RSI", format=format.price, precision=2, timeframe="", timeframe_gaps=true)
rsiLength = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSource = input.source(hlc3, "RSI Source", group="RSI Settings")
rsiMALength = input.int(14, title="MA Length", group="Boll Settings")
rsiBollMult = input.float(2.0, minval=0.001, maxval=50, title="Boll StdDev", group="Boll Settings")
up = ta.rma(math.max(ta.change(rsiSource), 0), rsiLength)
down = ta.rma(-math.min(ta.change(rsiSource), 0), rsiLength)
rsi = down == 0 ? 50 : up == 0 ? -50 : 50 - (100 / (1 + up / down))
rsiMA = ta.sma(rsi, rsiMALength)
rsiDiv = (rsi - rsiMA) * 10 / (ta.stdev(rsi, rsiMALength) * rsiBollMult)
rsiBollStdev = ta.stdev(rsi, rsiMALength) * rsiBollMult
rsiBollUpper = rsiMA + rsiBollStdev
rsiBollLower = rsiMA - rsiBollStdev
rsiPlot = plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(20, "RSI Upper Band", color=#787B86)
midline = hline(0, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(-20, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(rsiBollUpper, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(rsiBollLower, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color=color.new(color.green, 90), title="Bollinger Bands Background Fill")
midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(rsiPlot, midLinePlot, 50, 20, top_color = color.new(color.green, 0), bottom_color = color.new(color.green, 100), title = "Overbought Gradient Fill")
fill(rsiPlot, midLinePlot, -20, -50, top_color = color.new(color.red, 100), bottom_color = color.new(color.red, 0), title = "Oversold Gradient Fill")
plot(rsiDiv, title = "rsiDiv", style = plot.style_columns, color = (rsiDiv >= 0 ? (rsiDiv[1] < rsiDiv ? #26A69A : #B2DFDB) : (rsiDiv[1] < rsiDiv ? #FFCDD2 : #FF5252)))