Strategies
BTC Passive Micro-Dislocation Liquidity Provision, Market-Neutral Mean-Reversion (Single-Instrument BTCUSDT.BINANCE Perp, QUOTE-TICK Driven, MAKER Limit Orders — Fade Small Deviations From Short-Term Fair Value by PROVIDING Liquidity, Earn Spread + Reversion, Hard Taker Stop on Continuation, 3-Parameter)
Outcome: Abandoned
BtcMakerMicroDislocationLiquidityProvisionLS
BTC Passive Micro-Dislocation Liquidity Provision, Market-Neutral Mean-Reversion (Single-Instrument BTCUSDT.BINANCE Perp, QUOTE-TICK Driven, MAKER Limit Orders — Fade Small Deviations From Short-Term Fair Value by…
Hypothesis
verification_loop: sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (30 days of BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).
Implementation
Market-neutral passive liquidity provision on BTCUSDT.BINANCE USD-M perp, 1-minute clock. Maintains a time-decayed EWMA fair value (fv_span_seconds) and an EWMA dislocation scale sigma from the freshest available price observation (sub-second trade tape when one exists for the window, 1-minute bar close otherwise). When flat it posts exactly ONE post_only MAKER limit on the side that FADES the current deviation (price above fair value -> SELL at fv+band; below -> BUY at fv-band), where band = max(band_k*sigma, 10 bps of price) so a filled round trip must clear the ~4 bps maker cost. On a fill it posts a limit exit at fair value (the reversion target) and arms a risk-only taker stop at stop_mult*sigma beyond entry plus a 30-minute time stop. Two opposing quotes can never coexist, so whipsaw double-fills are impossible by construction.
Verification Results
sandbox_timeout: Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit on a ~20000-bar window (30 days of BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL). This almost always means per-bar work that scales with history — e.g. rescanning the full funding/supplementary series, or rebuilding a list and calling min()/sorted() inside calculate_signal()/on_bar() on every bar. Precompute sorted timestamp arrays ONCE in __init__ and use bisect, or cache lookups keyed by timestamp, so per-bar cost is O(log n) not O(n).
Iteration History
Verification failed (Layer 3 — sandbox backtest): 'int' object is not callable Bar type used: SOLUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, Bars processed: 0 Ensure your strategy produces trades with the given data and parameters.
Verification failed (Layer 3 — sandbox backtest): No trades produced Bar type used: BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL, Bars processed: 40576 Diagnostics: should_enter() returned a side 0 times over 40572 evaluated bars -> your ENTRY CONDITION never triggered. Loosen the entry logic / thresholds. Ensure your strategy produces trades with the given data and parameters.
Verification failed (Layer 1.5 — hypothesis/config consistency) [class=hypothesis_mismatch]: - config.instrument_id is SOLUSDT.BINANCE but the hypothesis declares BTCUSDT.BINANCE — a different asset. Implement the hypothesis as written (or the Research Lead must revise it).
Backtest and paper results are hypothetical. Trading involves risk of loss.