Skip to content

Indicators Overview

kingchenc edited this page May 24, 2026 · 8 revisions

Indicators Overview

Wickra ships 105 indicators organised into nine families. Each family collects indicators that answer the same kind of question and groups at least five of them, so the taxonomy here maps one-to-one onto the docs/wiki/indicators/<family>/ directory layout.

Every indicator is an O(1) state machine that consumes one input at a time and produces either Option<f64> (Rust), float | None (Python), or number | null (Node). Inputs are either a f64 close price or an OHLCV Candle (Rust) / dict-or-tuple (Python) / column arrays (Node). The full trait surface and warmup-period semantics are covered in Quickstart: Rust and Warmup Periods.

The "Output range" column is the value bounds an indicator emits once warm; "unbounded" means it tracks the price scale of the input. The "Warmup" column quotes warmup_period() as the indicator reports it — the exact first-emission index: the first non-None output lands on input warmup_period() (0-indexed warmup_period() - 1).

The nine families:

# Family Count What it answers
1 Moving Averages 19 Where is the smoothed trend line?
2 Momentum Oscillators 20 How fast is price changing; is it overbought?
3 Trend & Directional 13 Is there a trend, and which way?
4 Price Oscillators 5 Difference-of-averages momentum around zero.
5 Volatility & Bands 17 How wide is the range; where are the envelopes?
6 Bands & Channels 11 Price-envelope overlays beyond the volatility staples.
7 Trailing Stops 5 Where is the stop-loss for this trend?
8 Volume 8 Is volume confirming the move?
9 Price Statistics 7 Per-bar price transforms and rolling regressions.

Moving Averages

Smooth the price series to surface direction. All are single-input, single-output (f64 → f64) except Vwma, which weights by volume.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Sma Equal-weighted rolling mean over period closes. f64 f64 unbounded (price scale) period period Indicator-Sma
Ema EMA with α = 2 / (period + 1), SMA-seeded. f64 f64 unbounded (price scale) period period Indicator-Ema
Wma Linear weights 1, 2, …, period; newest bar matters most. f64 f64 unbounded (price scale) period period Indicator-Wma
Dema Mulloy's 2·EMA − EMA(EMA); removes first-order EMA lag. f64 f64 unbounded (price scale) period 2·period − 1 Indicator-Dema
Tema Mulloy's 3·EMA − 3·EMA(EMA) + EMA(EMA(EMA)). f64 f64 unbounded (price scale) period 3·period − 2 Indicator-Tema
Hma Hull's near-zero-lag WMA(2·WMA(n/2) − WMA(n), √n). f64 f64 unbounded (price scale) period period + round(√period) − 1 Indicator-Hma
Kama Kaufman's adaptive average; efficiency ratio picks α per bar. f64 f64 unbounded (price scale) (er_period=10, fast=2, slow=30) er_period + 1 Indicator-Kama
Smma Wilder's RMA: SMA-seeded exponential average, 1/period factor. f64 f64 unbounded (price scale) period period Indicator-Smma
Trima A period-window SMA applied twice; triangular weights. f64 f64 unbounded (price scale) period period Indicator-Trima
Zlema EMA of the de-lagged series 2·price − price[lag]. f64 f64 unbounded (price scale) period lag + period Indicator-Zlema
T3 Tillson's six-EMA cascade recombined with a volume factor v. f64 f64 unbounded (price scale) (period, v=0.7) (Python) 6·period − 5 Indicator-T3
Vwma Rolling mean of closes weighted by each bar's volume. Candle f64 unbounded (price scale) period period Indicator-Vwma
Alma Gaussian-weighted MA, kernel centred at offset · (period − 1). f64 f64 unbounded (price scale) (period=9, offset=0.85, sigma=6.0) period Indicator-Alma
McGinleyDynamic Self-adjusting MA, MD + (price − MD) / (0.6 · period · (price / MD)⁴). f64 f64 unbounded (price scale) period (10 in Python) period Indicator-McGinleyDynamic
Frama Ehlers' fractal-dimension-adaptive EMA over close-only window halves. f64 f64 unbounded (price scale) period=16 (even) period Indicator-Frama
Vidya EMA whose alpha scales with |CMO(cmo_period)| / 100. f64 f64 unbounded (price scale) (period=14, cmo_period=9) cmo_period + 1 Indicator-Vidya
Jma Jurik MA — three-stage filter reconstruction. f64 f64 unbounded (price scale) (period=14, phase=0, power=2) 1 Indicator-Jma
Alligator Three Smmas of (high + low) / 2: Jaw / Teeth / Lips. Candle AlligatorOutput (3) unbounded (price scale) (jaw=13, teeth=8, lips=5) max(jaw, teeth, lips) Indicator-Alligator
Evwma Elastic volume-weighted recurrence over a rolling window. Candle f64 unbounded (price scale) period (20 in Python) period Indicator-Evwma

