Mga Estratehiya
SOL 4H Volume-Confirmed Breakout Long na may Daily Regime Filter
Resulta: Inabandona
SolFourHourVolumeConfirmedBreakoutLong
Tamang naipatupad ang mekanismo (169 trade sa loob ng 6.6 taon, walang coverage wall, gumagana ang iteration-4 buffer fix)
Hypothesis
Inaayos nito ang iteration-3 Layer-3 failure (Walang trade / 0 sinuring bar). Ugat ng problema: nililimitahan ng base class ang primary bar buffer sa self._max_bars = 500, pero ang min_bars_required() = regime_bars(1200) + 20 + 5 = 1225. Dahil hindi kailanman lalampas sa 500 ang len(self._bars), palaging totoo ang `len(self._bars) < min_bars_required()` guard sa _maybe_process_primary, kaya hindi kailanman tinawag ang _process_primary at dahil dito ay ang should_enter. Pinalalaki ng pinakamaliit na pag-aayos ang bar buffer sa regime_bars + 60 (1260) sa __init__, upang maipon ang buong 200-araw na regime history at matawag ang min_bars_required, at masuri ang mga bar at ma-trigger ang breakout entry. Hindi nagbago ang lahat ng signal logic, regime/breakout/volume condition, exit, sizing na kumokonsumo ng leverage, at malilinis na import (na pumasa na sa Layers 1 at 2). Pinananatili nito ang tapat na 200-araw na regime filter ng hypothesis (1200 4H-bar), na ginagaya ang napatunayang arkitektura ng BNB, sa halip na paikliin ang regime window.
Implementasyon
Long-only na 4H volume-confirmed Donchian breakout sa perpetual futures ng SOLUSDT (Binance USD-M, 2x leverage), na may 200-araw na katumbas na (1200 4H-bar) SMA regime filter na kinukuwenta mula mismo sa pangunahing 4H series. Magbubukas ng long kapag mas mataas ang presyo sa long SMA (bull regime), lumampas sa dating 20-bar Donchian high, at lumampas ang volume sa 1.5x ng 20-bar average nito. Lalabas kapag bumaba sa 10-bar Donchian low, tumama sa 6% stop-loss, 18% take-profit, o 30-bar time stop. Purong OHLCV, iisang instrumento.
Mga Resulta ng Beripikasyon
CLEAN RESTART 2026-09-04 — inalis ang kasaysayan ng hatol at mga tala ng pagkatuto sa run na ito at ini-restart ito mula sa verification. Ang dating pag-abandona rito ay dulot ng pipeline, hindi ng market: mali ang pagkakaugnay ng Layer-2 harness sa mga @staticmethod helper (naayos na), naglabas ang QA ng pinal na mga hatol sa performance batay sa hindi na-optimize na smoke test (inalis na — QA ay correctness na lang ang hinahatulan), at dulot ng kakulangan ng backtest slot ang mga sandbox timeout (naayos na). Hindi nagbago ang hypothesis at strategy code. Suriin ang code batay sa merito nito; ang full backtest at optimizer ang magpapasya sa performance sa susunod.
Walang kailangan.
Regime filter na katumbas ng 200 araw, hango sa 1200 4H bars sa halip na aktuwal na daily bars — tapat na katumbas at tama. Kailangan ng buffer na may higit sa 1200 bars; inaayos ito ng iteration-4 fix (itinataas ang _max_bars sa 1260), at kinukumpirma ng sandbox na sinusuri ang mga bar.
Walang kailangang gawin.
Maaaring maging 1 ang _bars_held sa entry bar depende sa pagkakasunod-sunod ng dispatch, kaya ~29-30 bars ang aktuwal na time stop. Bale-wala ang off-by-one.
Pagsusuri ng Backtest
- Sharpe
- 0.17
- Kabuuang Return
- 17.95%
- Max Drawdown
- 23.86%
- Kabuuang Trade
- 169
- Win Rate
- 53.8%
- Profit Factor
- 1.08
Tamang naipatupad ang mekanismo (169 trade sa loob ng 6.6 taon, walang coverage wall, gumagana ang iteration-4 buffer fix)
Lumampas ang avg_trade_return_pct 0.266% sa minimum na fee ng 0.15% Binance USD-M
Kontrolado ang max_drawdown 23.9% (bagaman umaabot ang CI sa 76.9%)
Base Sharpe na 0.171 at bootstrap na CI [-0.593, 0.983] na sumasaklaw sa zero — walang makabuluhang risk-adjusted edge
profit_factor 1.079, mas mababa sa hangganan ng makabuluhang edge na 1.2
information_ratio -1.02 — mas mahina kaysa basta paghawak sa SOL batay sa risk-adjusted na sukatan
impact_cost_pct 39.3% na $648K lang ang kapasidad — nauubos ng market impact ang ~39% ng gross; napakaliit ng edge
Breakout na sumusunod sa direksyon ng iisang OHLCV — uring walang nakaligtas (L9/L41/L63); ang base Sharpe na <1.0 ang pinakamataas na maaabot
Ang headline +17.9% ay ~2.9%/taon, dulot ng mga outlier (kurtosis 21.6), at pinalaki ng 128% average na posisyon
Kasaysayan ng Iterasyon
Bigo ang verification (Layer 2 — synthetic scenarios): Mga parameter na ginamit: ['vol_mult', 'vol_period', 'min_notional', 'position_pct', 'exit_lookback', 'max_hold_bars', 'regime_period', 'stop_loss_pct', 'take_profit_pct', 'breakout_lookback'] Tiyaking itinatalaga ng __init__ ang lahat ng attribute mula sa self.parameters.get(). - steady_downtrend: Naka-freeze ang signal: magkakapareho ang lahat ng 476 signal (value=0.0). Malamang may bug sa calculate_signal() — hindi nagbabago ang signal. - volatility_spike: Naka-freeze ang signal: magkakapareho ang lahat ng 476 signal (value=0.0). Malamang may bug sa calculate_signal() — hindi nagbabago ang signal. - zero_volume: Naka-freeze ang signal: magkakapareho ang lahat ng 476 signal (value=0.0). Malamang may bug sa calculate_signal() — hindi nagbabago ang signal. - price_gap: Naka-freeze ang signal: magkakapareho ang lahat ng 476 signal (value=0.0). Malamang may bug sa calculate_signal() — hindi nagbabago ang signal.
Bigo ang verification (Layer 3 — sandbox backtest): Walang nagawang trade Uri ng bar na ginamit: SOLUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Mga bar na naproseso: 12467 Diagnostics: nagbalik ng side ang should_enter() nang 0 beses sa 12443 sinuring bar -> hindi kailanman nag-trigger ang iyong ENTRY CONDITION. Luwagan ang entry logic / mga threshold. Tiyaking nakakagawa ng trade ang strategy mo gamit ang ibinigay na data at mga parameter.
Bigo ang verification (Layer 3 — sandbox backtest): Walang nagawang trade Uri ng bar na ginamit: SOLUSDT.BINANCE-4-HOUR-LAST-EXTERNAL, Mga bar na naproseso: 12665 Diagnostics: nagbalik ng side ang should_enter() nang 0 beses sa 0 sinuring bar -> hindi kailanman nag-trigger ang iyong ENTRY CONDITION. Luwagan ang entry logic / mga threshold. Tiyaking nakakagawa ng trade ang strategy mo gamit ang ibinigay na data at mga parameter.
Bigo ang verification (Layer 3 — sandbox backtest): lumampas ang smoke test sa 300s na takdang oras. Halos palaging ibig sabihin nito ay may gawaing kada bar na lumalaki kasabay ng history — halimbawa, muling pag-scan sa buong funding/supplementary series, o muling pagbuo ng listahan at pagtawag sa min()/sorted() sa loob ng calculate_signal()/on_bar() sa bawat bar. Ihanda nang maaga ang mga nakaayos na timestamp array ONCE sa __init__ at gumamit ng bisect, o mag-cache ng mga lookup ayon sa timestamp, para O(log n) sa halip na O(n) ang gastos kada bar.
Ang Stratmill ay isang tool para sa pananaliksik at paper trading, hindi payo sa pananalapi o isang broker. Ang mga resulta ng backtest at paper trading ay hypothetical. May panganib ng pagkalugi ang pangangalakal.