# --- Historical touch-rate tracker (based on chart's loaded intraday history) ---
input exitCheckHour = 15;
input exitCheckMinute = 55;
def isExitCheckBar = SecondsFromTime(exitCheckHour * 100 + exitCheckMinute) >= 0 and
SecondsFromTime(exitCheckHour * 100 + exitCheckMinute) < GetAggregationPeriod() / 1000;
# Track the day's high/low from the entry bar forward
def dayHighSinceEntry = if isEntryBar then high
else if newDay then Double.NaN
else if !IsNaN(dayHighSinceEntry[1]) then Max(dayHighSinceEntry[1], high)
else Double.NaN;
def dayLowSinceEntry = if isEntryBar then low
else if newDay then Double.NaN
else if !IsNaN(dayLowSinceEntry[1]) then Min(dayLowSinceEntry[1], low)
else Double.NaN;
# Did either wing get touched today, checked once per day at the exit-check bar
def touchedTodaySell = !IsNaN(dayHighSinceEntry) and
(dayHighSinceEntry >= sellWingUpperFinal or dayLowSinceEntry <= sellWingLowerFinal);
def touchedTodayBuy = !IsNaN(dayHighSinceEntry) and
(dayHighSinceEntry >= buyWingUpper or dayLowSinceEntry <= buyWingLower);
def recordBar = isExitCheckBar and !IsNaN(dayHighSinceEntry);
def totalDaysCount = if IsNaN(totalDaysCount[1]) then (if recordBar then 1 else 0)
else totalDaysCount[1] + (if recordBar then 1 else 0);
def touchedDaysCountSell = if IsNaN(touchedDaysCountSell[1]) then (if recordBar and touchedTodaySell then 1 else 0)
else touchedDaysCountSell[1] + (if recordBar and touchedTodaySell then 1 else 0);
def touchedDaysCountBuy = if IsNaN(touchedDaysCountBuy[1]) then (if recordBar and touchedTodayBuy then 1 else 0)
else touchedDaysCountBuy[1] + (if recordBar and touchedTodayBuy then 1 else 0);
def sellTouchRatePct = if totalDaysCount > 0 then touchedDaysCountSell / totalDaysCount * 100 else Double.NaN;
def buyTouchRatePct = if totalDaysCount > 0 then touchedDaysCountBuy / totalDaysCount * 100 else Double.NaN;
AddLabel(isExitCheckBar, "3:55 CHECK: If GTC not filled, consider closing at market (0DTE only)", Color.ORANGE);
AddLabel(totalDaysCount > 0,
"Historical SELL wing touch rate: " + Round(sellTouchRatePct, 1) + "% over " + totalDaysCount + " days (target " + AsPercent(sellTargetPOT) + ")",
Color.MAGENTA);
AddLabel(totalDaysCount > 0,
"Historical BUY wing touch rate: " + Round(buyTouchRatePct, 1) + "% over " + totalDaysCount + " days (target " + AsPercent(buyTargetPOT) + ")",
Color.MAGENTA);
Alert(isExitCheckBar, "0DTE 3:55 exit check - close if GTC not hit", Alert.BAR, Sound.Bell);