Momentum Oscillators

Measure the rate of price change. Several are bounded by construction (0–100 / ±100 oscillators), the rest are difference-driven.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Rsi Wilder's RSI; smoothed gain / (gain + loss) × 100. f64 f64 [0, 100] period = 14 (Python) period + 1 Indicator-Rsi
Stochastic %K = (close − low_n)/(high_n − low_n) × 100, smoothed into %D. Candle (k, d) each in [0, 100] (k_period=14, d_period=3) (Python) k_period + d_period − 1 Indicator-Stochastic
Cci (typical − SMA(typical)) / (0.015 · mean_dev). Candle f64 unbounded (typically ±100±200) period = 20 (Python) period Indicator-Cci
Roc (price − price_n) / price_n × 100; raw percentage change. f64 f64 unbounded around zero period period + 1 Indicator-Roc
WilliamsR −100 × (high_n − close) / (high_n − low_n). Candle f64 [−100, 0] period = 14 (Python) period Indicator-WilliamsR
Mfi "Volume-weighted RSI": Wilder smoothing of money-flow ratios. Candle f64 [0, 100] period = 14 (Python) period Indicator-Mfi
AwesomeOscillator SMA(median, fast) − SMA(median, slow); zero-line crossover. Candle f64 unbounded around zero (fast=5, slow=34) (Python) slow_period Indicator-AwesomeOscillator
Mom price − price[period]; raw price-difference momentum. f64 f64 unbounded around zero period = 10 (Python) period + 1 Indicator-Mom
Cmo Chande Momentum Oscillator; 100·(Σgain − Σloss)/(Σgain + Σloss). f64 f64 [−100, 100] period = 14 (Python) period + 1 Indicator-Cmo
Tsi True Strength Index; double-EMA-smoothed momentum ratio. f64 f64 [−100, 100] (long=25, short=13) (Python) long + short Indicator-Tsi
Pmo DecisionPoint Price Momentum Oscillator; doubly-smoothed ROC. f64 f64 unbounded around zero (smoothing1=35, smoothing2=20) (Python) 2 Indicator-Pmo
StochRsi Stochastic Oscillator applied to the RSI series. f64 f64 [0, 100] (rsi_period=14, stoch_period=14) (Python) rsi_period + stoch_period Indicator-StochRsi
UltimateOscillator Larry Williams' weighted three-timeframe buying-pressure oscillator. Candle f64 [0, 100] (short=7, mid=14, long=28) (Python) max(short,mid,long) + 1 Indicator-UltimateOscillator
Rvi SMA(close − open, period) / SMA(high − low, period). Candle f64 unbounded (typically (−1, 1)) period = 10 (Python) period Indicator-Rvi
Pgo (close − SMA(close, period)) / EMA(TR, period). Candle f64 unbounded period = 14 (Python) period Indicator-Pgo
Kst Pring's 1·RCMA_1 + 2·RCMA_2 + 3·RCMA_3 + 4·RCMA_4, plus SMA signal. f64 (kst, signal) unbounded 9 periods, see deep-dive longest roc_i + sma_i + signal − 1 Indicator-Kst
Smi Blau's doubly-EMA-smoothed close-vs-range displacement. Candle f64 [−100, 100] (period=5, d=3, d2=3) period + d + d2 − 2 Indicator-Smi
LaguerreRsi Ehlers' 4-stage Laguerre filter with RSI up/down accumulator. f64 f64 [0, 100] (clamped) gamma = 0.5 1 Indicator-LaguerreRSI
ConnorsRsi Average of RSI(close), RSI(streak), percentile-rank of returns. f64 f64 [0, 100] (3, 2, 100) max(period_rsi+1, period_streak+2, period_rank+1) Indicator-ConnorsRSI
Inertia LinearRegression(RVI(rvi_period), linreg_period). Candle f64 unbounded (rvi=14, linreg=20) rvi_period + linreg_period − 1 Indicator-Inertia

