# ATR Coverage Percentage Label Only (Upper Study)
declare upper;
input atrLength = 14;
input smoothingType = AverageType.WILDERS;
input atrTimeframe = AggregationPeriod.DAY;
input labelRed = 200;
input labelGreen = 200;
input labelBlue = 200;
DefineGlobalColor("LabelColor", CreateColor(labelRed, labelGreen, labelBlue));
# Calculate ATR from the specified higher timeframe
def atr = MovingAverage(smoothingType,
TrueRange(high(period = atrTimeframe), close(period = atrTimeframe), low(period = atrTimeframe)),
atrLength);
# Calculate intraday range
def isNewDay = GetDay() != GetDay()[1];
def intradayHigh = if isNewDay then high else Max(high, intradayHigh[1]);
def intradayLow = if isNewDay then low else Min(low, intradayLow[1]);
def intradayRange = intradayHigh - intradayLow;
# Coverage percentage
def atrCoverage = if atr != 0 then (intradayRange / atr) * 100 else 0;
def coverageLine = if isNewDay then 0 else atrCoverage;
# Alerts for key thresholds using atrCoverage instead of coverageLine
# def crossed40 = atrCoverage crosses above 40;
# def crossed80 = atrCoverage crosses above 80;
# Alert(crossed40, "ATR Coverage crossed 40%", Alert.BAR, Sound.Ring);
# Alert(crossed80, "ATR Coverage crossed 80%", Alert.BAR, Sound.Ring);
# Sticky logic: stay true after triggering for rest of the day
# def crossed40Sticky = if crossed40 or (crossed40Sticky[1] and !isNewDay) then 1 else 0;
# def crossed80Sticky = if crossed80 or (crossed80Sticky[1] and !isNewDay) then 1 else 0;
# Add label with ATR value and coverage %
AddLabel(
yes,
"ATR: " + AsText(atr, NumberFormat.TWO_DECIMAL_PLACES) +
" | Coverage: " + AsPercent(coverageLine / 100),
GlobalColor("LabelColor")
);
# Sticky alert labels
# AddLabel(crossed40Sticky, "OSCILLATION CROSSING 40%", Color.YELLOW);
# AddLabel(crossed80Sticky, "OSCILLATION CROSSING 80%", Color.CYAN);
# plot debugSticky = crossed40Sticky + crossed80Sticky;
# debugSticky.SetDefaultColor(Color.CURRENT);
# debugSticky.SetLineWeight(1);
# debugSticky.Hide();