//@version=6 strategy("Frozen range retest", overlay = true, initial_capital = 10000, pyramiding = 0, default_qty_type = strategy.fixed, default_qty_value = 1, commission_type = strategy.commission.cash_per_order, commission_value = 1, slippage = 1, margin_long = 100, margin_short = 100) ceiling = input.float(25, "Frozen ceiling") floor = input.float(24, "Frozen pullback floor") start = input.time(timestamp("01 Jan 2025 00:00 +0000"), "First eligible close time") waitBars = input.int(10, "Retest window", minval = 1) life = input.int(3, "Entry life", minval = 1) reward = input.float(2, "Target R", minval = 0.1) if floor >= ceiling runtime.error("Floor must be below ceiling") var int state = 0 var int eventBar = na var float stopPrice = na var float target = na if barstate.isconfirmed and time_close >= start if state == 0 and close > ceiling state := 1 eventBar := bar_index else if state == 1 expired = bar_index - eventBar > waitBars if expired or close <= floor state := 3 else if low > floor and low <= ceiling and close > ceiling entryPrice = high + syminfo.mintick stopPrice := low - syminfo.mintick target := entryPrice + reward * (entryPrice - stopPrice) strategy.entry("L", strategy.long, stop = entryPrice) strategy.exit("X", "L", stop = stopPrice, limit = target) state := 2 eventBar := bar_index else if state == 2 and strategy.position_size == 0 expired = bar_index - eventBar >= life finished = strategy.closedtrades > 0 if expired or close <= stopPrice or finished strategy.cancel_all() state := 3 plot(ceiling, "Frozen ceiling", color.gray) plot(floor, "Frozen pullback floor", color.gray)