Trend & Directional

Answer whether a trend exists and which way it points — directional systems, crossover packages and trend-versus-range filters.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
MacdIndicator EMA(fast) − EMA(slow) plus a signal EMA and the histogram. f64 (macd, signal, histogram) unbounded around zero (fast=12, slow=26, signal=9) (Python) slow + signal − 1 Indicator-MacdIndicator
Adx Wilder's directional system: +DI, −DI and the ADX strength index. Candle (plus_di, minus_di, adx) each in [0, 100] period = 14 (Python) 2·period Indicator-Adx
Adxr Wilder's ADX-rating: average of ADX_t and ADX_{t − (period − 1)}. Candle f64 [0, 100] period = 14 (Python) 3·period − 1 Indicator-Adxr
Aroon Bars-since-high and bars-since-low scaled to [0, 100]. Candle (up, down) each in [0, 100] period = 14 (Python) period + 1 Indicator-Aroon
Trix Rate of change of a triple-smoothed EMA, × 10000. f64 f64 unbounded around zero period = 15 (Python) 3·period − 1 Indicator-Trix
AroonOscillator AroonUp − AroonDown; the two Aroon lines as one gauge. Candle f64 [−100, 100] period = 14 (Python) period + 1 Indicator-AroonOscillator
Vortex Vortex Indicator VI+ / VI−; crossings mark trend onset. Candle (plus, minus) each >= 0 period = 14 (Python) period + 1 Indicator-Vortex
Rwi Poulos' Random Walk Index: actual displacement vs ATR_i · sqrt(i). Candle (high, low) each >= 0 period = 14 (Python) period Indicator-Rwi
Tii Share of recent SMA-deviations that are positive, scaled to [0, 100]. f64 f64 [0, 100] (sma_period=60, dev_period=30) (Python) sma_period + dev_period − 1 Indicator-Tii
WaveTrend LazyBear: 3-stage EMA cascade through the typical-price channel index. Candle (wt1, wt2) typically [-100, +100] (channel=10, average=21, signal=4) (Python) 2·channel + average + signal − 3 Indicator-WaveTrend
MassIndex Dorsey's range-expansion sum of the EMA-of-range ratio. Candle f64 > 0 (ema_period=9, sum_period=25) (Python) 2·ema_period + sum_period − 2 Indicator-MassIndex
ChoppinessIndex Summed true range over the high-low span, log-scaled. Candle f64 [0, 100] period = 14 (Python) period Indicator-ChoppinessIndex
VerticalHorizontalFilter Net price move divided by total move over period. f64 f64 [0, 1] period = 28 (Python) period + 1 Indicator-VerticalHorizontalFilter

Price Oscillators

Difference-of-averages and intrabar oscillators that swing around a zero line.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Ppo Percentage Price Oscillator; 100·(EMA_fast − EMA_slow)/EMA_slow. f64 f64 unbounded around zero (percent) (fast=12, slow=26) (Python) slow Indicator-Ppo
Dpo Detrended Price Oscillator; price[t − period/2 − 1] − SMA(period). f64 f64 unbounded around zero period = 20 (Python) max(period, period/2 + 2) Indicator-Dpo
Coppock Coppock Curve; WMA(ROC(long) + ROC(short), wma_period). f64 f64 unbounded around zero (roc_long=14, roc_short=11, wma_period=10) (Python) max(roc_long, roc_short) + wma_period Indicator-Coppock
AcceleratorOscillator AO − SMA(AO, signal); the acceleration of momentum. Candle f64 unbounded around zero (ao_fast=5, ao_slow=34, signal_period=5) (Python) ao_slow + signal_period − 1 Indicator-AcceleratorOscillator
BalanceOfPower (close − open) / (high − low); intrabar buyer/seller control. Candle f64 [−1, +1] (no parameters) 1 Indicator-BalanceOfPower

