Skip to content

View translation

AdaMakerLiquidityProvisionReversionLS15m

Hypotheses

ADA Passive Liquidity-Provision Mean-Reversion, Long-Short (Single-Instrument BINANCE Perp, 15m Bars, Enter With MAKER Limit Orders at a Volatility Band Around a Rolling Mid — Earn the Maker Side (0.02%) Instead of Paying Taker (0.05%), Exit With Maker Limits at the Mean, Taker Stop Only for Risk, NO Trend Filter, Frequently-Firing, 3-Parameter)

Hypotheses

A LONG-SHORT, single-instrument intraday mean-reversion on ADAUSDT.BINANCE (USD-M perpetual, 15m bars) whose defining feature is EXECUTION, not signal — it is a direct structural attack on the factory's #1 killer, fee_edge (163 deaths, and the explicit reason the marginal reversion edges keep dying). Every prior reversion/continuation entered and exited with MARKET (taker) orders at ~0.05% per side = ~0.10% round-trip, which eats the sub-0.15% intraday reversion. This strategy instead provides liquidity: it posts MAKER limit orders at a volatility band around a rolling mid and gets filled at 0.02% maker (per the venue table: BINANCE maker 0.0200% vs taker 0.0500%), then exits with a MAKER limit at the mean — turning a ~0.10% taker round-trip into a ~0.04% maker round-trip, more than halving the cost floor a reversion must clear. The edge is the same well-established one that carried the deployed SOL VWAP-reversion to paper (deep perps overshoot short-term liquidity imbalances and revert), but by being the LIQUIDITY PROVIDER to impatient takers who overshoot, the strategy collects the bid-ask spread instead of paying it. Crucially, it is NOT a re-parameterization of the just-flagged 'trend-filtered VWAP-deviation reversion' anti-pattern (L7): there is deliberately NO trend filter (the deployed winner was explicitly trend-gated OFF and frequently-firing), and the mechanism is maker liquidity provision, a class that appears in ZERO prior failure patterns. It is single-name (no cross-sectional best-of-N overfit surface), high-trade-count (diagnostic across all regimes, no single-regime artifact), low-parameter, pure OHLCV, and fills the under-represented long_short (14.6%) and short-horizon (6.5%) buckets.

Hypotheses

Iteration 4 fixes the two QA code defects and leaves the signal path, incremental O(1) rolling stats and re-quote hysteresis (all of which already passed Layers 1-3) untouched. (1) Liquidation / inadequate risk control: sizing is now the MINIMUM of the notional cap (position_frac cut 0.50 -> 0.15) and a stop-distance risk budget qty <= equity * risk_pct / (stop_atr * ATR), so a single stop costs at most 1% of equity and avg_position_pct can no longer exceed equity at 1.0x; an equity-floor kill-switch cancels, closes and permanently halts below 60% of the sizing base (the guard the DOGE/BNB/LINK siblings used); and a post-stop cooldown blocks new entry quotes for 8 bars (2h), breaking the re-quote-into-the-same-trend death spiral. Exit quotes are never blocked by the cooldown. (2) Intrabar double-fill: quoting is now ONE-SIDED — only the side price is stretched toward is posted — so two full-size post_only quotes can no longer both fill inside one whippy 15m bar and flip the position before the next _manage cancels the opposite side; this also roughly halves the 1547-trade churn. The edge_concern (maker round-trip net edge on ADA, optimistic bar-level fill modeling) is an analyst question about the mechanism rather than a code defect, so I did not change the signal to chase it — the risk fixes above bound the left tail that made the expectancy look like collecting pennies in front of a steamroller.

Hypotheses

