ATR + Coverage % (Label)


# 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();