Volatility & Bands

Indicators that measure dispersion / range and those that draw an envelope around price.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Atr Wilder-smoothed True Range; per-bar absolute volatility. Candle f64 [0, ∞) (price scale) period = 14 (Python) period Indicator-Atr
BollingerBands SMA middle band with ±multiplier × population_stddev bands. f64 (upper, middle, lower, stddev) unbounded (price scale) (period=20, multiplier=2.0) (Python) period Indicator-BollingerBands
Keltner EMA middle band with ±multiplier × ATR bands. Candle (upper, middle, lower) unbounded (price scale) (ema_period=20, atr_period=10, multiplier=2.0) (Python) max(ema_period, atr_period) Indicator-Keltner
Donchian Highest high and lowest low over period bars. Candle (upper, middle, lower) unbounded (price scale) period = 20 (Python) period Indicator-Donchian
Natr 100·ATR/close; ATR as a percentage. Candle f64 [0, ∞) (percent) period = 14 (Python) period Indicator-Natr
StdDev Rolling population standard deviation of price. f64 f64 [0, ∞) (price scale) period = 20 (Python) period Indicator-StdDev
UlcerIndex RMS of trailing-high drawdowns; downside-only risk. f64 f64 [0, ∞) (percent) period = 14 (Python) 2·period − 1 Indicator-UlcerIndex
HistoricalVolatility Annualised sample stddev of log returns. f64 f64 [0, ∞) (annualised percent) (period=20, trading_periods=252) (Python) period + 1 Indicator-HistoricalVolatility
BollingerBandwidth (upper − lower) / middle of the Bollinger Bands. f64 f64 [0, ∞) (period=20, multiplier=2.0) (Python) period Indicator-BollingerBandwidth
PercentB (price − lower) / (upper − lower); price position in the bands. f64 f64 unbounded (01 inside) (period=20, multiplier=2.0) (Python) period Indicator-PercentB
TrueRange `max(H−L, H−prevC , L−prevC )`; raw single-bar volatility. Candle f64
ChaikinVolatility Rate of change of an EMA-smoothed high-low spread. Candle f64 unbounded around zero (percent) (ema_period=10, roc_period=10) (Python) ema_period + roc_period Indicator-ChaikinVolatility
RVIVolatility RSI-shaped volatility direction gauge built on rolling stddev. f64 f64 [0, 100] period = 10 (Python) 2·period − 1 Indicator-RviVolatility
ParkinsonVolatility High-low realised vol; ~5× more efficient than C2C stddev. Candle f64 [0, ∞) (annualised percent) (period=20, trading_periods=252) (Python) period Indicator-ParkinsonVolatility
GarmanKlassVolatility OHLC realised vol; ~7.4× efficient, biased under drift. Candle f64 [0, ∞) (annualised percent) (period=20, trading_periods=252) (Python) period Indicator-GarmanKlassVolatility
RogersSatchellVolatility Drift-free OHLC realised vol; exact under arbitrary Brownian drift. Candle f64 [0, ∞) (annualised percent) (period=20, trading_periods=252) (Python) period Indicator-RogersSatchellVolatility
YangZhangVolatility Drift- and gap-robust OHLC blend of overnight, open-close and Rogers-Satchell. Candle f64 [0, ∞) (annualised percent) (period=20, trading_periods=252) (Python) period + 1 Indicator-YangZhangVolatility

Bands & Channels