Account LIQUIDATED and negative-expectancy — the maker-execution wrapper does not rescue a single-name mean-reversion fade. Over 2,854 trades: total_return -100% with liquidation on 2021-01-26 (max_drawdown 100%), profit_factor 0.465, avg_trade_return_pct -0.063% (negative), expectancy -$47/trade, Sharpe -2.50 with CI [-14.2, -2.30] fully below zero and PSR 0.0. Despite the full iter-4 risk apparatus (risk-capped sizing, equity-floor kill-switch, post-stop cooldown), the strategy blew up because posting passive maker liquidity into the January-2021 trend fills the fade precisely when it is wrong (monthly -131% in 2021-01, daily -102% on 01-21); the kill-switch fired too late. The reward:risk is structurally inverted (avg_win $57 vs avg_loss $309, ~5:1), with a fade-into-crash tail (skew -21, kurtosis 451). The core maker thesis is contradicted by the data: total_impact_usd $94.8k plus commission at 14.5% of gross means execution cost still dominates. This is the L55 single-name intraday mean-reversion fade family (0/174 survivors) crossed with L19 (liquidation/100% DD). No tuning of band_k/stop_atr/mid_window flips a liquidated, negative-expectancy fade. Failure pattern: no_edge/risk_reject single-name maker mean-reversion, liquidated (L55/L19).

Implementation

Long-short maker liquidity-provision mean-reversion on ADAUSDT.BINANCE USD-M perp, 15m bars, pure OHLCV. A rolling mid (SMA-32) and ATR-14 define a band_k x ATR band; the strategy posts a single post_only maker limit on the side price is stretched toward (SELL at mid+band when above the mid, BUY at mid-band when below), so impatient takers who overshoot fill it at the 0.02% maker fee. Once filled it posts a maker limit exit at the rolling mid. Risk is taker-only: a 2-ATR stop and an 8h time stop, each followed by a 2h quoting cooldown. Size is the lesser of 15% of a fixed $100k base and the stop-distance risk budget (1% of equity per stop), and an equity-floor kill-switch flattens and halts the strategy if equity falls below 60% of base. No trend filter, 3 tunables (band_k, stop_atr, mid_window).

Verification Results

Verification failed (Layer 4 — QA review) [class=code_defect]: - [edge_concern] Separate from the risk defect: negative-expectancy LP profile (win 74.5% but avg_win $93 vs avg_loss $774, largest_loss -$2588, skew -13.7, kurtosis 194) — collecting maker pennies in front of a steamroller; avg_trade_return_pct +0.018% is below the 0.15% floor. Maker-fill modeling is also optimistic in a 15m-bar backtest (post_only limits filled on any trade-through, ignoring queue position), so the 74.5% win rate is overstated. Even with the risk model fixed, the analyst should verify the maker round-trip clears a positive net edge on ADA. - Account LIQUIDATES in the sandbox (liquidated=true 2026-05-13, -100% return, 100% max_drawdown) with avg_position_pct 131.6% — exposure exceeding 100% of equity at stated 1.0x leverage. Cause is inadequate risk control: no equity-floor kill-switch (its DOGE/BNB/LINK siblings added one and did not liquidate), 50%-of-equity sizing against a wide 2-ATR stop, and no post-stop cooldown so it immediately re-quotes into the same trend with no trend filter — a death spiral, not merely negative edge. - Two-sided full-qty post_only quotes can both fill within one whippy 15m bar, causing an unintended intrabar round-trip/sign flip before the next _manage cancels the opposite side; contributes to 1547-trade churn.

Backtest Review

Novel maker-execution framing and a well-measured sample (2,854 trades); clean incremental O(1) rolling stats; genuine attempt at risk controls (risk-capped sizing, kill-switch, cooldown)

Backtest Review

Account LIQUIDATED (total_return -100%, max_drawdown 100%, liquidation 2021-01-26) despite the full iter-4 risk apparatus — the kill-switch fired too late as the maker-fade posted into the Jan-2021 trend

Backtest Review

Negative-expectancy no-edge: PF 0.465, avg_trade_return_pct -0.063%, expectancy -$47/trade, Sharpe -2.50 (CI [-14.2, -2.30]), PSR 0.0, omega 0.044, IR -3.37

Backtest Review

RR structurally inverted (avg_win $57 vs avg_loss $309, ~5:1); return_skew -21, kurtosis 451 — fade-into-crash tail

Backtest Review

Maker thesis contradicted: total_impact_usd $94.8k + commission 14.5% of gross — execution cost still dominates, and providing liquidity to a trending overshoot fills you exactly when wrong

Backtest Review

L55 single-name intraday mean-reversion fade family (0/174 survivors) + L19 liquidation/100% DD

Iteration History

Verification failed (Layer 3 — sandbox backtest): smoke test exceeded the 300s wall-clock limit. 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).
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.