{"id":50632929,"url":"https://github.com/wickra-lib/wickra","last_synced_at":"2026-06-07T00:01:26.433Z","repository":{"id":359383796,"uuid":"1245836208","full_name":"wickra-lib/wickra","owner":"wickra-lib","description":"Streaming-first technical indicators with a Rust core and Python, Node.js, and WebAssembly bindings. 423 indicators, O(1) per-tick updates, no system dependencies. Drop-in TA-Lib replacement.","archived":false,"fork":false,"pushed_at":"2026-06-06T19:32:35.000Z","size":4544,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T20:15:31.872Z","etag":null,"topics":["algotrading","backtesting","bollinger-bands","cryptocurrency","finance","indicators","macd","napi-rs","nodejs","pyo3","python","quant","rsi","rust","streaming","ta-lib","technical-analysis","trading","wasm","webassembly"],"latest_commit_sha":null,"homepage":"https://docs.wickra.org","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wickra-lib.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-21T15:50:53.000Z","updated_at":"2026-06-06T19:32:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"73c1bd6c-2eef-4877-bd4a-a4a416348386","html_url":"https://github.com/wickra-lib/wickra","commit_stats":null,"previous_names":["kingchenc/wickra","wickra-lib/wickra"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/wickra-lib/wickra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wickra-lib%2Fwickra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wickra-lib%2Fwickra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wickra-lib%2Fwickra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wickra-lib%2Fwickra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wickra-lib","download_url":"https://codeload.github.com/wickra-lib/wickra/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wickra-lib%2Fwickra/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34003814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algotrading","backtesting","bollinger-bands","cryptocurrency","finance","indicators","macd","napi-rs","nodejs","pyo3","python","quant","rsi","rust","streaming","ta-lib","technical-analysis","trading","wasm","webassembly"],"created_at":"2026-06-07T00:00:39.318Z","updated_at":"2026-06-07T00:01:26.426Z","avatar_url":"https://github.com/wickra-lib.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://wickra.org\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/wickra-lib/.github/main/profile/wickra-banner.webp?v=440\" alt=\"Wickra — streaming-first technical indicators\" width=\"100%\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n[![CI](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml/badge.svg)](https://github.com/wickra-lib/wickra/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/wickra-lib/wickra/actions/workflows/codeql.yml/badge.svg)](https://github.com/wickra-lib/wickra/actions/workflows/codeql.yml)\n[![codecov](https://codecov.io/gh/wickra-lib/wickra/branch/main/graph/badge.svg)](https://codecov.io/gh/wickra-lib/wickra)\n[![GitHub release](https://img.shields.io/github/v/release/wickra-lib/wickra?logo=github\u0026color=green)](https://github.com/wickra-lib/wickra/releases/latest)\n[![crates.io](https://img.shields.io/crates/v/wickra.svg?logo=rust\u0026color=orange)](https://crates.io/crates/wickra)\n[![PyPI](https://img.shields.io/pypi/v/wickra.svg?logo=pypi\u0026color=blue)](https://pypi.org/project/wickra/)\n[![npm](https://img.shields.io/npm/v/wickra.svg?logo=npm\u0026color=red)](https://www.npmjs.com/package/wickra)\n[![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue)](#license)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/wickra-lib/wickra/badge)](https://scorecard.dev/viewer/?uri=github.com/wickra-lib/wickra)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/13094/badge)](https://www.bestpractices.dev/projects/13094)\n[![Build provenance](https://img.shields.io/badge/provenance-attested-brightgreen?logo=github)](https://github.com/wickra-lib/wickra/attestations)\n[![Docs](https://img.shields.io/badge/docs-docs.wickra.org-0ea5e9?logo=readthedocs\u0026logoColor=white)](https://docs.wickra.org)\n\n**Streaming-first technical indicators. Install with `pip install wickra` — no system dependencies.**\n\nWickra is a multi-language technical-analysis library with a Rust core and\nbindings for Python, Node.js, and WebAssembly. Every indicator is a state\nmachine that updates in O(1) per new data point, so live trading bots and\nhistorical backtests share the exact same implementation.\n\n```python\nimport numpy as np\nimport wickra as ta\n\n# Batch: classic TA-Lib-style usage\nprices = np.linspace(100, 200, 1000)\nrsi = ta.RSI(14)\nvalues = rsi.batch(prices)              # numpy array, NaN during warmup\n\n# Streaming: same indicator, fed tick by tick\nrsi = ta.RSI(14)\nfor price in live_feed:\n    value = rsi.update(price)           # O(1) — no recomputation over history\n    if value is not None and value \u003e 70:\n        print(\"overbought\")\n```\n\n## Documentation\n\nFull documentation lives at **[docs.wickra.org](https://docs.wickra.org)**:\n\n- **Quickstarts** — [Rust](https://docs.wickra.org/Quickstart-Rust),\n  [Python](https://docs.wickra.org/Quickstart-Python),\n  [Node](https://docs.wickra.org/Quickstart-Node),\n  [WASM](https://docs.wickra.org/Quickstart-WASM).\n- **Indicators** — a per-indicator deep dive (formula, parameters, warmup) for\n  every one of the 440 indicators; start at the\n  [indicators overview](https://docs.wickra.org/Indicators-Overview).\n- **Reference** — [warmup periods](https://docs.wickra.org/Warmup-Periods),\n  [streaming vs batch](https://docs.wickra.org/Streaming-vs-Batch),\n  [indicator chaining](https://docs.wickra.org/Indicator-Chaining), the\n  [data layer](https://docs.wickra.org/Data-Layer).\n- **Guides** — [Cookbook](https://docs.wickra.org/Cookbook),\n  [TA-Lib migration](https://docs.wickra.org/TA-Lib-Migration),\n  [FAQ](https://docs.wickra.org/FAQ).\n\n## Why Wickra exists\n\nWickra started as a personal itch. The existing TA libraries never quite fit the\nprojects I was building, so I decided to build one from the ground up — partly to\nlearn, partly because I genuinely enjoy taking something that already exists and\ntrying to do it differently (and, ideally, better). It's open source because the\nuseful version of that itch is the one other people can build on too.\n\nPlenty of TA libraries are fast. Each one forces a trade-off Wickra does not:\n\n| Library          | Install     | Streaming   | Languages                   | Indicators | Active |\n|------------------|-------------|-------------|-----------------------------|-----------:|--------|\n| **★\u0026nbsp;Wickra**| **clean**   | **yes, O(1)** | **Python · Node · WASM · Rust** | **423** | **yes** |\n| kand             | clean       | yes         | Python · WASM · Rust        |       ~60  | yes    |\n| ta-rs            | clean       | yes         | Rust only                   |       ~30  | stale  |\n| yata             | clean       | partial     | Rust only                   |       ~35  | yes    |\n| TA-Lib           | yes (C deps)| no          | many bindings               |      ~150  | barely |\n| pandas-ta        | clean       | no          | Python                      |      ~130  | slow   |\n| finta            | clean       | no          | Python                      |       ~80  | stale  |\n| talipp           | clean       | yes         | Python                      |       ~40  | yes    |\n\nWickra's edge is **breadth with reach**: 440 indicators that all update in O(1)\nper tick and ship natively to Python, Node.js, WebAssembly and Rust from a\nsingle engine.\n\n**On speed — and why Wickra isn't the fastest.** It deliberately isn't. The\nleaner Rust crates (kand, ta-rs) win several of the micro-benchmarks below, and\nthose losses are shown rather than hidden. The gap is a *choice*, not a ceiling:\nevery `update` validates its input, runs a real warmup before it emits a value,\nand returns an `Option` so a single bad tick can't silently poison the state.\nta-rs, by contrast, hands back a bare `f64` from the first tick with no\nvalidation. If Wickra threw all of that away — raw `f64` out, no checks, no\nwarmup contract — it would match or beat the leanest crate on every row. It\nkeeps the guarantees instead, and still wins RSI, Bollinger and ATR against kand.\nWhat no other library matches is the *combination*: catalogue size, native O(1)\nstreaming, NaN-safety, and four first-class language targets at once.\n\n## Benchmarks\n\nThree comparisons, split by layer and mode. Read them as **relative** speedups\non identical input — absolute µs depend on CPU, memory clock and OS scheduler,\nnot a universal contract.\n\n- **Reproduced on:** Windows 11 Pro 26200, AMD Ryzen 9 9950X, 64 GB DDR5,\n  Rust 1.92 (release: `lto = \"fat\"`, `codegen-units = 1`), Python 3.12.\n- **Reproduce yourself:**\n  - Rust core vs Rust crates: `cargo bench -p wickra-bench`\n  - Python vs Python libs: `pip install -e bindings/python[bench]` then\n    `python -m benchmarks.compare_libraries` (auto-detects installed peers).\n\n### 1. Rust core vs the other Rust TA crates\n\nLike-for-like, no language-binding overhead, over a 50 000-bar series (µs for\nthe whole series, lower = faster). This is the honest engine comparison —\nWickra wins some and loses some, and both are shown.\n\n**Streaming** (one value fed per `update`):\n\n| Indicator        | **★\u0026nbsp;Wickra** | kand | ta-rs | yata |\n|------------------|------------------:|-----:|------:|-----:|\n| SMA(20)          | 50                | 38   | 47    | 38   |\n| EMA(20)          | 154               | 69   | 56    | 69   |\n| RSI(14)          | 164               | 216  | 74    | —    |\n| MACD(12, 26, 9)  | 275               | 143  | 66    | —    |\n| Bollinger(20, 2) | **128 ★**         | 248  | 168   | —    |\n| ATR(14)          | 152               | 166  | 61    | —    |\n\n**Batch** (whole series at once). Only Wickra and kand expose a batch API;\nta-rs and yata are streaming-only.\n\n| Indicator        | **★\u0026nbsp;Wickra** | kand |\n|------------------|------------------:|-----:|\n| SMA(20)          | 82                | 42   |\n| EMA(20)          | 159               | 74   |\n| RSI(14)          | **253 ★**         | 274  |\n| MACD(12, 26, 9)  | 681               | 283  |\n| Bollinger(20, 2) | **445 ★**         | 462  |\n| ATR(14)          | 175               | 173  |\n\nta-rs is the per-indicator speed champion on almost every row — it returns a\nbare `f64` with no warmup state and no input validation, trading away the\n`None`-warmup and NaN-safety semantics Wickra keeps. Against kand, Wickra wins\nstreaming RSI, Bollinger and ATR (and batch RSI + Bollinger); Bollinger is the\none row where Wickra is the outright fastest of all four. The leaner crates\nstill win the pure recurrences (EMA, MACD) and SMA. yata exposes only SMA/EMA as\nraw-value methods, so its other rows are omitted rather than faked.\n\n### 2. Python vs the Python TA ecosystem — batch\n\nFull pass over a 20 000-bar series, µs/op (lower = faster). **★** per row.\n\n| Indicator        | **★\u0026nbsp;Wickra** | finta               | TA-Lib | tulipy |\n|------------------|------------------:|---------------------|--------|--------|\n| SMA(20)          | **59.6 ★**        | 354.2 (5.9× slower) | ⧗      | ⧗      |\n| EMA(20)          | **88.4 ★**        | 309.3 (3.5× slower) | ⧗      | ⧗      |\n| RSI(14)          | **77.3 ★**        | 1 283 (16.6× slower)| ⧗      | ⧗      |\n| MACD(12, 26, 9)  | **116.4 ★**       | 529.5 (4.6× slower) | ⧗      | ⧗      |\n| Bollinger(20, 2) | **146.0 ★**       | 1 246 (8.5× slower) | ⧗      | ⧗      |\n| ATR(14)          | **135.8 ★**       | 3 812 (28× slower)  | ⧗      | ⧗      |\n\n\u003e ⧗ = published by the CI Linux job. TA-Lib and tulipy ship C extensions that\n\u003e don't build cleanly on every desktop, so their canonical numbers come from the\n\u003e `cross-library-bench` workflow rather than this local table. pandas-ta needs\n\u003e Python ≥ 3.12 and isn't in the 3.11 CI matrix. The script auto-detects\n\u003e whichever peers are installed in your environment.\n\n### 3. Python — streaming (per-tick latency)\n\nSeed 5 000 bars, then feed ticks one at a time. talipp is the only Python peer\nwith a true incremental API; batch-only libraries like TA-Lib must recompute the\nentire history on every tick — Wickra updates in O(1).\n\n| Indicator        | **★\u0026nbsp;Wickra (per tick)** | talipp (per tick)       |\n|------------------|------------------------------:|-------------------------|\n| SMA(20)          | **0.067 µs ★**                | 0.63 µs (9.4× slower)   |\n| EMA(20)          | **0.051 µs ★**                | 0.63 µs (12.2× slower)  |\n| RSI(14)          | **0.053 µs ★**                | 1.00 µs (19.1× slower)  |\n| MACD(12, 26, 9)  | **0.071 µs ★**                | 3.64 µs (51.5× slower)  |\n| Bollinger(20, 2) | **0.085 µs ★**                | 4.87 µs (57.2× slower)  |\n\nRun the suite yourself:\n\n```bash\ncargo bench -p wickra-bench            # Rust core vs kand / ta-rs / yata\npip install -e bindings/python[bench]  # Python peers\npython -m benchmarks.compare_libraries\n```\n\n## Indicators\n\n440 streaming-first indicators across twenty-four families. Every one passes the\n`batch == streaming` equivalence test, reference-value tests, and reset\nsemantics tests. Each has a per-indicator deep dive (formula, parameters,\nwarmup) at [docs.wickra.org](https://docs.wickra.org/Indicators-Overview).\n\n| Family | Indicators |\n|--------|-----------|\n| Moving Averages      | SMA, EMA, WMA, DEMA, TEMA, HMA, KAMA, SMMA, TRIMA, ZLEMA, T3, VWMA, ALMA, McGinley Dynamic, FRAMA, VIDYA, JMA, Alligator, EVWMA, SWMA, GMA, EHMA, Median MA, Adaptive Laguerre, GD, Holt-Winters |\n| Momentum Oscillators | RSI (Wilder), Anchored RSI, Stochastic, CCI, ROC, Williams %R, MFI, Awesome Oscillator, MOM, CMO, TSI, PMO, StochRSI, Ultimate Oscillator, RVI, PGO, KST, SMI, Laguerre RSI, Connors RSI, Inertia, ROC Percentage (ROCP), ROC Ratio (ROCR), ROC Ratio 100 (ROCR100), Disparity Index, Fisher RSI, RSX, Dynamic Momentum Index, Stochastic CCI, RMI, Derivative Oscillator, Elder Ray, Intraday Momentum Index, QQE |\n| Trend \u0026 Directional  | MACD, MACD Fixed (MACDFIX), MACD Extended (MACDEXT), ADX (+DI/-DI), ADXR, Aroon, TRIX, Aroon Oscillator, Vortex, Random Walk Index, Trend Intensity Index, Wave Trend Oscillator, Mass Index, Choppiness Index, Vertical Horizontal Filter, Plus DM, Minus DM, Plus DI, Minus DI, DX, TTM Trend, Trend Strength Index, Qstick, Polarized Fractal Efficiency, Wave PM, Gator Oscillator, Kase Permission Stochastic |\n| Price Oscillators    | PPO, DPO, Coppock, Accelerator Oscillator, Balance of Power, APO, AO Histogram, CFO, Zero-Lag MACD, Elder Impulse, STC, TSF Oscillator, MACD Histogram, PPO Histogram |\n| Volatility \u0026 Bands   | ATR, Bollinger Bands, Keltner Channels, Donchian Channels, NATR, StdDev, Ulcer Index, Historical Volatility, Bollinger Bandwidth, %B, True Range, Chaikin Volatility, RVI (Relative Volatility Index), Parkinson Volatility, Garman-Klass Volatility, Rogers-Satchell Volatility, Yang-Zhang Volatility, Volatility Cone |\n| Bands \u0026 Channels     | MA Envelope, Acceleration Bands, STARC Bands, ATR Bands, Hurst Channel, LinReg Channel, Standard Error Bands, Double Bollinger Bands, TTM Squeeze, Fractal Chaos Bands, VWAP StdDev Bands, Quartile Bands, Bomar Bands, Median Channel, Projection Bands, Projection Oscillator |\n| Trailing Stops       | Parabolic SAR, Parabolic SAR Extended (SAREXT), SuperTrend, Chandelier Exit, Chande Kroll Stop, ATR Trailing Stop, HiLo Activator, Volty Stop, Yo-Yo Exit, Donchian Channel Stop, Percentage Trailing Stop, Step Trailing Stop, Renko Trailing Stop, Kase DevStop, Elder SafeZone, ATR Ratchet, NRTR, Time-Based Stop, Modified MA Stop |\n| Volume               | OBV, VWAP (cumulative + rolling), ADL, Volume-Price Trend, Chaikin Money Flow, Chaikin Oscillator, Force Index, Ease of Movement, Klinger Volume Oscillator, Volume Oscillator, NVI, PVI, Williams A/D, Anchored VWAP, Demand Index, TSV, VZO, Market Facilitation Index |\n| Price Statistics     | Typical Price, Median Price, Weighted Close, Linear Regression, Linear Regression Slope, Z-Score, Linear Regression Angle, Variance, Coefficient of Variation, Skewness, Kurtosis, Standard Error, Detrended StdDev, R², Median Absolute Deviation, Autocorrelation, Hurst Exponent, Pearson Correlation, Beta, Pairwise Beta, Pair Spread Z-Score, Lead-Lag Cross-Correlation, Cointegration, Relative Strength A-vs-B, Spearman Correlation, Mid Price, Mid Point, Average Price, Linear Regression Intercept, Time Series Forecast, Rolling Correlation, Rolling Covariance, OU Half-Life, Spread Hurst, Distance SSD, Beta-Neutral Spread, Variance Ratio, Granger Causality, Kalman Hedge Ratio, Spread Bollinger Bands, Spread AR(1) Coefficient |\n| Ehlers / Cycle (DSP) | MAMA, FAMA, Fisher Transform, Inverse Fisher Transform, SuperSmoother, Hilbert Dominant Cycle, Hilbert Phasor, Hilbert DC Phase, Hilbert Trend Mode, Sine Wave, Decycler, Decycler Oscillator, Roofing Filter, Center of Gravity, Cybernetic Cycle, Adaptive Cycle, Empirical Mode Decomposition, Ehlers Stochastic, Instantaneous Trendline |\n| Pivots \u0026 S/R         | Classic Pivots, Fibonacci Pivots, Camarilla, Woodie Pivots, DeMark Pivots, Williams Fractals, ZigZag |\n| DeMark               | TD Setup, TD Sequential, TD DeMarker, TD REI, TD Pressure, TD Combo, TD Countdown, TD Lines, TD Range Projection, TD Differential, TD Open, TD Risk Level |\n| Ichimoku \u0026 Charts    | Ichimoku Kinko Hyo (Tenkan, Kijun, Senkou A/B, Chikou), Heikin-Ashi |\n| Alt-Chart Bars       | Renko (box-size bricks), Kagi (reversal-amount lines), Point \u0026 Figure (X/O columns) |\n| Candlestick Patterns | Doji, Hammer, Inverted Hammer, Hanging Man, Shooting Star, Engulfing, Harami, Morning/Evening Star, Three White Soldiers/Black Crows, Piercing Line/Dark Cloud Cover, Marubozu, Tweezer, Spinning Top, Three Inside Up/Down, Three Outside Up/Down, Two Crows, Upside Gap Two Crows, Identical Three Crows, Three Line Strike, Three Stars in the South, Abandoned Baby, Advance Block, Belt-hold, Breakaway, Counterattack, Doji Star, Dragonfly Doji, Gravestone Doji, Long-Legged Doji, Rickshaw Man, Evening Doji Star, Morning Doji Star, Gap Side-by-Side White, High-Wave, Hikkake, Modified Hikkake, Homing Pigeon, On-Neck, In-Neck, Thrusting, Separating Lines, Kicking, Kicking by Length, Ladder Bottom, Mat Hold, Matching Low, Long Line, Short Line, Rising Three Methods, Falling Three Methods, Upside Gap Three Methods, Downside Gap Three Methods, Stalled Pattern, Stick Sandwich, Takuri, Closing Marubozu, Opening Marubozu, Tasuki Gap, Unique Three River, Concealing Baby Swallow |\n| Chart Patterns       | Double Top / Bottom, Triple Top / Bottom, Head and Shoulders, Triangle (asc/desc/sym), Wedge (rising/falling), Flag / Pennant, Rectangle / Range, Cup and Handle |\n| Harmonic Patterns    | AB=CD, Gartley, Butterfly, Bat, Crab, Shark, Cypher, Three Drives |\n| Fibonacci            | Fibonacci Retracement, Fibonacci Extension, Fibonacci Projection, Auto-Fibonacci, Golden Pocket, Fibonacci Confluence, Fibonacci Fan, Fibonacci Arcs, Fibonacci Channel, Fibonacci Time Zones |\n| Microstructure       | Order-Book Imbalance (Top-1 / Top-N / Full), Microprice, Quoted Spread, Depth Slope, Signed Volume, Cumulative Volume Delta, Trade Imbalance, Effective Spread, Realized Spread, Kyle's Lambda, Footprint, Order Flow Imbalance, VPIN, Amihud Illiquidity, Roll Measure |\n| Derivatives          | Funding Rate, Funding Rate Mean, Funding Rate Z-Score, Funding Basis, Open-Interest Delta, OI / Price Divergence, OI-Weighted Price, Long/Short Ratio, Taker Buy/Sell Ratio, Liquidation Features, Term-Structure Basis, Calendar Spread |\n| Market Profile       | Value Area (POC / VAH / VAL), Volume Profile (histogram), TPO Profile, Initial Balance, Opening Range |\n| Market Breadth       | Advance/Decline Line, Advance/Decline Ratio, Advance/Decline Volume Line, McClellan Oscillator, McClellan Summation Index, TRIN / Arms Index, Breadth Thrust, New Highs - New Lows, High-Low Index, Percent Above Moving Average, Up/Down Volume Ratio, Bullish Percent Index, Cumulative Volume Index, Absolute Breadth Index, TICK Index |\n| Risk / Performance   | Sharpe Ratio, Sortino Ratio, Calmar Ratio, Omega Ratio, Max Drawdown, Average Drawdown, Drawdown Duration, Pain Index, Value at Risk, Conditional Value at Risk (CVaR), Profit Factor, Gain/Loss Ratio, Recovery Factor, Kelly Criterion, Treynor Ratio, Information Ratio, Alpha (Jensen) |\n| Seasonality \u0026 Session | Session VWAP, Session High/Low, Session Range, Average Daily Range, Overnight Gap, Overnight/Intraday Return, Turn-of-Month, Seasonal Z-Score, Time-of-Day Return Profile, Day-of-Week Profile, Intraday Volatility Profile, Volume-by-Time Profile |\n\nEvery candlestick pattern emits a signed per-bar value — `+1.0` bullish,\n`−1.0` bearish, `0.0` none — so the family drops straight into a feature matrix\nas one column each. `Doji` is direction-less by default (`+1.0` / `0.0`);\nconstruct it in signed mode (`Doji::new().signed()`, `Doji(signed=True)`,\n`new Doji(true)`) for a dragonfly / gravestone `±1` reading.\n\nAdding a new indicator means implementing one trait in Rust; all four bindings\ninherit it automatically.\n\n## Languages\n\n| Binding           | Install                                       | Example |\n|-------------------|-----------------------------------------------|---------|\n| Python (PyO3)     | `pip install wickra`                          | `examples/python/backtest.py` |\n| Node.js (napi-rs) | `npm install wickra`                          | `examples/node/backtest.js` |\n| Browser / WASM    | `npm install wickra-wasm`                     | `examples/wasm/index.html` |\n| Rust              | `cargo add wickra`                            | `examples/rust/src/bin/backtest.rs` |\n\nEach binding ships several runnable examples (streaming, backtest, live feed);\n[`examples/README.md`](examples/README.md) is the full cross-language index.\n\nThe wickra-core crate is `unsafe`-forbidden, so every binding inherits a\nmemory-safe implementation.\n\n## Rust API\n\n```rust\nuse wickra::{Indicator, BatchExt, Chain, Ema, Rsi, Sma};\n\n// Streaming or batch — same trait, same code.\nlet mut sma = Sma::new(14)?;\nlet out: Vec\u003cOption\u003cf64\u003e\u003e = sma.batch(\u0026[1.0, 2.0, 3.0, 4.0, 5.0]);\n\nlet mut rsi = Rsi::new(14)?;\nfor price in live_feed {\n    if let Some(v) = rsi.update(price) {\n        println!(\"RSI = {v}\");\n    }\n}\n\n// Compose indicators: RSI(7) on top of EMA(14).\nlet mut chain = Chain::new(Ema::new(14)?, Rsi::new(7)?);\nchain.update(price);\n```\n\n## Live data sources\n\n`wickra-data` (separate crate, opt-in) ships:\n\n- A streaming OHLCV **CSV reader**.\n- A **tick-to-candle aggregator** with arbitrary timeframes.\n- A **candle resampler** for multi-timeframe analysis (1m → 5m → 1h on the fly).\n- A **Binance Spot WebSocket** kline adapter (feature `live-binance`).\n\n```rust\nuse wickra::{Indicator, Rsi};\nuse wickra_data::live::binance::{BinanceKlineStream, Interval};\n\nlet mut stream = BinanceKlineStream::connect(\u0026[\"BTCUSDT\".into()], Interval::OneMinute).await?;\nlet mut rsi = Rsi::new(14)?;\nwhile let Some(event) = stream.next_event().await? {\n    if event.is_closed {\n        if let Some(v) = rsi.update(event.candle.close) {\n            println!(\"RSI = {v:.2}\");\n        }\n    }\n}\n```\n\nA Python live-trading example using the public `websockets` package lives at\n`examples/python/live_trading.py`.\n\n## Project layout\n\n```\nwickra/\n├── crates/\n│   ├── wickra-core/         core engine + all 440 indicators\n│   ├── wickra/              top-level facade crate (publishes on crates.io) + benches/\n│   ├── wickra-data/         CSV reader, tick aggregator, live exchange feeds\n│   └── wickra-bench/        internal cross-library benchmark harness (not published)\n├── bindings/\n│   ├── python/              PyO3 + maturin (publishes on PyPI)\n│   ├── node/                napi-rs (publishes on npm)\n│   └── wasm/                wasm-bindgen (browsers, bundlers, Node)\n├── examples/                examples/README.md indexes every language\n│   ├── data/                real BTCUSDT OHLCV datasets, one per timeframe\n│   ├── rust/                Rust workspace member (`wickra-examples`)\n│   ├── python/              backtest, live trading, parallel assets, multi-tf\n│   ├── node/                streaming, backtest, live trading (load `wickra`)\n│   └── wasm/                browser demo for `wickra-wasm`\n└── .github/workflows/       CI and release pipelines\n```\n\nWickra's own regression benchmarks live in `crates/wickra/benches/`; the\ncross-library comparison against kand, ta-rs and yata lives in the internal\n`crates/wickra-bench/` crate. Runnable Rust examples live in the workspace member\ncrate at `examples/rust/`. There is no top-level `benches/` directory.\n\n## Building everything from source\n\n```bash\n# Rust core + tests\ncargo test --workspace\ncargo clippy --workspace --all-targets -- -D warnings\ncargo bench -p wickra           # Wickra's own regression benchmarks\ncargo bench -p wickra-bench     # cross-library comparison (kand, ta-rs, yata)\n\n# Python binding (requires Rust toolchain + maturin)\ncd bindings/python\nmaturin develop --release\npytest\n\n# WASM binding (requires wasm-pack + wasm32-unknown-unknown target)\nwasm-pack build bindings/wasm --target web --release --features panic-hook\n\n# Node binding (requires @napi-rs/cli)\ncd bindings/node \u0026\u0026 npm install \u0026\u0026 npm run build \u0026\u0026 npm test\n```\n\n## Testing\n\nEvery layer is covered; run the suites with the commands in\n[Building everything from source](#building-everything-from-source).\n\n- `wickra-core`: unit tests per indicator — textbook reference values\n  (Wilder RSI, Bollinger Bands, MACD, ATR, Stochastic), `batch == streaming`\n  equivalence, `reset` semantics, NaN/Inf handling, and property tests.\n- `wickra-data`: unit tests for CSV decoding, the tick aggregator, the\n  resampler, and the Binance payload parser.\n- `bindings/python`: pytest covering smoke checks, streaming/batch\n  equivalence, reference values, lifecycle, input validation, and\n  dict/tuple candle inputs.\n- `bindings/node`: `node --test` cases for batch, streaming, and reference\n  values across all indicators.\n- `bindings/wasm`: `wasm-bindgen-test` cases for constructors, equivalence,\n  and reference values.\n\n## Contributing\n\nContributions are very welcome — issues, bug reports, ideas, and pull requests\nall land in the same place: \u003chttps://github.com/wickra-lib/wickra\u003e.\n\nA short orientation for first-time contributors:\n\n- **Adding an indicator.** Implement the `Indicator` trait in\n  `crates/wickra-core/src/indicators/\u003cname\u003e.rs`, wire it into\n  `indicators/mod.rs` and the crate root, and add reference-value tests,\n  a `batch == streaming` equivalence test, and (where it makes sense) a\n  proptest. The four bindings inherit your indicator automatically once\n  you expose it in the language wrappers.\n- **Fixing a numeric bug.** Add a failing test that pins the textbook value\n  first, then fix the math. Property tests in `crates/wickra-core` catch\n  most regressions; please don't disable them.\n- **Improving a binding.** Each binding lives under `bindings/\u003clang\u003e` with\n  its own tests; please keep the `batch == streaming` invariant.\n- **Style.** `cargo fmt --all` + `cargo clippy --workspace --all-targets -- -D warnings`\n  are CI gates; running them locally before pushing keeps reviews short.\n\nFor larger architectural changes, open an issue first so we can sketch the\nshape together before you invest the time.\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or\n  \u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttp://opensource.org/licenses/MIT\u003e)\n\nat your option. Use it, fork it, modify it, redistribute it — commercially or\nnot — file issues, send pull requests; all welcome.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n\n## Disclaimer\n\nWickra is an indicator toolkit, not a trading system. Values it computes are\ndeterministic transforms of the input data — they are not financial advice and\nthey do not predict the market. Any use of this library in a production\ntrading context is at your own risk.\n\nThe library is provided **as is**, without warranty of any kind; see\n[LICENSE](LICENSE) for the full terms.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/wickra-lib/wickra/stargazers\"\u003e\n    \u003cimg alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/wickra-lib/wickra?style=for-the-badge\u0026logo=github\u0026logoColor=white\u0026color=ffd866\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/wickra-lib/wickra/network/members\"\u003e\n    \u003cimg alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/wickra-lib/wickra?style=for-the-badge\u0026logo=github\u0026logoColor=white\u0026color=78dce8\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/wickra-lib/wickra/issues\"\u003e\n    \u003cimg alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues/wickra-lib/wickra?style=for-the-badge\u0026logo=github\u0026logoColor=white\u0026color=ff6188\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  If Wickra saved you time, the cheapest way to say thanks is to ⭐ the repo.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://star-history.com/#wickra-lib/wickra\u0026Date\"\u003e\n    \u003cimg alt=\"Wickra star history\" width=\"640\"\n         src=\"https://api.star-history.com/svg?repos=wickra-lib/wickra\u0026type=Date\u0026theme=dark\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwickra-lib%2Fwickra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwickra-lib%2Fwickra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwickra-lib%2Fwickra/lists"}