RSI MTF Ob+Os
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © thakon33
//    __  __        __             ____ ____
//   / /_/ /  ___ _/ /_____  ___  |_  /|_  /
//  / __/ _ \/ _ `/  '_/ _ \/ _ \_/_ <_/_ < 
//  \__/_//_/\_,_/_/\_\\___/_//_/____/____/ 

//@version=5
indicator("RSI MTF Ob+Os")

//------------------------------------------------------------------------------
// Input
var g_rsi       = "[ RSI SETTING ]"
rsiSrc          = input    (title="Source",     defval=close,                                group=g_rsi)
rsiLength       = input.int(title="Length",     defval=14,     minval=1,                     group=g_rsi)
rsiOverbought   = input.int(title="Overbought", defval=65,     minval=50, maxval=99, step=1, group=g_rsi)
rsiOversold     = input.int(title="Oversold",   defval=35,     minval=1,  maxval=50, step=1, group=g_rsi)


var g_tf        = "[ SELECT TIMEFRAME ]"
rsiTf1          = input.timeframe(title="Timeframe 1", defval="15",  group=g_tf, inline="tf1")
rsiTf2          = input.timeframe(title="Timeframe 2", defval="30",  group=g_tf, inline="tf2")
rsiTf3          = input.timeframe(title="Timeframe 3", defval="60",  group=g_tf, inline="tf3")
rsiTf4          = input.timeframe(title="Timeframe 4", defval="120", group=g_tf, inline="tf4")
rsiTf5          = input.timeframe(title="Timeframe 5", defval="240", group=g_tf, inline="tf5")
rsiTf1_E        = input.bool(title="", defval=true, group=g_tf, inline="tf1")
rsiTf2_E        = input.bool(title="", defval=true, group=g_tf, inline="tf2")
rsiTf3_E        = input.bool(title="", defval=true, group=g_tf, inline="tf3")
rsiTf4_E        = input.bool(title="", defval=true, group=g_tf, inline="tf4")
rsiTf5_E        = input.bool(title="", defval=true, group=g_tf, inline="tf5")


//------------------------------------------------------------------------------
// Calculate RSI

Fsec(Sym, Tf, Exp) =>
    request.security(Sym, Tf, Exp[barstate.isrealtime ? 1 : 0], barmerge.gaps_off, barmerge.lookahead_off) [barstate.isrealtime ? 0 : 1]

rsi1            = Fsec(syminfo.tickerid, rsiTf1, ta.rsi(rsiSrc, rsiLength))
rsi2            = Fsec(syminfo.tickerid, rsiTf2, ta.rsi(rsiSrc, rsiLength))
rsi3            = Fsec(syminfo.tickerid, rsiTf3, ta.rsi(rsiSrc, rsiLength))
rsi4            = Fsec(syminfo.tickerid, rsiTf4, ta.rsi(rsiSrc, rsiLength))
rsi5            = Fsec(syminfo.tickerid, rsiTf5, ta.rsi(rsiSrc, rsiLength))


//------------------------------------------------------------------------------
// RSI Overbought and Oversold detect

rsi1_Ob         = not rsiTf1_E or rsi1 >= rsiOverbought 
rsi2_Ob         = not rsiTf2_E or rsi2 >= rsiOverbought
rsi3_Ob         = not rsiTf3_E or rsi3 >= rsiOverbought
rsi4_Ob         = not rsiTf4_E or rsi4 >= rsiOverbought
rsi5_Ob         = not rsiTf5_E or rsi5 >= rsiOverbought

rsi1_Os         = not rsiTf1_E or rsi1 <= rsiOversold
rsi2_Os         = not rsiTf2_E or rsi2 <= rsiOversold
rsi3_Os         = not rsiTf3_E or rsi3 <= rsiOversold
rsi4_Os         = not rsiTf4_E or rsi4 <= rsiOversold
rsi5_Os         = not rsiTf5_E or rsi5 <= rsiOversold

rsiOb           = rsi1_Ob and rsi2_Ob and rsi3_Ob and rsi4_Ob and rsi5_Ob
rsiOs           = rsi1_Os and rsi2_Os and rsi3_Os and rsi4_Os and rsi5_Os


//------------------------------------------------------------------------------
// Drawing on chart
plot    (rsiTf1_E ? rsi1 : na, title="TF 1",            color=color.rgb(255, 205, 22, 20),                                linewidth=1)
plot    (rsiTf2_E ? rsi2 : na, title="TF 2",            color=color.rgb(255, 22, 239, 20),                                linewidth=1)
plot    (rsiTf3_E ? rsi3 : na, title="TF 3",            color=color.rgb(38, 22, 255, 0),                                  linewidth=1)
plot    (rsiTf4_E ? rsi4 : na, title="TF 4",            color=color.rgb(123, 253, 22, 20),                                linewidth=1)
plot    (rsiTf5_E ? rsi5 : na, title="TF 5",            color=color.rgb(255, 255, 255, 50),                               linewidth=1)
hline   (rsiOverbought,        title="RSI Overbought",  color=color.new(color.red, 30),     linestyle=hline.style_dashed, linewidth=1)
hline   (rsiOversold,          title="RSI Overbought",  color=color.new(color.green, 30),   linestyle=hline.style_dashed, linewidth=1)

bgcolor (rsiOb ? color.new(color.orange, 0) : na, title="Overbought")
bgcolor (rsiOs ? color.new(color.aqua,   0) : na, title="Oversold")


//------------------------------------------------------------------------------
// Alert
alertcondition(rsiOb, title="RSI Overbought", message="RSI Overbought for {{ticker}} - Price = {{close}}")
alertcondition(rsiOs, title="RSI Oversold",   message="RSI Oversold for {{ticker}} - Price = {{close}}")


//==============================================================================
//==============================================================================