Price-envelope overlays beyond the volatility-housed Bollinger / Keltner / Donchian trio. Eleven additional bands organised by what drives their width: fixed percent, ATR, range, regression-residual stddev, fractal swings, or volume-weighted stddev.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
MaEnvelope SMA centerline with fixed-percent envelope. f64 (upper, middle, lower) unbounded (price scale) (period=20, percent=0.025) (Python) period Indicator-MaEnvelope
AccelerationBands Price Headley's momentum-biased bands; width scales with (H − L) / (H + L). Candle (upper, middle, lower) unbounded (price scale) (period=20, factor=0.001) (Python) period Indicator-AccelerationBands
StarcBands Stoller Average Range Channel — SMA(close) ± k·ATR. Candle (upper, middle, lower) unbounded (price scale) (sma_period=6, atr_period=15, multiplier=2.0) (Python) max(sma_period, atr_period) Indicator-StarcBands
AtrBands Close-anchored envelope close ± k·ATR; stop/target bracket. Candle (upper, middle, lower) unbounded (price scale) (period=14, multiplier=3.0) (Python) period Indicator-AtrBands
HurstChannel SMA centerline wrapped by the rolling high-low range. Candle (upper, middle, lower) unbounded (price scale) (period=10, multiplier=0.5) (Python) period Indicator-HurstChannel
LinRegChannel OLS endpoint ± k · σ of regression residuals. f64 (upper, middle, lower) unbounded (price scale) (period=20, multiplier=2.0) (Python) period Indicator-LinRegChannel
StandardErrorBands OLS endpoint ± k · stderr (n − 2 denominator). f64 (upper, middle, lower) unbounded (price scale) (period=21, multiplier=2.0) (Python) period Indicator-StandardErrorBands
DoubleBollinger Two concentric Bollinger envelopes (±k_inner·σ, ±k_outer·σ). f64 5 bands unbounded (price scale) (period=20, k_inner=1.0, k_outer=2.0) (Python) period Indicator-DoubleBollinger
TtmSqueeze BB-inside-KC squeeze flag + detrended-close momentum (LinReg). Candle (squeeze, momentum) squeeze ∈ {0,1}; momentum unbounded (period=20, bb_mult=2.0, kc_mult=1.5) (Python) period Indicator-TtmSqueeze
FractalChaosBands Step-function envelope of the latest Bill Williams 5-bar fractals. Candle (upper, lower) unbounded (price scale) k = 2 (Python) 2k + 1 plus first fractal of each kind Indicator-FractalChaosBands
VwapStdDevBands Cumulative VWAP ± k·σ (volume-weighted standard deviation). Candle (upper, middle, lower, stddev) unbounded (price scale) multiplier = 2.0 (Python) 1 Indicator-VwapStdDevBands

Trailing Stops

ATR-driven stop-loss trackers: per-bar levels that follow a trend and flip when price closes through them.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Psar Wilder's Parabolic Stop-and-Reverse; flips sides on a crossing. Candle f64 unbounded (price scale) (af_start=0.02, af_step=0.02, af_max=0.20) (Python) 2 Indicator-Psar
SuperTrend ATR-banded trailing stop with explicit flip logic. Candle (value, direction) value price scale; direction ±1 (atr_period=10, multiplier=3.0) (Python) atr_period Indicator-SuperTrend
ChandelierExit highest_high − k·ATR (long) and lowest_low + k·ATR (short). Candle (long_stop, short_stop) unbounded (price scale) (period=22, multiplier=3.0) (Python) period Indicator-ChandelierExit
ChandeKrollStop Two-stage ATR stop: extreme-based, then smoothed. Candle (stop_long, stop_short) unbounded (price scale) (atr_period=10, atr_multiplier=1.0, stop_period=9) (Python) atr_period + stop_period − 1 Indicator-ChandeKrollStop
AtrTrailingStop A single line trailing the close by k·ATR, ratcheting. Candle f64 unbounded (price scale) (atr_period=14, multiplier=3.0) (Python) atr_period Indicator-AtrTrailingStop

Volume

