Synced from the private engine at 1e39bfa (branch feat/sweep-choice-expr),
tracked files only. Two additions to the expression API:
- tf("1h").apply(expr): evaluate an expression ON the higher timeframe's
grid, then step-hold it onto the simulation grid without lookahead.
Periods inside count in that timeframe's bars, so
tf("1h").apply(sma(close, param("len"))) is a true SMA of len hourly
closes, sweepable like any param.
- choice(name, {branch: expr}): sweep a CHOICE of expression. The selector
becomes a grid axis; each combination resolves to its branch before
simulation.
Wheel for this preview is attached to the v0.19.0rc1 pre-release; built
locally, not by the release pipeline, not on PyPI.
- Cross-exchange backtesting (Pro)
- Dict universe format (provider-based symbol resolution)
- Exogenous data support (register_exo + exo() expressions)
- Provider-based data layout (binance/1h/TICKER.arrow)
- Preload fix for provider layout
- Exo column resampling for multi-resolution
- Pro gate for cross-exchange (clean exit)
- ATR/ADX rolling SMA fix
- Precise mode hybrid fills
- Add ingest() function for downloading bar data from providers
- Add manifoldbt CLI entry point (manifoldbt ingest ...)
- Supported providers: binance, hyperliquid (free), databento, massive (Pro)
- Update type stubs for py_ingest