Noon Barbari
Sign up
All posts
conceptPublished ·8 min read

Fibonacci retracement: the levels, the math, and where it actually fails

0.236, 0.382, 0.5, 0.618, 0.786. Famous numbers — and famously over-credited. Here is what the levels actually do, when they work, and when they're confirmation bias dressed up as math.

On this page

Fibonacci retracement is the indicator with the best PR in trading. Borrowed from a 13th-century Italian mathematician, dressed up with the word "golden," and promoted relentlessly by educators selling courses, it has the aura of being mystically reliable. The reality is more mundane: it's a set of horizontal levels that occasionally act as support or resistance, mostly because enough traders watch them to make them self-fulfilling — and sometimes they don't, and the post-mortem retroactively finds a different Fib level that did.

What the levels actually are

After a directional price move (a swing from low to high, or high to low), the Fibonacci retracement levels mark fractions of that move where price might pause or reverse. The standard set:

  • 0.236 (23.6%) — shallow pullback, barely a breath
  • 0.382 (38.2%) — common first-pullback level in strong trends
  • 0.5 (50%) — not a Fibonacci number; included because traders watch it
  • 0.618 (61.8%) — the "golden ratio," deepest level most trends recover from
  • 0.786 (78.6%) — last-chance retracement before the trend is invalidated

The 0.618 and 0.382 ratios come from the Fibonacci sequence: each number divided by the next gives ~0.618, each divided by the one two slots ahead gives ~0.382. The 0.236 is the next step in that chain. 0.5 has no mathematical claim — it's there because half is psychologically meaningful.

How to apply them

Pick a swing. Connect its low to its high (for an uptrend; the reverse for a downtrend). The retracement levels are computed automatically as fractions of that range, drawn as horizontal lines.

Fibonacci levels for a swing from $40,000 to $50,000
Swing low:   $40,000
Swing high:  $50,000
Range:       $10,000

Level   Ratio   Price
─────   ─────   ──────────
0.000   0%      $50,000   (the high)
0.236   23.6%   $47,640
0.382   38.2%   $46,180
0.500   50%     $45,000
0.618   61.8%   $43,820
0.786   78.6%   $42,140
1.000   100%    $40,000   (the low)

After the high, if the trend continues, price often pulls back to one of these levels before resuming. The 0.382 and 0.618 are the most-watched. A pullback that holds at 0.618 and resumes the trend is the textbook "buying the dip" trade — and a real signal when it works.

When Fibs actually work

Two conditions, both required. First, the underlying swing must be impulsive — a clean directional move with high volume, not a noisy grind. Second, the market must be liquid enough that the levels are widely watched. Major liquid pairs (BTC, ETH, large-cap stocks, major FX) tend to respect Fib levels because thousands of traders place orders at them. Small-cap alts and illiquid markets do not — the levels exist on the chart, but there's no one to defend them.

Backtest data on liquid pairs consistently shows the 0.5 and 0.618 levels do produce slightly higher reaction rates than random horizontal levels — but not dramatically so. The edge is real but small (typically a 5-15% improvement in reaction probability over random levels), and it disappears in low-liquidity assets.

When they don't

Three failure modes. First, contrived swings. If you have to squint at the chart to decide which low to connect, the swing isn't real and the Fib levels are arbitrary. Second, low-liquidity markets. The level exists but no one's defending it. Third, regime breaks. A Fib level drawn from the 2021 swing is irrelevant in 2025; market structure has changed.

Encoding Fibs in rules

The honest approach to systematic Fib trading is to pre-compute the levels off a programmatically detected swing (not an eyeballed one), and trigger entries only when price actually touches the level during a confirmed trend. No after-the-fact justification — the rule fires or it doesn't.

rules.yaml — Fib retracement buy in an uptrend
strategy:
  name: fib_pullback_long
  indicators:
    - { id: swing, kind: SwingDetector,    lookback: 8 }
    - { id: fib,   kind: FibonacciLevels,  swing_source: swing, levels: [0.5, 0.618] }
    - { id: rsi,   kind: RSI,              period: 14 }
  rules:
    entry:
      type: AND
      children:
        - { type: eq, left: swing.is_uptrend, right: 1 }
        - { type: lt, left: bar.low,          right: fib.level_618 }
        - { type: gt, left: bar.close,        right: fib.level_618 }   # bounced
        - { type: lt, left: rsi, right: 40 }                            # oversold
    exit:
      type: OR
      children:
        - { type: gt, left: bar.close, right: fib.level_236 }    # took profit at shallow level
        - { type: lt, left: bar.close, right: fib.level_786 }    # trend invalidated
  risk:
    stop_loss: { kind: percent_below, ref: fib.level_786, mult: 0.5 }

Backtest, walk-forward, and check whether the edge survives out-of-sample. If it does, the levels were doing real work. If not, the strategy was finding patterns in noise — and the Fib name was just helping you trust it.

Next steps

Fibs are most useful inside a clear trend — start with the trend definition post. For the broader question of whether any single indicator can give you an edge, see the overfitting post.

Try it on your own data

Every concept above is implemented in the platform. Backtest, walk-forward, paper-trade, then promote to live — same rule set, all stages.

Related reading