Price moves weighted or confirmed by traded volume. All take Candle input.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
Obv On-Balance Volume: cumulative signed volume. Candle f64 unbounded (drifts with volume) (no parameters) 1 Indicator-Obv
Vwap Cumulative volume-weighted average price from the stream start; a sibling RollingVwap(period) is exposed for a finite window. Candle f64 unbounded (price scale) (no parameters) 1 (cumulative); period (rolling) Indicator-Vwap (cumulative + rolling)
Adl Accumulation/Distribution Line; cumulative range-weighted volume. Candle f64 unbounded (drifts with volume) (no parameters) 1 Indicator-Adl
VolumePriceTrend Cumulative volume · ROC; volume weighted by percentage move. Candle f64 unbounded (drifts with volume) (no parameters) 1 Indicator-VolumePriceTrend
ChaikinMoneyFlow Summed money-flow volume over summed volume across period bars. Candle f64 [−1, +1] period = 20 (Python) period Indicator-ChaikinMoneyFlow
ChaikinOscillator EMA(ADL, fast) − EMA(ADL, slow); the MACD of the ADL. Candle f64 unbounded around zero (fast=3, slow=10) (Python) slow Indicator-ChaikinOscillator
ForceIndex EMA((close − prev_close) · volume, period). Candle f64 unbounded around zero period = 13 (Python) period + 1 Indicator-ForceIndex
EaseOfMovement SMA of distance travelled per unit of volume. Candle f64 unbounded around zero (period=14, divisor=1e8) (Python) period + 1 Indicator-EaseOfMovement

Price Statistics

Per-bar price transforms and rolling least-squares regressions.

Indicator One-liner Input Output Range Defaults Warmup Deep dive
TypicalPrice (high + low + close) / 3. Candle f64 unbounded (price scale) (no parameters) 1 Indicator-TypicalPrice
MedianPrice (high + low) / 2. Candle f64 unbounded (price scale) (no parameters) 1 Indicator-MedianPrice
WeightedClose (high + low + 2·close) / 4. Candle f64 unbounded (price scale) (no parameters) 1 Indicator-WeightedClose
LinearRegression Endpoint of the rolling least-squares line. f64 f64 unbounded (price scale) period = 14 (Python) period Indicator-LinearRegression
LinRegSlope Slope of the rolling least-squares line. f64 f64 unbounded around zero period = 14 (Python) period Indicator-LinRegSlope
ZScore (price − SMA(n)) / population_stddev(n). f64 f64 unbounded around zero period = 20 (Python) period Indicator-ZScore
LinRegAngle The rolling regression slope as a degree angle. f64 f64 (−90°, +90°) period = 14 (Python) period Indicator-LinRegAngle

Pick the right indicator for…

A short cheat-sheet of "I want X, which indicator?" answers, grounded in what each indicator actually computes.

  • Fast trend filter, minimal lag. Hma for smoothness + responsiveness, Tema for further lag reduction at the cost of noise, Kama for adaptiveness instead of fixed lag.
  • Slow trend filter. Sma is the simplest; Ema responds slightly faster with the same smoothness budget.
  • Trend-following crossovers. Two-line crossovers are the textbook entry; MacdIndicator packages the idea with a signal line and histogram.
  • Trend strength — is there a trend at all? Adx (> 25 trending, < 20 ranging); ChoppinessIndex / VerticalHorizontalFilter answer the same question without a direction.
  • Overbought / oversold. Rsi is the default; Stochastic for faster signals; WilliamsR for an inverted scale; Mfi for a volume-aware RSI.
  • Volatility level vs. momentum. Atr / TrueRange for the level; ChaikinVolatility for whether ranges are expanding or contracting.
  • Breakout level. Donchian upper/lower bands are the Turtle-style trigger.
  • Trailing stop. Psar, SuperTrend, ChandelierExit, ChandeKrollStop and AtrTrailingStop are a whole family of them.
  • Volume confirmation. Obv is the simplest; ChaikinMoneyFlow is a bounded balance; Vwap / RollingVwap give a volume-weighted reference.
  • Mean reversion. ZScore flags statistically stretched prices; BollingerBandwidth / PercentB locate price within the bands.

Source-of-truth files

Every claim above can be checked against the source in crates/wickra-core/src/indicators/ — one file per indicator. The Rust unit tests inside each module are the ground truth for sample values. Python defaults (the period = 14 etc.) come from the #[pyo3(signature = …)] attributes in bindings/python/src/lib.rs; indicators without a Python default require an explicit argument.

See also

Wickra Wiki

Home

Getting started

Reference

Guides

Moving Averages

Price Oscillators

Momentum Oscillators

Trend & Directional

Price Oscillators

Volatility & Bands

Bands & Channels

Trailing Stops

Volume

Price Statistics

Clone this wiki locally