//@version=5 strategy("Candlestick Closure Breakout Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=10) // Inputs length = input.int(20, title="Swing High/Low Lookback Length", minval=5) rr_ratio = input.float(1.5, title="Risk/Reward Ratio", minval=0.5) use_atr_sl = input.bool(true, title="Use ATR Buffer for Stop Loss?") atr_length = input.int(14, title="ATR Length") atr_multiplier = input.float(1.5, title="ATR Multiplier") // Calculations (using past historical data, offsetting by 1 to exclude current bar) swing_high = ta.highest(high, length)[1] swing_low = ta.lowest(low, length)[1] atr = ta.atr(atr_length) // Plot Swing Points plot(swing_high, color=color.green, title="Swing High Level", style=plot.style_stepline) plot(swing_low, color=color.red, title="Swing Low Level", style=plot.style_stepline) // Breakout Confirmation based strictly on candle closure // A clean breakout and close is validated when the current candle closes strictly past the swing levels, // and the previous candle closed within or on the levels. long_breakout = ta.crossover(close, swing_high) short_breakout = ta.crossunder(close, swing_low) // Target and Stop Management var float long_sl = na var float long_tp = na var float short_sl = na var float short_tp = na if (long_breakout and strategy.position_size == 0) // Establish dynamic Stop Loss at swing low, or with ATR buffer calculated_sl = use_atr_sl ? swing_low - (atr * atr_multiplier) : swing_low long_sl := math.min(calculated_sl, close - (atr * 0.5)) // Guard rail to prevent zero risk risk = close - long_sl long_tp := close + (risk * rr_ratio) strategy.entry("Long Breakout", strategy.long) strategy.exit("Exit Long", "Long Breakout", stop=long_sl, limit=long_tp) if (short_breakout and strategy.position_size == 0) // Establish dynamic Stop Loss at swing high, or with ATR buffer calculated_sl = use_atr_sl ? swing_high + (atr * atr_multiplier) : swing_high short_sl := math.max(calculated_sl, close + (atr * 0.5)) // Guard rail risk = short_sl - close short_tp := close - (risk * rr_ratio) strategy.entry("Short Breakout", strategy.short) strategy.exit("Exit Short", "Short Breakout", stop=short_sl, limit=short_tp)