Synthetic, Smoothed Variety RSI [Loxx]
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © loxx

//@version=5
indicator("Synthetic, Smoothed Variety RSI [Loxx]", 
     overlay = false, 
     timeframe="", 
     timeframe_gaps = true)

import loxx/loxxexpandedsourcetypes/4
import loxx/loxxvarietyrsi/1 as lxrsi

greencolor = #2DD204
redcolor = #D2042D 

rsimodeout(rsitype)=>
    rsimode = switch rsitype
        "RSX" => "rsi_rsx"
        "Regular" => "rsi_rsi"
        "Slow" => "rsi_slo"
        "Rapid" => "rsi_rap"
        "Harris" => "rsi_har"
        "Cuttler" => "rsi_cut"
        "Ehlers Smoothed" => "rsi_ehl"
        => "rsi_rsi"
    rsimode

smthtype = input.string("Kaufman", "HAB Calc Type", options = ["AMA", "T3", "Kaufman"], group='Source Settings')
srcin = input.string("Close", "Source", 
	 options = 
	 ["Close", "Open", "High", "Low", "Median", "Typical", "Weighted", "Average", "Average Median Body", "Trend Biased", "Trend Biased (Extreme)", 
	 "HA Close", "HA Open", "HA High", "HA Low", "HA Median", "HA Typical", "HA Weighted", "HA Average", "HA Average Median Body", "HA Trend Biased", "HA Trend Biased (Extreme)",
	 "HAB Close", "HAB Open", "HAB High", "HAB Low", "HAB Median", "HAB Typical", "HAB Weighted", "HAB Average", "HAB Average Median Body", "HAB Trend Biased", "HAB Trend Biased (Extreme)"], 
	 group='Source Settings')
     
inpEmaPeriod1 = input.int(48, "EMA 1 Period", group = "Basic Settings")
inpRsiPeriod1 = input.int(32, "RSI 1 Period", group = "Basic Settings")
inpEmaPeriod2 = input.int(24, "EMA 2 Period", group = "Basic Settings")
inpRsiPeriod2 = input.int(16, "RSI 2 Period", group = "Basic Settings")
inpEmaPeriod3 = input.int(12, "EMA 3 Period", group = "Basic Settings")
inpRsiPeriod3 =  input.int(8, "RSI 3 Period", group = "Basic Settings")
inpSignalPeriod = input.int(8, "Signal Period", group = "Basic Settings")

rsitype = input.string("Ehlers Smoothed", "RSI type", options = ["RSX", "Regular", "Slow", "Rapid", "Harris", "Cuttler", "Ehlers Smoothed"], group = "Basic Settings")

colorBars = input.bool(true, "Color bars?", group = "UI Options")
showSigs = input.bool(true, "Show Signals?", group = "UI Options")

kfl = input.float(0.666, title="* Kaufman's Adaptive MA (KAMA) Only - Fast End", group = "Moving Average Inputs")
ksl = input.float(0.0645, title="* Kaufman's Adaptive MA (KAMA) Only - Slow End", group = "Moving Average Inputs")
amafl = input.int(2, title="* Adaptive Moving Average (AMA) Only - Fast", group = "Moving Average Inputs")
amasl = input.int(30, title="* Adaptive Moving Average (AMA) Only - Slow", group = "Moving Average Inputs")
t3hot = input.float(.7, "* T3 Only - T3 Hot", group = "Moving Average Inputs")
t3swt = input.string("T3 New", "* T3 Only - T3 Type", options = ["T3 New", "T3 Original"], group = "Moving Average Inputs")

haclose  =  ohlc4
haopen   = float(na)
haopen  := na(haopen[1]) ? (open + close) / 2 : (nz(haopen[1]) + nz(haclose[1])) / 2
hahigh   =math.max(high, math.max(haopen, haclose))
halow    = math.min(low,  math.min(haopen, haclose))
hamedian = (hahigh + halow) / 2
hatypical = (hahigh + halow + haclose) / 3
haweighted =  (hahigh + halow + haclose + haclose)/4 
haaverage =  (haopen + hahigh + halow + haclose)/4

