O(1) per tick
Every indicator is a state machine. Streaming updates are constant-time — no recomputing over history on every new bar.
292 indicators with a Rust core and Python, Node, and WASM bindings. Same code for backtest and live tick. Install-free.
pip install wickraimport 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)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 scenario | Cost 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.
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.
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.
292 indicators across sixteen families. Every one is implemented once in Rust, re-exported by every binding, and pinned by reference-value tests.
| Family | Examples |
|---|---|
| Moving Averages | SMA, EMA, WMA, DEMA, TEMA, HMA, KAMA, SMMA, TRIMA, ZLEMA, T3, VWMA |
| Momentum Oscillators | RSI (Wilder), Stochastic, CCI, ROC, Williams %R, MFI, AO, MOM, CMO, TSI, PMO, StochRSI, Ultimate Oscillator |
| Trend & Directional | MACD, ADX (+DI/-DI), Aroon, TRIX, Aroon Osc, Vortex, Mass Index, Choppiness Index, Vertical Horizontal Filter |
| Price Oscillators | PPO, DPO, Coppock, Accelerator, Balance of Power |
| Volatility & Bands | ATR, Bollinger Bands, Keltner, Donchian, NATR, StdDev, Ulcer Index, Historical Volatility, BB Width, %B, True Range, Chaikin Volatility |
| Trailing Stops | Parabolic SAR, SuperTrend, Chandelier Exit, Chande Kroll Stop, ATR Trailing Stop |
| Volume | OBV, VWAP (cumulative + rolling), ADL, VPT, CMF, Chaikin Osc, Force Index, Ease of Movement |
| Price Statistics | Typical Price, Median Price, Weighted Close, Linear Regression, LR Slope, Z-Score, LR Angle |