Wickra Screener
July 4, 2026 · View on GitHub
Wickra Screener
Scan thousands of symbols in parallel against data-driven conditions over 514 O(1) streaming indicators.
▶ Live demo: all 514 indicators over real Binance market data, computed live in your browser — live.wickra.org · zero backend, powered by
wickra-wasm.
Part of the Wickra ecosystem: the same data-driven core and ten-language binding surface also power wickra-exchange, wickra-backtest, wickra-terminal, wickra-screener, wickra-xray, wickra-radar, wickra-copilot and wickra-shazam.
Wickra Screener is one data-driven core, screener-core:
a serde condition tree (ScanSpec) is folded over each symbol's history with
the Wickra library of 514 O(1) streaming
indicators, evaluated at the latest bar, and scanned across the whole universe in
parallel (rayon) or sequentially (the WASM fallback) — byte-for-byte identical.
Because conditions are data, not code, the exact same scan crosses the C ABI
and WASM unchanged. The core is exposed as a JSON-over-C-ABI data API
(Screener::command) in Rust, Python, Node.js, WASM, C, C++, C#, Go, Java and
R, so a developer in any language runs the same screen.
- Batch —
scan_batch(universe, spec)folds every symbol over its full history and evaluates at the last bar. - Streaming —
feed(symbol, candle)+evaluate(), O(1) per tick, for a live scan over the current state. - Cross-section & breadth — rank, percentile, z-score and market-breadth conditions that see every symbol of a bar at once.
Status
Pre-release — functionally complete, CI-verified, not yet published. The core, the CLI, all ten language bindings, the byte-exact golden corpus, property + fuzz tests, benchmarks and one runnable example per language are in place and green across the full CI matrix (10 languages × 3 OS). Not yet released to any registry — track progress in ROADMAP.md.
Documentation
- Architecture — the core, the data-driven boundary, the binding surface.
- Guides under
docs/: Conditions & ScanSpec · Indicators · Cross-section & breadth · Streaming vs batch · Cookbook · Internals. - ROADMAP.md · BENCHMARKS.md · THREAT_MODEL.md · SECURITY.md.
Quickstart
# Scan a universe of CSV candle files against a spec, human-readable table:
cargo run -p wickra-screener -- --spec golden/specs/momentum.json --data golden/data
# Raw ScanReport JSON (the same bytes every binding returns):
cargo run -p wickra-screener -- --spec golden/specs/momentum.json --data golden/data --format json
Each <SYMBOL>.csv in the --data directory is one symbol's candle history; or
pass a JSON dataset on standard input with --stdin.
ScanSpec / conditions
A scan is a JSON (or TOML) document: a universe, a condition tree, and an
optional limit and rank. Expressions (kind) are constants, price fields or
indicators; conditions (type) compare, cross, or aggregate them.
{
"universe": ["AAA", "BBB", "CCC"],
"condition": {
"type": "all",
"conditions": [
{ "type": "cmp",
"left": { "kind": "indicator", "name": "Rsi", "params": [14] },
"op": "lt",
"right": { "kind": "const", "value": 30.0 } },
{ "type": "cmp",
"left": { "kind": "indicator", "name": "Ema", "params": [7] },
"op": "crosses_above",
"right": { "kind": "indicator", "name": "Ema", "params": [19] } }
]
},
"rank": { "by": { "kind": "indicator", "name": "Roc", "params": [10] }, "desc": true },
"limit": 25
}
- Expressions (
kind):const,price(open/high/low/close/…),indicator(a PascalCase Wickra indicator + params —Rsi,Ema,Macd,BollingerBands, …). - Conditions (
type):cmp(gt/lt/crosses_above/…),cross_section,breadth, and the boolean combinatorsall/any/not.
Cross-section & breadth
Most screens look at one symbol at a time. Cross-section and breadth conditions look at every symbol of the same bar at once — the thing a per-symbol loop cannot express:
- Cross-section —
percentile_rank,z_scoreandrankof a symbol's metric within the universe (e.g. "top-decile 10-bar momentum":Roc(10)ranked across all symbols). - Breadth — a market-wide predicate ("more than 60% of the universe above its
Sma(200)") usable as a gate on the individual matches.
Both are evaluated once per bar over the full cross-section and stay byte-identical between the parallel and sequential scan paths.
Use in any language
The same Screener handle — construct from a JSON spec, drive with
command(json) -> json, read version — is reachable from every binding:
from wickra_screener import Screener
s = Screener('{"universe":["AAA","BBB"],"condition":{"type":"cmp",'
'"left":{"kind":"price","field":"close"},"op":"gt",'
'"right":{"kind":"const","value":10.0}}}')
report = s.command('{"cmd":"scan","data":{"AAA":[...],"BBB":[...]}}') # JSON ScanReport
The C ABI hub (bindings/c) backs C, C++, C#, Go, Java and R; Rust, Python,
Node.js and WASM are native. See each bindings/<lang>/README.md and the runnable
examples/.
Project layout
crates/screener-core the data-driven core (ScanSpec, Expr, Condition, scan_batch, streaming)
crates/screener-cli the CLI (bin: wickra-screener)
crates/screener-bench criterion benchmarks
bindings/{python,node,wasm,c,go,csharp,java,r} the ten-language surface
golden/ CSV + JSON universes, specs, and byte-exact expected reports
fuzz/ cargo-fuzz targets (spec_parse, condition_eval, scan_batch, symbol_fold)
examples/ one runnable "scan a small universe" example per language
Building from source
cargo build --workspace
cargo test --workspace --all-features
cargo test --workspace --no-default-features # sequential scan path
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo run -p wickra-screener -- --spec golden/specs/momentum.json --data golden/data
Requirements
- Rust ≥ 1.86 (workspace MSRV; the Node binding needs ≥ 1.88).
- Binding toolchains as needed: Node ≥ 22, Python ≥ 3.9, a C toolchain, .NET 8,
JDK 22+, Go 1.23, R — see each
bindings/<lang>/README.md.
Benchmarks
crates/screener-bench measures scan_batch scaling by universe size and
indicator count, parallel vs sequential. See BENCHMARKS.md.
Ecosystem
Part of the Wickra family — each one a data-driven core with a CLI and the same ten-language binding surface:
- wickra — the core library: 514 O(1) streaming indicators across ten languages
- wickra-exchange — unified market-data + execution across ten crypto exchanges
- wickra-backtest — event-driven backtester over the Wickra core
- wickra-terminal — the trading terminal: a TUI and a browser renderer over the stack
- wickra-screener — parallel multi-symbol screening over 514 streaming indicators
- wickra-xray — market-microstructure explorer: footprint, order-book heatmap, liquidation map, funding/OI divergence
- wickra-radar — perp-universe alert radar: OI delta, funding flip, book imbalance, liquidation clusters, OI/price divergence
- wickra-copilot — local market copilot grounded in real order-book, liquidation and funding microstructure
- wickra-shazam — match an asset's current microstructure fingerprint against its entire history
Docs at docs.wickra.org; the marketing site and in-browser demo at wickra.org.
Contributing
See CONTRIBUTING.md and CODE_OF_CONDUCT.md.
Commits are signed and in English; open a PR against main.
Security
See SECURITY.md and THREAT_MODEL.md. Report vulnerabilities privately — never in a public issue.
License
Dual-licensed under either MIT or Apache-2.0, at your option.
Disclaimer
Wickra Screener is analysis software: it computes indicator values and evaluates conditions over historical and live market data. It is provided "as is", without warranty of any kind, and is not financial advice — it places no orders. Trading carries risk of loss; review the code and use at your own discretion.
