Skip to content

Fibonacci Channel ​

A sloped base trendline through the two same-direction outer pivots, plus parallel lines offset by Fibonacci multiples of the channel width set by the opposite middle pivot.

Quick reference ​

ItemValue
FamilyFibonacci
Input typeCandle (uses high, low)
Output typeFibChannelOutput (base, level_618/1000/1618)
Output rangeparallel channel lines at the current bar
Default parametersnone (swing threshold 5%, baked)
Warmup period3 (three confirmed pivots)
InterpretationSloped channel support/resistance

Formula ​

last three pivots p0, p1, p2 (p0/p2 same direction, p1 opposite):
  slope     = (p2 - p0) / (bar2 - bar0)
  base(bar) = p0 + slope * (bar - bar0)
  width     = p1 - base(bar1)
  level(r)  = base(cur) + r * width
for r in {0.618, 1.0, 1.618}, cur = current bar index

level_1000 is the opposite channel boundary (through p1); the 61.8% and 161.8% lines sit inside and beyond it. The two same-direction pivots occur at distinct bars, so the slope is well-defined. See crates/wickra-core/src/indicators/fib_channel.rs.

Parameters ​

None. The swing threshold 0.05 is a baked-in family constant; the three ratios are fixed. FibChannel::new is infallible.

Inputs / Outputs ​

rust
const _: fn(&mut wickra::FibChannel, wickra::Candle) -> Option<wickra::FibChannelOutput> =
    <wickra::FibChannel as wickra::Indicator>::update;
  • Python. update((o,h,l,c,v,ts)) → (base, level_618, level_1000, level_1618) or None; batch(high, low) → (n, 4) Matrix (NaN warmup).
  • Node. update(high, low) → { base, level618, level1000, level1618 } or null; batch(high, low) → flat number[] length n*4.
  • WASM. update(high, low) → object (same camelCase keys) or null.

Warmup ​

warmup_period() == 3. Three confirmed pivots are required (two to slope the base, one for the width); before that update returns None. Pinned by tests accessors_and_metadata and no_output_before_three_pivots.

Edge cases ​

  • Channel levels from three pivots are exact (test channel_levels_from_three_pivots).
  • reset clears all state (test reset_clears_state).
  • Streaming equals batch (test batch_equals_streaming).

Examples ​

Rust ​

rust
use wickra::{Candle, FibChannel, Indicator};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Highs at (bar0, 200) and (bar3, 220); low (bar1, 100) sets the width.
    let bars = [
        (199.0, 200.0, 199.0, 199.0),
        (100.0, 190.0, 100.0, 100.0), // confirm high @200, low @100
        (108.0, 110.0, 108.0, 108.0), // confirm low @100
        (210.0, 220.0, 210.0, 210.0), // extend high to 220 (bar 3)
        (150.0, 200.0, 150.0, 150.0), // confirm high @220 -> three pivots
    ];
    let mut chan = FibChannel::new();
    let mut last = None;
    for (ts, (o, h, l, c)) in bars.iter().enumerate() {
        last = chan.update(Candle::new(*o, *h, *l, *c, 1.0, ts as i64)?);
    }
    let v = last.unwrap();
    println!("{:.3} {}", v.base, v.level_1000); // 226.667 120
    Ok(())
}

Python ​

python
import wickra as ta

bars = [
    (199.0, 200.0, 199.0, 199.0, 1.0, 0),
    (100.0, 190.0, 100.0, 100.0, 1.0, 1),
    (108.0, 110.0, 108.0, 108.0, 1.0, 2),
    (210.0, 220.0, 210.0, 210.0, 1.0, 3),
    (150.0, 200.0, 150.0, 150.0, 1.0, 4),
]
chan = ta.FibChannel()
print([chan.update(b) for b in bars][-1])
# (226.6666667, 160.7466667, 120.0, 54.08)

Node ​

javascript
const wickra = require('wickra');
const chan = new wickra.FibChannel();
const bars = [[200.0, 199.0], [190.0, 100.0], [110.0, 108.0],
              [220.0, 210.0], [200.0, 150.0]];
let last = null;
for (const [h, l] of bars) last = chan.update(h, l);
console.log(last.base.toFixed(3), last.level1000); // 226.667 120

Streaming ​

python
chan = ta.FibChannel()
for o, h, l, c, v, ts in candle_feed:
    lines = chan.update((o, h, l, c, v, ts))
    if lines is not None and c > lines[3]:
        pass  # price above the 161.8% channel line — strong breakout

Interpretation ​

  1. Sloped band. The channel rides the trend's slope, unlike a flat support/resistance zone, so the boundaries adapt as the trend advances.
  2. Width-scaled targets. The 61.8% / 161.8% lines extrapolate the established channel width as the next reaction levels.

Common pitfalls ​

  • Needs a clean three-pivot structure. With erratic swings the base slope can be steep; read it together with the raw pivots.
  • Re-anchors on new pivots. Each new confirmed pivot shifts the three-point window and can re-slope the channel.

References ​

  • Fischer, R. Fibonacci Applications and Strategies for Traders (1993).

See also ​