ATR Multiples Labels

Displays multiples of current ATR as labels on your chart. Helpful for quick reference if using for target/stop levels.

# ATR Label Only (Upper Study)
declare upper;

input atrLength = 14;
input smoothingType = AverageType.WILDERS;

input labelRed = 200; 
input labelGreen = 200; 
input labelBlue = 200; 

DefineGlobalColor("LabelColor", CreateColor(labelRed, labelGreen, labelBlue));

# Calculate ATR using chart's current timeframe
def atr = MovingAverage(
    smoothingType, 
    TrueRange(high, close, low), 
    atrLength
);

# ATR multiples
def atrHalf = atr * 0.5;
def atrOne = atr * 1.0;
def atrOnePointFive = atr * 1.5;
def atrThree = atr * 3.0;

# Labels
AddLabel(
    yes,
    "0.5 × ATR: " + AsText(atrHalf, NumberFormat.TWO_DECIMAL_PLACES),
    GlobalColor("LabelColor")
);

AddLabel(
    yes,
    "1 × ATR: " + AsText(atrOne, NumberFormat.TWO_DECIMAL_PLACES),
    GlobalColor("LabelColor")
);

AddLabel(
    yes,
    "1.5 × ATR: " + AsText(atrOnePointFive, NumberFormat.TWO_DECIMAL_PLACES),
    GlobalColor("LabelColor")
);

AddLabel(
    yes,
    "3 × ATR: " + AsText(atrThree, NumberFormat.TWO_DECIMAL_PLACES),
    GlobalColor("LabelColor")
);

ADR + Coverage % (Label)


input length = 14;

input labelRed = 200; 
input labelGreen = 200; 
input labelBlue = 200;

DefineGlobalColor("LabelColor", CreateColor(labelRed, labelGreen, labelBlue));

def isNewDay = GetDay() != GetDay()[1];
def dayHigh = if isNewDay then high else Max(high, dayHigh[1]);
def dayLow  = if isNewDay then low else Min(low, dayLow[1]);

def dailyHigh = high(period = AggregationPeriod.DAY);
def dailyLow = low(period = AggregationPeriod.DAY);
def dailyRange = dailyHigh - dailyLow;
def adr = Average(dailyRange, length);

def currentDayRange = dayHigh - dayLow;
def adrPercent = if adr != 0 then (currentDayRange / adr) * 100 else 0;

AddLabel(yes,
    "ADR: " + Round(adr, 2) + " | Coverage: " + Round(adrPercent, 2) + "%", 
    GlobalColor("LabelColor")
);

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

RSI + MA


declare lower;

input length = 14;
input over_Bought = 70;
input over_Sold = 30;
input price = close;
input averageType = AverageType.WILDERS;
input showBreakoutSignals = no;
input rsiMA_length = 14;

def NetChgAvg = MovingAverage(averageType, price - price[1], length);
def TotChgAvg = MovingAverage(averageType, AbsValue(price - price[1]), length);
def ChgRatio = if TotChgAvg != 0 then NetChgAvg / TotChgAvg else 0;

plot RSI = 50 * (ChgRatio + 1);
plot RSISMA = Average(RSI, rsiMA_length);

plot OverSold = over_Sold;
plot OverBought = over_Bought;
plot UpSignal = if RSI crosses above OverSold then OverSold else Double.NaN;
plot DownSignal = if RSI crosses below OverBought then OverBought else Double.NaN;

UpSignal.SetHiding(!showBreakoutSignals);
DownSignal.SetHiding(!showBreakoutSignals);

RSI.DefineColor("OverBought", GetColor(5));
RSI.DefineColor("Normal", GetColor(7));
RSI.DefineColor("OverSold", GetColor(1));
RSI.AssignValueColor(
    if RSI > over_Bought then RSI.color("OverBought")
    else if RSI < over_Sold then RSI.color("OverSold")
    else RSI.color("Normal")
);

RSISMA.SetDefaultColor(Color.RED);
RSISMA.SetLineWeight(2);

OverSold.SetDefaultColor(GetColor(8));
OverBought.SetDefaultColor(GetColor(8));
UpSignal.SetDefaultColor(Color.UPTICK);
UpSignal.SetPaintingStrategy(PaintingStrategy.ARROW_UP);
DownSignal.SetDefaultColor(Color.DOWNTICK);
DownSignal.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);

Squeeze Indicator


declare lower;

##Assembled by TheBewb using existing Mobius Squeeze Momentum coding and "squeeze" concept made popular by John Carter.

input price = close;
input length = 20;
input Num_Dev_Dn = -2.0;
input Num_Dev_up = 2.0;
input averageType = AverageType.SIMPLE;
input displace = 0;
def sDev = StDev(data = price[-displace], length = length);
def MidLineBB = MovingAverage(averageType, data = price[-displace], length = length);
def LowerBandBB = MidLineBB + Num_Dev_Dn * sDev;
def UpperBandBB = MidLineBB + Num_Dev_up * sDev;
input factorhigh = 1.0;
input factormid = 1.5;
input factorlow = 2.0;
input trueRangeAverageType = AverageType.SIMPLE;
def shifthigh = factorhigh * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftMid = factormid * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftlow = factorlow * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def average = MovingAverage(averageType, price, length);

