// Licensed under the Apache License, Version 2.0 // © mihakralj //@version=6 indicator("Average True Range (ATR)", "ATR", overlay=false) //@function Calculates the Average True Range (ATR) //@param length The period length for the ATR calculation. //@returns The ATR value. //@optimized Beta precomputation for RMA warmup compensation atr(simple int length) => var float prevClose = close float tr1 = high - low float tr2 = math.abs(high - prevClose) float tr3 = math.abs(low - prevClose) float trueRange = math.max(tr1, tr2, tr3) prevClose := close float alpha = 1.0 / float(length) float beta = 1.0 - alpha var float EPSILON = 1e-10 var float raw_rma = 0.0 var float e = 1.0 if not na(trueRange) raw_rma := (raw_rma * (length - 1) + trueRange) / length e *= beta e > EPSILON ? raw_rma / (1.0 - e) : raw_rma else na // ---------- Main loop ---------- // Inputs i_length = input.int(14, "Length", minval=1, tooltip="Number of bars used for the ATR calculation") // Calculation atrValue = atr(i_length) // Plot plot(atrValue, "ATR", color=color.yellow, linewidth=2)