Skip to content

WickraStreaming-first technical indicators.

292 indicators with a Rust core and Python, Node, and WASM bindings. Same code for backtest and live tick. Install-free.

Wickra

Install in 30 seconds

pip install wickra

A streaming RSI in every language

import wickra as ta

rsi = ta.RSI(14)
for price in live_feed:
    v = rsi.update(price)
    if v is not None and v > 70:
        print('overbought', v)

Why streaming-first matters

A batch-only library recomputes its full indicator over every historical bar each time a new tick arrives. With a 5 000-bar history that's 5 001 work instead of 1. Wickra holds the indicator state in a struct and advances it by one update per tick — the cost stays flat as your history grows.

Library scenarioCost per tick (5 000-bar history)
Wickra (streaming RSI(14))0.119 µs
talipp (streaming RSI(14))1.644 µs (13.8× slower)
pandas-ta (re-batch RSI(14))~5 ms (≈ 42 000× slower at this size)

The streaming gap widens linearly with history length — see the benchmark page for the full table.

How the benchmark is measured

The per-tick numbers come from the same compare_libraries script the benchmark page runs: each library is handed an identical generated price series, warmed up over 5 000 bars, and then timed advancing one tick at a time. The Wickra figure is measured through the Python binding, so the small PyO3 boundary cost is already included rather than hidden in the bare Rust kernel. Reproduced on a Windows 11 / AMD Ryzen 9 9950X machine with Rust 1.92 in release profile — read the values as relative speedups on identical input, not as an absolute performance contract, since CPU, memory clock, and runtime versions all move the absolutes.

Who streaming-first is for

The same indicator object serves three workflows without a code change. For live trading, the optional Binance Spot WebSocket adapter pushes ticks straight into an indicator that updates in constant time, so per-tick latency stays flat even after a session has run for hours. For backtesting, you can replay a full history through that very same struct and trust that batch and streaming produce identical output — the equivalence is pinned by reference-value tests. For research, the Rust core and the Python, Node, and WASM bindings all share one implementation, so a notebook prototype and a production service compute the exact same numbers.

The full indicator catalogue

292 indicators across sixteen families. Every one is implemented once in Rust, re-exported by every binding, and pinned by reference-value tests.

FamilyExamples
Moving AveragesSMA, EMA, WMA, DEMA, TEMA, HMA, KAMA, SMMA, TRIMA, ZLEMA, T3, VWMA
Momentum OscillatorsRSI (Wilder), Stochastic, CCI, ROC, Williams %R, MFI, AO, MOM, CMO, TSI, PMO, StochRSI, Ultimate Oscillator
Trend & DirectionalMACD, ADX (+DI/-DI), Aroon, TRIX, Aroon Osc, Vortex, Mass Index, Choppiness Index, Vertical Horizontal Filter
Price OscillatorsPPO, DPO, Coppock, Accelerator, Balance of Power
Volatility & BandsATR, Bollinger Bands, Keltner, Donchian, NATR, StdDev, Ulcer Index, Historical Volatility, BB Width, %B, True Range, Chaikin Volatility
Trailing StopsParabolic SAR, SuperTrend, Chandelier Exit, Chande Kroll Stop, ATR Trailing Stop
VolumeOBV, VWAP (cumulative + rolling), ADL, VPT, CMF, Chaikin Osc, Force Index, Ease of Movement
Price StatisticsTypical Price, Median Price, Weighted Close, Linear Regression, LR Slope, Z-Score, LR Angle

See the full per-indicator deep-dives in the docs →