def Avg = average[-displace];

def UpperBandKCLow = average[-displace] + shiftlow[-displace];
def LowerBandKCLow = average[-displace] - shiftlow[-displace];

def UpperBandKCMid = average[-displace] + shiftMid[-displace];
def LowerBandKCMid = average[-displace] - shiftMid[-displace];

def UpperBandKCHigh = average[-displace] + shifthigh[-displace];
def LowerBandKCHigh = average[-displace] - shifthigh[-displace];

def K = (Highest(high, length) + Lowest(low, length)) /
2 + ExpAverage(close, length);
def momo = Inertia(price - K / 2, length);

def pos         = momo>= 0;
def neg         = momo< 0;
def up         = momo >= momo[1];
def dn         = momo < momo[1];

def presqueeze      = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow;
def originalSqueeze     = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid;
def ExtrSqueeze     = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh;

def PosUp = pos and up;
def PosDn = pos and dn;
def NegDn = neg and dn;
def NegUp = neg and up;

plot squeezeline = 0;
squeezeline.SetPaintingStrategy(PaintingStrategy.POINTS);
squeezeline.AssignValueColor(if ExtrSqueeze then Color.RED else if originalSqueeze  then Color.YELLOW else if presqueeze then Color.DARK_ORANGE else Color.GRAY);

plot momentum = momo;
momentum.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
momentum.AssignValueColor( if PosUp then Color.green else if PosDn then Color.dark_green else if NegDn then Color.dark_orange else if NegUp then Color.yellow else Color.YELLOW);

Wavetrend (port)


# WaveTrend Oscillator - ThinkScript version
# Inspired by LazyBear's TradingView script
declare lower;

input n1 = 10;  # Channel Length
input n2 = 21;  # Average Length
input obLevel1 = 60;
input obLevel2 = 53;
input osLevel1 = -60;
input osLevel2 = -53;

def ap = (high + low + close) / 3;
def esa = ExpAverage(ap, n1);
def d = ExpAverage(AbsValue(ap - esa), n1);
def ci = if d != 0 then (ap - esa) / (0.015 * d) else 0;
def tci = ExpAverage(ci, n2);

def wt1 = tci;
def wt2 = Average(wt1, 4);
def diff = wt1 - wt2;

# Plotting the 0 line
plot ZeroLine = 0;
ZeroLine.SetDefaultColor(Color.GRAY);

# Plotting Overbought and Oversold Levels
plot Overbought1 = obLevel1;
Overbought1.SetDefaultColor(Color.RED);

plot Overbought2 = obLevel2;
Overbought2.SetDefaultColor(Color.RED);
Overbought2.SetStyle(Curve.SHORT_DASH);

plot Oversold1 = osLevel1;
Oversold1.SetDefaultColor(Color.GREEN);

plot Oversold2 = osLevel2;
Oversold2.SetDefaultColor(Color.GREEN);
Oversold2.SetStyle(Curve.SHORT_DASH);

# Plotting WaveTrend Lines
plot WaveTrend1 = wt1;
WaveTrend1.SetDefaultColor(Color.GREEN);

plot WaveTrend2 = wt2;
WaveTrend2.SetDefaultColor(Color.RED);
WaveTrend2.SetStyle(Curve.SHORT_DASH);

# Plotting the difference area
plot DiffArea = diff;
DiffArea.SetDefaultColor(Color.BLUE);
DiffArea.SetStyle(Curve.FIRM);
DiffArea.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
DiffArea.SetLineWeight(1);

VOL + Coverage % (Label)


declare upper;

input length = 30;

input labelRed = 0;
input labelGreen = 255;
input labelBlue = 255;

# User-defined label color
DefineGlobalColor("CustomLabel", CreateColor(labelRed, labelGreen, labelBlue));

# 30-day average volume (excluding today)
def dailyVolume = volume(period = AggregationPeriod.DAY);
def avgVolume = Average(dailyVolume[1], length);

# Current day's volume so far
def isNewDay = GetDay() != GetDay()[1];
def todayVolume = if isNewDay then 0 else todayVolume[1] + volume;

# Percentage of today's volume compared to the 30-day average
def volumePct = if avgVolume != 0 then (todayVolume / avgVolume) * 100 else Double.NaN;

# Show label (only percentage)
AddLabel(
    yes,
    # "30-Day Avg: " + Round(avgVolume, 0) +
    # " | Today: " + Round(todayVolume, 0) +
    "% of 30-Day Avg: " + AsPercent(volumePct / 100),
    GlobalColor("CustomLabel")
);