BtcCoinmVolumeDonchianCalmVolBreakoutLong
Hypotheses
BTC COIN-M Inverse Perp 4H Volume-Confirmed Donchian Breakout with Calm-Vol Regime Filter Long
Hypotheses
A long-only, single-instrument strategy on BTCUSD_PERP.BINANCE_CM — the BTC-margined inverse perpetual contract on Binance COIN-M. Combines the analyst's EXPLICITLY RECOMMENDED template ('volume-confirmed Donchian, but only when realized vol is in the bottom quartile') with deployment on a venue currently at 0/539 experiments in our portfolio (BINANCE_CM target quota ≥5%). The mechanism: 20-bar Donchian high breakout confirmed by above-average volume on the breakout bar, gated by both (a) a long-term trend filter (close > sma_100) and (b) a vol-regime filter that requires realized volatility to be in the bottom quartile of its trailing 252-bar distribution — calm-trend regime selection. Critically distinct from the existing 4H volume-breakout family (BtcFourHourVolumeBreakoutLong, EthFourHourVolumeBreakoutLong, SolFourHourVolumeBreakoutLong, BnbFourHourVolumeBreakoutLong) because: (i) BINANCE_CM venue has different participant mix — BTC-margined holders are typically longer-term, less leveraged-day-trader-driven than USD-M speculators, so the volume-breakout signal-to-noise ratio differs; (ii) inverse contract structure produces natural BTC-denominated returns that attract a different liquidity profile; (iii) the calm-vol regime overlay (which none of the existing volume-breakouts have) implements the analyst's specific abandon-feedback recommendation. Long-only because (a) the structural breakout signal works long-direction on crypto majors per the empirical record (ADA Sharpe 2.46 long vs -0.17 short on identical mechanism), and (b) the trend filter prevents the Keltner-style fade-the-downtrend failure mode.
Hypotheses
Iteration 2 fixes exactly the reported Layer-2 failure and nothing else. All six synthetic scenarios raised 'TypeError: _rolling_std() takes 2 positional arguments but 3 were given': the helper was declared @staticmethod, and the Layer-2 verification proxy rebinds strategy methods in a way that drops the staticmethod wrapper, so the implicit self arrived as the first positional argument at the self._rolling_std(logret, vol_window) call site. The minimal fix is to declare it as a plain instance method, def _rolling_std(self, x, w), which is correct under BOTH binding styles - I verified numerically that the bound call and the explicit-self call return identical results and that both match a pandas rolling population std. Nothing else changed: imports, class structure, the continuous ATR-normalised breakout signal, the four entry gates, the exit logic and the inverse-contract sizing are byte-for-byte as they were when Layer 1 and Layer 1.5 passed, so no earlier check can regress. A short comment on the method records why it must not be a staticmethod, to stop the pattern being reintroduced.
Hypotheses
Attractive headline but weak, non-robust realized edge that will not survive deflation. Sharpe is 0.72 with a CI whose lower bound (0.073) barely clears zero, and information_ratio -0.57 with benchmark_correlation 0.91 / beta 0.50 / alpha 0.020 means the strategy underperforms simply holding BTC on a risk-adjusted basis — the P&L is largely BTC beta, not a distinct edge. The +267% total_return is misleading: end_unrealized_pct 178.8% shows more than half is an un-exited open position (realized ~88%), and the realized record is outlier-driven (2023's +49.7% is carried by a single +25.9% day). It is a single-name OHLCV Donchian volume-breakout with a calm-vol regime overlay — the trend/breakout-clone family (L9/L41) where the regime gate does not add robustness the deflation can strip, and a base Sharpe < 1.0 on this class is the ceiling (L63). With max_drawdown 42% (CI to 64.7%), only 85 trades in 5.8 years (thinned further per window by the bottom-quartile-vol gate), and negative 2025/2026, the optimizer would curve-fit the outlier rallies and fail deflated-Sharpe/holdout. Not fee-limited (avg_trade 1.67%), but not worth 2 hours of optimization.
Implementation
Long-only volume-confirmed Donchian breakout on the BTC COIN-M inverse perpetual (BTCUSD_PERP.BINANCE_CM, 4-hour bars, pure OHLCV), gated to calm-volatility regimes. An entry requires all four conditions: the close breaks above the prior 20-bar Donchian high, the breakout bar's volume is at least 1.2x the trailing 20-bar average, the close is above its 100-bar SMA (long-term uptrend), and ambient realized volatility measured on the bars BEFORE the breakout sits in the bottom quartile of its trailing 252-bar distribution. Exits are a 10-bar Donchian low breach, a trend break below the SMA, or a hard 7% stop. Sizing risks 1.5% of equity against a 2.5x ATR stop, capped at 0.9x equity of gross notional and floored to WHOLE $100-face inverse contracts via contracts_for_notional (BTC-margined/settled).
Verification Results
CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.
Verification Results
No code change; at backtest review judge on closed-trade expectancy, alpha net of BTC beta, and OOS Sharpe rather than total_return.
Verification Results
Large share of sandbox total_return is unrealized (end_unrealized_pct 169.6%, one open trend trade dominates) and the strategy is strongly BTC-correlated (0.91). Not a code defect (a breakout legitimately holds a runaway winner), but the headline overstates realized repeatable edge.
Backtest Review
profit_factor 2.19 and avg_trade_return_pct 1.67% clear the COIN-M fee floor comfortably
Backtest Review
Implements the analyst-recommended calm-vol + volume-confirmed Donchian template on an under-represented venue; clean execution (85 signaled, 85 submitted, no drops)
Backtest Review
Correct inverse-contract sizing (whole contracts via contracts_for_notional)
Backtest Review
Sharpe 0.72 with CI [0.073, 1.376] — lower bound barely above zero, not robustly significant before best-of-N selection
Backtest Review
information_ratio -0.57 with benchmark_correlation 0.91 and beta 0.50 — underperforms holding BTC risk-adjusted; alpha only 0.020 (mostly BTC beta, not edge)
Backtest Review
end_unrealized_pct 178.8% — over half the +267% headline is an un-exited open position; realized return ~88%
Backtest Review
Outlier-driven: 2023 +49.7% carried by a single +25.9% day (2023-01-30); a few days make the record
Backtest Review
max_drawdown 42.1% (CI to 64.7%); only 85 trades in 5.8 years, thinned further per walk-forward window by the bottom-quartile-vol gate; recent years negative (2025, 2026)
Backtest Review
Single-name OHLCV Donchian volume-breakout + regime overlay — trend/breakout-clone family (L9/L41); regime gate does not add deflation-proof robustness (L63/L73-analog)
Iteration History
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['risk_pct', 'atr_period', 'vol_window', 'volume_mult', 'min_notional', 'vol_quantile', 'atr_stop_mult', 'stop_loss_pct', 'use_trend_exit', 'donchian_period', 'max_notional_pct', 'sma_trend_period', 'volume_ma_period', 'vol_regime_lookback', 'exit_donchian_period']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
- steady_downtrend: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
- flat_ranging: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
- volatility_spike: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
- zero_volume: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
- price_gap: TypeError: BtcCoinmVolumeDonchianCalmVolBreakoutLong._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735705680000)
Backtest and paper results are hypothetical. Trading involves risk of loss.