Files
wickra/docs/wiki/indicators/trailing-stops/Indicator-SuperTrend.md
T
kingchenc d2f99efd78 F13c: restructure the indicator catalogue into eight families
The original taxonomy was four classical families plus a statistics group,
with the F1-F12 expansion slotted in as sub-categories. This regroups the
whole 71-indicator catalogue into eight top-level families, each with at
least five members:

  Moving Averages (12), Momentum Oscillators (13), Trend & Directional (9),
  Price Oscillators (5), Volatility & Bands (12), Trailing Stops (5),
  Volume (9), Price Statistics (7).

- Wiki: docs/wiki/indicators/ reorganised into eight family folders; all 71
  indicator pages moved with `git mv`. Every internal cross-link is
  normalised to `../<family>/Indicator-X.md`, each page's `Family` field is
  set to its new family, and two pre-existing `../Indicator-Chaining.md`
  links (should have been `../../`) are corrected. A link check confirms
  every relative wiki link resolves.
- Indicators-Overview.md fully rewritten around the eight families;
  Home.md indicator reference and the README family table follow suit.
- Warmup-Periods.md gains the eight F13 indicators; CHANGELOG records the
  46-indicator expansion (25 -> 71) and the eight-family taxonomy.
- Tests: Node indicators.test.js and Python test_new_indicators.py cover
  all eight new indicators (Node 91/91, Python 117/117 green).

cargo fmt + clippy (core/wickra/data/wasm/node) clean; 508 core tests,
25 data tests and 74 doctests green.
2026-05-22 21:21:56 +02:00

5.4 KiB
Raw Blame History

SuperTrend

SuperTrend — an ATR-banded trailing stop that flips sides when price closes through the band, reporting both the stop level and the trend direction.

Quick reference

Field Value
Family Trailing Stops
Input type Candle (uses high, low, close)
Output type (value, direction)
Output range value: unbounded (price scale); direction: 1.0 or +1.0
Default parameters atr_period = 10, multiplier = 3.0 (Python)
Warmup period atr_period
Interpretation Trend-following stop; a direction flip marks a trend change.

Formula

hl2          = (high + low) / 2
basic_upper  = hl2 + multiplier · ATR
basic_lower  = hl2  multiplier · ATR

final_upper  = basic_upper  if basic_upper < prev_final_upper or prev_close > prev_final_upper
               else prev_final_upper
final_lower  = basic_lower  if basic_lower > prev_final_lower or prev_close < prev_final_lower
               else prev_final_lower

downtrend: stay down while close <= final_upper, else flip up
uptrend:   stay up   while close >= final_lower, else flip down
SuperTrend = final_lower in an uptrend, final_upper in a downtrend

The two final bands ratchet — the upper band only moves down, the lower band only moves up — until price closes through the active one. That close flips the trend and hands the trailing-stop role to the opposite band. The result is a single line that sits below price in an uptrend and above it in a downtrend, plus a direction flag (+1.0 / -1.0) that names which regime you are in.

Parameters

  • atr_period — the ATR lookback (Python default 10).
  • multiplier — how many ATRs wide the bands sit (Python default 3.0).

SuperTrend::classic() returns Wilder's (10, 3.0) configuration.

Inputs / Outputs

From crates/wickra-core/src/indicators/super_trend.rs:

impl Indicator for SuperTrend {
    type Input = Candle;
    type Output = SuperTrendOutput;   // { value: f64, direction: f64 }
    // update(&mut self, input: Candle) -> Option<SuperTrendOutput>
}

SuperTrend is a candle-input indicator (it reads high, low, close). Python's streaming update returns a (value, direction) tuple; the batch helper returns an (n, 2) array with columns [value, direction]. Node's update returns { value, direction } and batch a flat [v0, d0, v1, d1, …] array; WASM matches Node.

Warmup

SuperTrend::classic().warmup_period() == 10. The first value lands once the inner ATR is ready, on input index atr_period 1. The first ATR-ready bar seeds the trend as up; the flip logic corrects it within a few bars if the market is actually falling.

Edge cases

  • Seed direction. The first emitted bar is always direction = +1.0; a genuine downtrend flips it within a handful of bars.
  • Flat market. Constant candles give a constant ATR, so both bands and the line are flat and the trend never flips.
  • Reset. st.reset() clears the ATR and the carried band state.

Examples

Rust

use wickra::{BatchExt, Candle, Indicator, SuperTrend};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut st = SuperTrend::new(5, 3.0)?;
    // Flat market: ATR = 2, hl2 = 10, lower band = 10 - 3·2 = 4.
    let candles: Vec<Candle> = (0..20)
        .map(|i| Candle::new(10.0, 11.0, 9.0, 10.0, 1.0, i).unwrap())
        .collect();
    let out = st.batch(&candles);
    println!("{:?}", out.last().unwrap());
    Ok(())
}

Output:

Some(SuperTrendOutput { value: 4.0, direction: 1.0 })

On a flat market the seeded uptrend never flips and the line holds at the lower band, 4.0.

Python

import numpy as np
import wickra as ta

st = ta.SuperTrend(5, 3.0)
n = 20
high = np.full(n, 11.0)
low = np.full(n, 9.0)
close = np.full(n, 10.0)
print(st.batch(high, low, close)[-1])   # [value, direction]

Output:

[4. 1.]

Node

const ta = require('wickra');
const st = new ta.SuperTrend(5, 3.0);
const n = 20;
const high = Array(n).fill(11), low = Array(n).fill(9), close = Array(n).fill(10);
const out = st.batch(high, low, close);
console.log(out.slice(-2));   // [value, direction] of the last bar

Output:

[ 4, 1 ]

Interpretation

SuperTrend is used as a stop-and-reverse system: stay long while direction == +1 and the line trails below price, flip to short the bar the direction turns -1 and the line jumps above price. A larger multiplier widens the bands — fewer whipsaws, later flips; a smaller one flips sooner. The line itself doubles as a concrete stop-loss level.

Common pitfalls

  • Expecting an exact flip bar. The seed bar is always an uptrend; on genuinely falling data the flip lands a few bars in.
  • Reading value without direction. The line means "support" in an uptrend and "resistance" in a downtrend — direction tells you which.

References

The SuperTrend trailing stop; the final-band ratchet formulation here matches the widely used TradingView / Olivier Seban definition.

See also