Auto Fibonacci Retracement
Advanced Auto Fibonacci Retracement indicator that detects swing highs and lows, draws persistent Fibonacci levels between the most recent valid swing high/low pair, and and includes directional bias.
✅ Features:
Automatically detects recent swing high/low based on user-defined strength.
Adjusts Fibonacci levels based on trend direction.
Persistent multi-bar lines using
line
objects.Optional label display.
Clean, professional structure, ready for enhancements.
//@version=6
indicator("Advanced Auto Fibonacci Retracement", overlay=true)
// === INPUTS ===
swingStrength = input.int(5, minval=1, title="Swing Strength")
showLabels = input.bool(true, title="Show Level Labels")
showOnlyLast = input.bool(true, title="Show Only Latest Levels")
// === DETECT SWINGS ===
pivotHigh = ta.pivothigh(high, swingStrength, swingStrength)
pivotLow = ta.pivotlow(low, swingStrength, swingStrength)
var float lastHigh = na
var float lastLow = na
var bool isUptrend = na
if not na(pivotHigh)
lastHigh := pivotHigh
if not na(pivotLow)
lastLow := pivotLow
// Detect trend direction
if not na(lastHigh) and not na(lastLow)
isUptrend := bar_index > bar_index[swingStrength] and lastLow > lastLow[swingStrength]
// === CALCULATE FIB LEVELS ===
var line[] fibLines = array.new_line()
var label[] fibLabels = array.new_label()
// Function to clear lines and labels
f_clear_lines_and_labels() =>
for l in fibLines
line.delete(l)
array.clear(fibLines)
for lbl in fibLabels
label.delete(lbl)
array.clear(fibLabels)
if not na(lastHigh) and not na(lastLow)
if (isUptrend and lastLow < lastHigh) or (not isUptrend and lastHigh > lastLow)
f_clear_lines_and_labels()
float diff = math.abs(lastHigh - lastLow)
float base = isUptrend ? lastLow : lastHigh
float fib_0 = base
float fib_236 = base + (isUptrend ? diff * 0.236 : -diff * 0.236)
float fib_382 = base + (isUptrend ? diff * 0.382 : -diff * 0.382)
float fib_5 = base + (isUptrend ? diff * 0.5 : -diff * 0.5)
float fib_618 = base + (isUptrend ? diff * 0.618 : -diff * 0.618)
float fib_786 = base + (isUptrend ? diff * 0.786 : -diff * 0.786)
float fib_1 = isUptrend ? lastHigh : lastLow
// Levels and colors
levels = array.from(fib_0, fib_236, fib_382, fib_5, fib_618, fib_786, fib_1)
levelNames = array.from("0.0", "23.6%", "38.2%", "50.0%", "61.8%", "78.6%", "100.0%")
levelColors = array.from(color.gray, color.teal, color.blue, color.purple, color.orange, color.red, color.gray)
for i = 0 to array.size(levels) - 1
y = array.get(levels, i)
c = array.get(levelColors, i)
l = line.new(x1=bar_index - 50, y1=y, x2=bar_index, y2=y, color=c, width=1)
array.push(fibLines, l)
if showLabels
lbl = label.new(x=bar_index, y=y, text=array.get(levelNames, i), style=label.style_label_left, color=color.new(c, 70), textcolor=color.black)
array.push(fibLabels, lbl)
🧠How It Works:
Swings are detected using
ta.pivothigh
/ta.pivotlow
with adjustable strength.When both a high and a low are found, the script calculates the range and draws 7 Fibonacci levels.
The script dynamically clears and redraws the lines and labels as the market updates.
Works in both uptrends and downtrends, with the levels adapting accordingly.
Last updated
Was this helpful?