//@version=6
// SPDX-License-Identifier: Apache-2.0
// Copyright 2026 PineForge
// PineForge Owned Strategy: Rangefinder Daily Reference
// Prior-day boundaries are requested together with closed-bar semantics.
strategy("PineForge — Rangefinder Daily Reference", overlay=true,
initial_capital=100000,
default_qty_type=strategy.fixed, default_qty_value=2,
pyramiding=0, commission_type=strategy.commission.percent,
commission_value=0.05, slippage=1,
margin_long=100, margin_short=100,
process_orders_on_close=false, calc_on_order_fills=false)
minimumRangePercent = input.float(1.2, "Minimum Prior-Day Range %", minval=0.1, step=0.1, group="Daily Reference")
atrLength = input.int(17, "ATR Length", minval=2, group="Risk")
maximumAtrLoss = input.float(2.5, "Maximum ATR Loss", minval=0.5, step=0.1, group="Risk")
[priorDailyHigh, priorDailyLow] = request.security(
syminfo.tickerid, "D", [high[1], low[1]],
gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
priorDailyMidpoint = (priorDailyHigh + priorDailyLow) * 0.5
priorDailyRangePercent = priorDailyLow > 0 ? (priorDailyHigh - priorDailyLow) / priorDailyLow * 100 : 0.0
atrValue = ta.atr(atrLength)
enterLong = priorDailyRangePercent >= minimumRangePercent and ta.crossover(close, priorDailyHigh)
referenceLost = strategy.position_size > 0 and close < priorDailyMidpoint
riskExceeded = strategy.position_size > 0 and close < strategy.position_avg_price - atrValue * maximumAtrLoss
if strategy.position_size == 0 and enterLong
strategy.entry("Rangefinder Long", strategy.long)
else if strategy.position_size > 0 and (referenceLost or riskExceeded)
strategy.close("Rangefinder Long", comment=riskExceeded ? "ATR risk" : "Daily midpoint")
plot(priorDailyHigh, "Prior Daily High", color=color.green)
plot(priorDailyLow, "Prior Daily Low", color=color.red)
plot(priorDailyMidpoint, "Prior Daily Midpoint", color=color.gray)