//@version=5
indicator("PSAR + Signals", overlay=true, shorttitle="ParabolicSar with StochasticBuy/SellSignal")

// --- Inputs ---
sar_start = input.float(0.02, "SAR start / step", step=0.01)
sar_increment = input.float(0.02, "SAR increment", step=0.01)
sar_max = input.float(0.2, "SAR max", step=0.01)

use_stoch_filter = input.bool(true, "Use Stochastic filter for stronger signals?")
stoch_klen = input.int(14, "Stochastic %K Length")
stoch_dlen = input.int(3, "Stochastic %D Smoothing")
stoch_ob = input.int(80, "Stochastic Overbought")
stoch_os = input.int(20, "Stochastic Oversold")

// --- PSAR ---
psar = ta.sar(sar_start, sar_increment, sar_max)
plot(psar, "PSAR", style=plot.style_cross, linewidth=2, offset=0, editable=true)

// --- Stochastic for filter (calculated here but not plotted) ---
lowestLow = ta.lowest(low, stoch_klen)
highestHigh = ta.highest(high, stoch_klen)
k = highestHigh != lowestLow ? 100 * (close - lowestLow) / (highestHigh - lowestLow) : 50
d = ta.sma(k, stoch_dlen)

// --- Signal logic ---
// basic trend by PSAR relative to close
psar_bull = psar < close
psar_bear = psar > close

// stoch crossover
stoch_cross_up = ta.crossover(k, d)
stoch_cross_down = ta.crossunder(k, d)

// Strong / weak signals
strong_buy = psar_bull and stoch_cross_up and k <= stoch_os
weak_buy   = psar_bull and stoch_cross_up and k > stoch_os

strong_sell = psar_bear and stoch_cross_down and k >= stoch_ob
weak_sell   = psar_bear and stoch_cross_down and k < stoch_ob

// final signal depending on whether filter is used
buy_signal  = use_stoch_filter ? (strong_buy ? true : (weak_buy ? true : false)) : (psar_bull and stoch_cross_up)
sell_signal = use_stoch_filter ? (strong_sell ? true : (weak_sell ? true : false)) : (psar_bear and stoch_cross_down)

// --- Plot signals on chart ---
plotshape(strong_buy, title="Strong Buy", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy★", textcolor=color.white, size=size.small, offset=0)
plotshape(weak_buy,   title="Weak Buy",   location=location.belowbar, color=color.lime, style=shape.triangleup, text="Buy", textcolor=color.white, size=size.tiny, offset=0)

plotshape(strong_sell, title="Strong Sell", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell★", textcolor=color.white, size=size.small, offset=0)
plotshape(weak_sell,   title="Weak Sell",   location=location.abovebar, color=color.orange, style=shape.triangledown, text="Sell", textcolor=color.white, size=size.tiny, offset=0)

// also color background optionally
bgcolor(buy_signal ? color.new(color.green, 90) : sell_signal ? color.new(color.red, 90) : na)

// --- Alerts ---
alertcondition(buy_signal,  title="PSAR+Stoch Buy",  message="PSAR+Stoch BUY signal on {{ticker}} ({{interval}})")
alertcondition(sell_signal, title="PSAR+Stoch Sell", message="PSAR+Stoch SELL signal on {{ticker}} ({{interval}})")

// info label
var label info = na
if barstate.islast
    label.delete(info)
    info := label.new(bar_index, high, "PSAR: " + str.tostring(psar, format.mintick) + "\nStoch K/D: " + str.tostring(k, "#.##") + " / " + str.tostring(d, "#.##"),
                      xloc=xloc.bar_index, yloc=yloc.price, style=label.style_label_left, color=color.new(color.gray,80), textcolor=color.white, size=size.small)
