SolTakerFlowDivergenceReversalLS
Hypotheses
SOL USD-M Taker Aggressor-Flow Divergence Reversal, Long-Short (Single-Instrument BINANCE Perp, 1h Bars + Multi-Year Taker Buy/Sell Volume Metrics Feed, Fade Price Extremes That Order-Flow REFUSES to Confirm, 3-Parameter)
Hypotheses
A LONG-SHORT, single-instrument, crypto-native ORDER-FLOW strategy on SOLUSDT.BINANCE (USD-M perp, 1h bars) built on a genuine NON-PRICE data dependency that no deployed strategy uses: the Binance futures taker buy/sell VOLUME metrics feed (collected multi-year via the BinanceVisionCollector 'metrics' CSV). At each 1h close I maintain a rolling cumulative taker delta CVD = sum over the last L bars of (taker_buy_volume - taker_sell_volume). The tradeable insight is aggressor-flow DIVERGENCE: when price pushes to a local extreme but the aggressive-order flow that should accompany a real move is absent or reversing, the extreme is unsustainable and reverts. This is explicitly NOT pure OHLCV (L30) — CVD is a separate, non-price-derivable series — NOT funding-direction (L13), NOT carry (L28), NOT options (L29), NOT liquidations (L3), NOT a cross-sectional basket (L12), NOT cross-venue arb (L1), NOT Hyperliquid (L11). It is deliberately kept to 3 parameters to avoid the overfit graveyard, and is designed to fire ~150-350 times over the SOL history so trade count clears the measurability floor (avoiding the 16-trade death of the recent BtcSmartMoneyCrowdDivergence sibling, which used a two-part gate on top-trader POSITIONING; this uses looser gates on aggressor VOLUME on a higher-vol instrument).
Hypotheses
ITERATION 2 — smallest change that fixes the reported Layer-2 failure, signal logic untouched. The failure was a TypeError: the verification proxy invoked the class's `_bar_ts` staticmethod BOUND (passing self), so it received 2 positional args. Fix: moved the timestamp helper OUT of the class to a module-level function `_bar_ts_of(bar)` (which the proxy cannot bind) and updated the single call site; the `@staticmethod _bar_ts` is removed. No other code, imports, parameters, or signal logic changed, so Layer 1 stays green and the rest of Layer 2 now runs. (This is the known proxy-binding pitfall for base-class-shadowing staticmethods.) Everything else remains as designed: a genuine crypto-native ORDER-FLOW strategy on a NON-PRICE dependency (Binance taker buy/sell volume ratio, 'metrics'), single-instrument (SOL primary) so the feed loads cleanly as primary supp; per 1h bar the as-of taker ratio (O(log n) searchsorted, timeout-safe) gives the aggressor imbalance, scaled by bar volume into a per-bar net taker delta, summed over cvd_window and standardized to a flow z-score; the divergence price_z - flow_z (continuous) fades price extremes the aggressor flow refuses to confirm. NOT pure OHLCV / funding / carry / options / liquidations / cross-sectional / cross-venue / Hyperliquid. 3 core parameters to avoid overfit; entry_z 1.5 + a single divergence gate on a high-vol instrument over multi-year 1h SOL history is designed to clear the measurability floor. USD-M futures (long-short + the taker feed only exist on perps); leverage 2.0 wired into sizing (equity*position_frac*leverage/price, position_frac 0.5 -> ~1x notional) with a 3% stop capping per-trade risk near 3% equity. If the metrics feed were unavailable, flow_z cannot form and the strategy simply does not trade (no price-only fallback — the edge is the flow divergence). SOLUSDT is deep-history/liquid with a multi-year metrics feed (no data_unavailable).
Hypotheses
Total account liquidation on 2023-03-31: total_return -100%, max_drawdown 100%, zero activity thereafter. The edge is decisively negative on a large sample — profit_factor 0.769, avg_trade_return_pct -0.10%, expectancy -$52 over 2,304 trades, Sharpe -0.59, PSR 0.026, negative in every year (2021 -23%, 2022 -75%, 2023 -184%). Two compounding failures: (1) the signal — fading SOL 1h price extremes that the taker-flow CVD won't confirm — is single-name order-flow REVERSION, the definitively-dead fade family this session (the taker-flow sibling died at -0.025%, and the Research Lead's own directive documents all order-flow horizons as fee-dead); (2) the sizing is dangerously over-leveraged — avg_position_pct 236% (position_frac 0.5 multiplied by leverage) ran a single-instrument fade at ~2.4x notional, producing the catastrophic blowup (2023-05 -1638% monthly, individual days -684%/-242%, return_skew -11, kurtosis 487) that liquidated the account. The taker-metrics feed is present (2,304 signals fired), so this is a genuine strategy verdict, not a data artifact — the hypothesis fixed the 16-trade measurability death of its BtcSmartMoneyCrowdDivergence sibling but only confirmed the fade has no edge and then blew up. Optimizing cvd_window/entry_z/div_thresh cannot flip a liquidated, PF-0.77, negative-expectancy strategy, and the leverage would keep blowing it up; tuning would only shift the liquidation date. Fundamentally broken; not worth 2 hours of optimization.
Implementation
Single-instrument long-short order-flow reversal on SOLUSDT.BINANCE (USD-M perp, 1h bars). Using the Binance futures taker buy/sell VOLUME ratio ('metrics' feed, non-price), each 1h bar it derives the aggressor imbalance (R-1)/(R+1), scales it by the bar's traded volume to a net taker-delta proxy, and maintains a rolling cumulative taker delta (CVD) over the last cvd_window bars, standardized to a z-like flow score. It also z-scores price over the same window. The divergence = price_z - flow_z measures how far price is stretched beyond what the aggressor flow confirms. It FADES unconfirmed extremes: SHORT when price is at a high z-extreme but flow does not confirm (divergence >= div_thresh), LONG the mirror. Exits on reversion to the mean (|price_z| <= exit_z), the opposite extreme, take-profit, stop, or a time stop. 3 core parameters: cvd_window, entry_z, div_thresh.
Verification Results
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['exit_z', 'entry_z', 'stop_pct', 'hold_bars', 'cvd_window', 'div_thresh', 'norm_window', 'min_notional', 'position_frac', 'take_profit_pct']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
- steady_downtrend: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
- flat_ranging: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
- volatility_spike: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
- zero_volume: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
- price_gap: TypeError: SolTakerFlowDivergenceReversalLS._bar_ts() takes 1 positional argument but 2 were given (bar timestamp: 1735691520000)
Verification Results
Analyst: abandon on negative expectancy + >50% DD; the inverted RR is structural to the reversion-exit/fixed-stop asymmetry, not fixable by re-tuning.
Verification Results
Well-sampled (458 trades, metrics_reliable=true) and decisively negative: total_return -73.03%, max_drawdown 78.76% (far over the >50% L19 hard-abandon floor), profit_factor 0.72, avg_trade_return_pct -0.077% (negative expectancy). NOT an L17 code-defect signature (win_rate 0.64, Sharpe +0.70, PF 0.72 — none of win=0 / |Sharpe|>5 / PF=0), so it is a genuine no-edge result for the analyst, not a QA fault. Failure mechanism = classic inverted RR: win_rate 0.64 but avg_loss $1591 ≈ 2.5× avg_win $647 — the exit_z=0.5 reversion take-profit banks tiny gains while the 3% stop lets losers run. Same signature as the LINK-Keltner / ADA-RSI2 reversions abandoned this session.
Verification Results
Risk/analyst: treat per-trade tail as materially above 3%; a stop-market protective order or lower leverage would tighten it.
Verification Results
Stops checked only at 1h bar close (get_position_pnl_pct) with the exit filling next bar, so realized loss overshoots the 3% stop on volatile SOL (largest_loss -$4799 ≈ 4.8% of ~1x-equity notional > the 3% cap). Combined with exit_z capping wins near ~0.65%, this drives the avg_loss >> avg_win asymmetry, amplified by leverage 2.0 (CVaR_95 35.4%). Not a coding bug (bar-close stops are inherent) but the '3% stop ≈ 3% equity risk' claim understates realized tail loss.
Verification Results
Analyst: factor fee/impact drag into the abandon decision.
Verification Results
Very high turnover (370.7) and total_impact_usd $12,890 over 458 trades — fee/impact drag is a large share of the loss. Trade count clears the measurability floor (good), but at a frequency demanding a per-trade gross edge the flow-divergence signal doesn't deliver.
Backtest Review
Uses a genuine non-price feed (taker buy/sell metrics) that fired 2,304 times — clears the measurability floor its 16-trade sibling failed, and no data wall
Backtest Review
3-parameter design to limit overfit surface
Backtest Review
ACCOUNT LIQUIDATED on 2023-03-31: total_return -100%, max_drawdown 100%; zero activity for the final ~3 years
Backtest Review
Decisive net loser: profit_factor 0.769, avg_trade_return_pct -0.10%, expectancy -$52/trade, Sharpe -0.59, PSR 0.026 — negative every year (2021 -23%, 2022 -75%, 2023 -184%)
Backtest Review
Over-leveraged: avg_position_pct 236% (position_frac 0.5 × leverage) ran a single-instrument fade at ~2.4x notional → catastrophic blowup (2023-05 -1638% month, return_skew -11, kurtosis 487)
Backtest Review
Single-name order-flow REVERSION is the definitively-dead fade family this session (taker-flow -0.025% sibling; all order-flow horizons fee-dead per the Research Lead directive)
Outcome Summary
SolTakerFlowDivergenceReversalLS revived the order-flow fade idea on higher-volatility SOL, using the taker buy/sell volume metrics feed to fade 1h price extremes the CVD wouldn't confirm, and it deliberately loosened its gates to escape the 16-trade measurability death of its BtcSmartMoneyCrowdDivergence sibling. It succeeded on trade count — 2,304 signals fired with a genuine non-price feed — but only confirmed the fade has no edge: profit factor 0.769, -0.10% per trade, and negative every year. Compounding that, the strategy ran at ~2.4x notional (position_frac 0.5 × leverage), so a -1638% month in 2023-05 (return skew -11, kurtosis 487) liquidated the account entirely on 2023-03-31. The reviewer abandoned it as fundamentally broken — a negatively-signed member of the dead single-name order-flow reversion family whose over-leverage guaranteed a blowup that tuning could only reschedule.
Outcome Summary
Fixing a prior variant's trade-count problem does not create an edge — clearing the measurability floor only proved the single-name order-flow fade is negatively-signed — and running a negative-expectancy fade at ~2.4x notional guarantees liquidation rather than merely underperformance; sizing must be bounded independently of whether the signal works.
Outcome Summary
It was abandoned at backtest-review (verdict: abandon) due to two compounding failures: the fade signal is single-name order-flow reversion — the definitively-dead family this session — and dangerous over-leverage (avg_position_pct 236%, ~2.4x notional) turned a negative-expectancy edge into a full account liquidation.
Outcome Summary
It was a long-short single-instrument order-flow strategy on SOLUSDT USD-M perps (1h bars) that used the Binance futures taker buy/sell volume metrics feed to build a rolling cumulative taker delta (CVD) and fade price extremes that the aggressor flow refused to confirm — shorting flow-unconfirmed highs and longing flow-unconfirmed lows.
Outcome Summary
It fired 2,304 trades (clearing the measurability floor), but was a catastrophic net loser: the account was liquidated on 2023-03-31 with total_return -100% and max_drawdown 100%, profit factor 0.769, avg_trade_return_pct -0.10%, expectancy -$52/trade, Sharpe -0.59, PSR 0.026, and negative in every year (2021 -23%, 2022 -75%, 2023 -184%).
Backtest and paper results are hypothetical. Trading involves risk of loss.