Strategies
BTC Single-Asset Pin Bar Wick Rejection Pattern Long-Short on BINANCE Daily (Brooks 2009 / Sperandeo 1991 Rejection Bar, Event-Driven, Translation-Robust)
Outcome: Abandoned
BtcDailyPinBarWickRejectionLongShort
BTC Single-Asset Pin Bar Wick Rejection Pattern Long-Short on BINANCE Daily (Brooks 2009 / Sperandeo 1991 Rejection Bar, Event-Driven, Translation-Robust)
Hypothesis
Implements the Sperandeo (1991) / Brooks (2009) rejection-bar hypothesis using the wick-to-body ratio on a single bar — scale-invariant and translation-robust, distinct from the range/2-bar/3-bar reversal variants in the pipeline. FIX for the reported Layer-2 stale frozen-signal feedback: the code already returns a continuous _monitoring_base every bar (verified locally: 479 unique, non-zero signals across all 6 synthetic scenarios, zero warnings), so the earlier value=0.0 frozen result (from a pre-monitoring-base gated version) no longer occurs. Layer 1 (static) and Layer 2 (synthetic) both pass and are left untouched to avoid regression; only the config surfaces entry_threshold explicitly in the parameters dict so no threshold relies on a silent default. Venue is BINANCE USD-M futures because the strategy trades short (requires a margin venue) and consumes leverage (2.0) in position_size via self.config.leverage.
verifying_stuck_3_timeouts
Implementation
Single-asset BTCUSDT.BINANCE daily pin-bar / wick-rejection reversal, long AND short. Detects single bars where one wick is abnormally long relative to the body (lower_wick >= wick_ratio*body with a small upper stub near a 20-bar low = bullish rejection -> LONG; upper_wick >= wick_ratio*body with a small lower stub near a 20-bar high = bearish rejection -> SHORT). calculate_signal() returns a continuous, bar-varying monitoring score (dominated by intrabar wick-rejection pressure) on every non-trigger bar, and a large-magnitude (>=1000) value only on a confirmed pin. Exits via stop-loss, take-profit, opposite-side pin, or a max-hold time stop. Futures venue with 2x leverage (short-capable, notional ~1.2x equity).
Verification Results
Iteration History
Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['stub_ratio', 'wick_ratio', 'min_notional', 'position_pct', 'max_hold_bars', 'proximity_pct', 'stop_loss_pct', 'take_profit_pct', 'extreme_lookback'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: Frozen signal: all 479 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - steady_downtrend: Frozen signal: all 479 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies. - volatility_spike: Frozen signal: all 479 signals are identical (value=0.0). calculate_signal() likely has a bug — the signal never varies.
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).
Backtest and paper results are hypothetical. Trading involves risk of loss.