sourceout(smthtype, srcin)=>
	src = switch srcin
		"Close" => close
		"Open" => open
		"High" => high
		"Low" => low
		"Median" => hl2
		"Typical" => hlc3
		"Weighted" => hlcc4
		"Average" => ohlc4
		"Average Median Body" => (open + close)/2
		"Trend Biased" => loxxexpandedsourcetypes.rtrendb()
		"Trend Biased (Extreme)" => loxxexpandedsourcetypes.rtrendbext()
		"HA Close" => loxxexpandedsourcetypes.haclose(haclose)
		"HA Open" => loxxexpandedsourcetypes.haopen(haopen)
		"HA High" => loxxexpandedsourcetypes.hahigh(hahigh)
		"HA Low" => loxxexpandedsourcetypes.halow(halow)
		"HA Median" => loxxexpandedsourcetypes.hamedian(hamedian)
		"HA Typical" => loxxexpandedsourcetypes.hatypical(hatypical)
		"HA Weighted" => loxxexpandedsourcetypes.haweighted(haweighted)
		"HA Average" => loxxexpandedsourcetypes.haaverage(haaverage)
		"HA Average Median Body" => loxxexpandedsourcetypes.haavemedbody(haclose, haopen)
		"HA Trend Biased" => loxxexpandedsourcetypes.hatrendb(haclose, haopen, hahigh, halow)
		"HA Trend Biased (Extreme)" => loxxexpandedsourcetypes.hatrendbext(haclose, haopen, hahigh, halow)
		"HAB Close" => loxxexpandedsourcetypes.habclose(smthtype, amafl, amasl, kfl, ksl)
		"HAB Open" => loxxexpandedsourcetypes.habopen(smthtype, amafl, amasl, kfl, ksl)
		"HAB High" => loxxexpandedsourcetypes.habhigh(smthtype, amafl, amasl, kfl, ksl)
		"HAB Low" => loxxexpandedsourcetypes.hablow(smthtype, amafl, amasl, kfl, ksl)
		"HAB Median" => loxxexpandedsourcetypes.habmedian(smthtype, amafl, amasl, kfl, ksl)
		"HAB Typical" => loxxexpandedsourcetypes.habtypical(smthtype, amafl, amasl, kfl, ksl)
		"HAB Weighted" => loxxexpandedsourcetypes.habweighted(smthtype, amafl, amasl, kfl, ksl)
		"HAB Average" => loxxexpandedsourcetypes.habaverage(smthtype, amafl, amasl, kfl, ksl)
		"HAB Average Median Body" => loxxexpandedsourcetypes.habavemedbody(smthtype, amafl, amasl, kfl, ksl)
		"HAB Trend Biased" => loxxexpandedsourcetypes.habtrendb(smthtype, amafl, amasl, kfl, ksl)
		"HAB Trend Biased (Extreme)" => loxxexpandedsourcetypes.habtrendbext(smthtype, amafl, amasl, kfl, ksl)
		=> close

rsi1 = lxrsi.rsiVariety(rsimodeout(rsitype), ta.ema(sourceout(smthtype, srcin), inpEmaPeriod1), inpRsiPeriod1)
rsi2 = lxrsi.rsiVariety(rsimodeout(rsitype), ta.ema(sourceout(smthtype, srcin), inpEmaPeriod2), inpRsiPeriod2)
rsi3 = lxrsi.rsiVariety(rsimodeout(rsitype), ta.ema(sourceout(smthtype, srcin), inpEmaPeriod3), inpRsiPeriod3)

val = (rsi3 + 2.0 * rsi2 + 3.0 * rsi1) / 6.0
sig  = ta.ema(val, inpSignalPeriod)

colorout = val > sig ? greencolor : redcolor

plot(val, "Synthetic RSI trigger",  color = colorout, linewidth = 2)
plot(sig, "Synthetic RSI signal", color = color.white)
barcolor(colorBars ? colorout : na)

goLong =  ta.crossover(val, sig)  
goShort = ta.crossunder(val, sig)  

plotshape(showSigs and goLong, title = "Long", color = color.yellow, textcolor = color.yellow, text = "L", style = shape.triangleup, location = location.bottom, size = size.auto)
plotshape(showSigs and goShort, title = "Short", color = color.fuchsia, textcolor = color.fuchsia, text = "S", style = shape.triangledown, location = location.top, size = size.auto)

alertcondition(goLong, title="Long", message="Synthetic, Smoothed Variety RSI [Loxx]: Long\nSymbol: {{ticker}}\nPrice: {{close}}")
alertcondition(goShort, title="Short", message="Synthetic, Smoothed Variety RSI [Loxx]: Short\nSymbol: {{ticker}}\nPrice: {{close}}")