BtcSpotDualTimeframeMomentumConfluenceLong
Hypoteser
BTC Spot Dual-Timeframe Momentum Confluence, LONG-ONLY 1x (BTCUSDT.BINANCE_SPOT, 4H Primär + 1D Bekräftelse, Endast Long När BOTH Tidsramar Pekar UP, FLAT till Kontanter Annars, ATR-Trailing + Daily-Regime-Break Exit, Källoptimerade Parametrar Bibehållna)
Hypoteser
En LONG-ONLY, 1x, CASH-konto-portering av fabrikens bäst presterande befordrade strategi (BtcDualTimeframeMomentumConfluenceLS, Sharpe 1.99, 458 trades, +$4,774 över 29 dagar av paper trading) till BTCUSDT.BINANCE_SPOT, skapad specifikt som FIRST LIVE-TRADING CANDIDATE eftersom livemarknadsplatsen endast är spot. Mekanismen oförändrad, ren OHLCV, enda instrument: FAST-benet = tecknet på den löpande 18-bar-avkastningen på 4-HOUR-barer; SLOW-benet = tecknet på den löpande 15-bar-avkastningen på DAILY-barer (läst via on_extra_bar som ett kontextben, aldrig en synkbarriär). Båda måste AGREE. Den enda strukturella förändring som CASH-kontot tvingar fram är att kollapsa {LONG/FLAT/SHORT} till {LONG/FLAT}: där futures-föräldern går SHORT vid joint-down-confluence, håller spot-versionen 100% USDT. Allt annat bevaras ordagrant: ATR(14) trailing stop vid 3.033x ATR från den löpande extrempunkten, daily-regime-break-exit, volskalad kapitalrelativ storleksanpassning (risk_pct 1.011% / 3.033xATR-stopavstånd), 49.7% max-nominellt tak, och exakt den parametervektor som källoptimeringen valde (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Tre justerbara parametrar, ingen kompletterande data, inga shorts, ingen hävstång. Spotspecifika kodändringar: BINANCE_SPOT CASH-marknadsplats (ingen hävstångsmultiplikator i position_size), size_precision 5 / price_precision 2, min_notional $10, säljorder storleksanpassade endast till innehavd baskvantitet. Data verifierad som närvarande: BTCUSDT.BINANCE_SPOT 4-HOUR och 1-DAY-barer löper kontinuerligt från 2017-08-17 (~9 år, ~19,800 4H-barer).
Hypoteser
Direkt portering av den befordrade futures-föräldern BtcDualTimeframeMomentumConfluenceLS till spotmarknadsplatsen, eftersom den avsedda livemarknadsplatsen endast är spot. Mekanismen bevarad ordagrant: samma två momentum-ben, samma AGREE-eller-platt-grind, samma ATR(14) 3.033x trailing stop från den löpande extrempunkten, samma daily-regime-break-exit, samma volskalade risk_pct / stopavstånds-storleksanpassning med ett 49.7% nominellt tak, och exakt den parametervektor som källoptimeringen valde (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). CASH-kontot tvingar fram exakt en strukturell förändring, enligt hypotesens specifikation: {LONG,FLAT,SHORT} kollapsar till {LONG,FLAT} — should_enter returnerar BUY endast vid joint-up och None annars, så joint-down är 100% USDT snarare än en short. Spotspecifika ändringar: marknadsplats BINANCE_SPOT med hävstång 1.0 och ingen hävstångsterm i position_size, size_precision 5 / price_precision 2 (BTCUSDT spot), min_notional höjd till $10, och alla exits dirigeras genom bastemplatets reduce-only close_position så att en SELL bara någonsin kan minska innehavd baskvantitet (en naken spot-short är omöjlig av konstruktion, och basens _would_open_spot_short-vakt utlöses aldrig). calculate_signal returnerar den kontinuerliga 18-bar 4H-avkastningen varje bar (den varierar bar till bar); den diskreta confluence-grinden ligger i should_enter, som krävs. Kostnaden per bar är O(1): ATR använder ett fast 15-bar-fönster och den snabba avkastningen är en enda indexerad uppslagning, så det finns inget historieskalande arbete. En ärlig brasklapp för analytikern: spot-rundturskostnaden är ~0.20% jämfört med ~0.10% för futures-föräldern, så fördelen per trade måste överstiga dubbel friktion — trendföljande exitstrukturen (trail + regime break, inget fast take-profit) är det som gör att det genomsnittliga innehavet blir tillräckligt långt för att detta ska vara troligt, men det är måttet att bevaka först.
Implementation
LONG-ONLY 1x BTCUSDT spot (BINANCE_SPOT, CASH) dual-timeframe momentum confluence. FAST-benet = tecknet på den löpande 18-bar-avkastningen på 4-HOUR-barer (primär); SLOW-benet = tecknet på den löpande 15-bar-avkastningen på 1-DAY-barer, konsumerad via on_extra_bar som ett kontextben för en långsammare tidsram (annan tidsram, så bastemplatets cross-leg-anpassningsbarriär fördröjer aldrig 4H-signalen). Båda benen måste peka UP för att hålla BTC; joint-down (där futures-föräldern shortar) och oenighet betyder båda att hålla 100% USDT. Exits: ATR(14) trailing stop vid 3.033x ATR under positionens löpande topp, OR att det dagliga benet vänder ner under longen (regimbrott på högre tidsram). Storleksanpassning är volskalad och kapitalrelativ: eget kapital * 1.011% / (3.033 * ATR), begränsad till 49.7% av USDT-saldot i nominellt värde, med NO hävstångsmultiplikator (CASH-kontot kan inte låna), kvantiserad till size_precision 5 och avvisad under $10 spot minsta nominella värde. Tre justerbara parametrar, ren OHLCV, ingen kompletterande data, inga shorts.
Verifieringsresultat
Antingen använd self._atr (aktuell) i should_exits trail-jämförelse för att matcha föräldern exakt, eller ange uttryckligen i beskrivningen att trailen är förankrad till entry-bar-ATR så att analytikern inte tillskriver avvikelsen från föräldern marknadsplatsändringen.
Verifieringsresultat
Trailing-stop-ATR är FROZEN vid entry (self._entry_atr, fångad i should_enter / vid positionsövertagande) och uppdateras aldrig, så trail-avståndet är 3.033 x ATR-vid-entry snarare än 3.033 x aktuell ATR(14). Den befordrade futures-föräldern (BtcDualTimeframeMomentumConfluenceLS4H) spärrar sin trail med den CURRENT ATR varje bar. Hypotesens formulering ('ATR(14) trailing stop vid 3.033x ATR från den löpande extrempunkten') uppfylls i båda fallen, och eftersom _extreme är monoton spärrar stopnivån fortfarande bara uppåt, så detta är inte ett korrekthetsfel — men vid en volexpansion efter entry är den effektiva stoppen tightare än förälderns, vilket är en verklig beteendeskillnad från strategin som denna påstås portera 'ordagrant'.
Verifieringsresultat
Sätt trade-tillståndet utifrån fyllningen (on_order_filled / första baren med en öppen position) snarare än inuti should_enter, eller återställ det defensivt högst upp i calculate_signal före positionsuppslagningen.
Verifieringsresultat
should_enter() muterar trade-tillstånd (_in_long = True, _extreme, _entry_atr) BEFORE bastemplatet har storleksanpassat ordern och tillämpat min-notional-grinden. Om position_size() returnerar 0 eller $10 min-notional-kontrollen avvisar entryn, blir strategin kvarlämnad flaggad som in-long med en aktiverad trail medan den är platt. I praktiken självläker detta på nästa bar (calculate_signal ser att position är None och återställer flaggorna, och should_exit nås aldrig medan platt), så det finns ingen observerbar beteendebugg — men invarianten är skör om exit-vägen någonsin ändras.
Verifieringsresultat
Ingen åtgärd krävs för korrekthet. Om exakt samma-bar-konsumtion önskas, beräkna om _slow_dir lat från self._extra_bars[...] inuti calculate_signal istället för att cacha den i on_extra_bar.
Verifieringsresultat
Enbarslatens på det dagliga benet: DAILY-baren och dagens sista 4H-bar delar samma stängningstidsstämpel. Om motorn levererar den primära 4H-baren först körs _maybe_process_primary() och stämplar _last_processed_ts, och den dagliga barens _slow_dir-uppdatering (som anländer med samma tidsstämpel) konsumeras först från NEXT 4H-baren. Detta är konservativt (det kan bara fördröja en signal, aldrig läcka framtida data), men det innebär att daily-regime-break-exiten kan utlösas upp till 4 timmar efter den dagliga stängningen i ungefär hälften av fallen, och paritet mellan backtest och paper trading beror på att leveransordningen är stabil.
Verifieringsresultat
Trogen implementation, men tre saker som analytikern bör väga in på full historik: (1) spot-rundturen är ~0.20% jämfört med futures-förälderns ~0.10%, så samma bruttofördel ger netto ungefär hälften — sandlådan visar redan courtage på 10.03% av brutto; (2) parametervektorn (fast 18 / slow 15 / trail 3.033) valdes av en optimeringskörning på en DIFFERENT-marknadsplats, timeframe-mix och riktningsuppsättning (LONG/SHORT futures), så detta är en out-of-sample-överföring, inte en optimerad konfiguration — sandlådans Sharpe är 0.527 med sharpe_ci_low -0.233 och information_ratio -0.760 jämfört med referensindexet, dvs. en long-only BTC-bok som underpresterar jämfört med att hålla BTC under smoke-fönstret; (3) att ta bort short-benet tar bort ungefär hälften av förälderns tradepopulation (250 trades, alla long, 43.6% exponering), så realiserad Sharpe bör förväntas ligga väl under förälderns 1.99 snarare än nära den. Första sak att kontrollera i den riktiga backtestet: avg_trade_return_pct mot 0.25% spot-golvet (sandlådan visar 0.82%, men det fönstret exkluderar 2017 och är bara 2401 dagar) och om den 'normala' voltertilen (-8.77% i sandlådan) förblir negativ över full historik.
Backtestgranskning
314 stängda trades under 3146 dagar (2017-08 → 2026-03), metrics_reliable=true, entry_diag 314/314 inlägg skickade med 0 avvisade.
Backtestgranskning
Trades implementerar hypotesen: alla 314 LONG / 0 short (korrekt CASH-kollaps av förälderns LONG/FLAT/SHORT), max nominellt/eget kapital 0.50 jämfört med taket på 0.497, genomsnittligt innehav 4d8h och 43.6% exponering som återger futures-föräldern.
Backtestgranskning
avg_trade_return_pct 1.20% jämfört med en ~0.20% BINANCE_SPOT rundtur; courtage endast 8.97% av brutto, påverkan 4.33% — inte avgiftsmarginellt.
Backtestgranskning
max_drawdown 10.3% (under 15% spot-standarden), PF 1.41, payoff 2.07 vid en träffrekvens på 40.4% (korrekt trendform), stressad voltertil +28.0%.
Backtestgranskning
Extrem koncentration: topp 10 av 314 trades = 93.8% av summerad avkastning per trade, topp 20 = 141% (trades 21–314 netto negativa).
Backtestgranskning
Endast 6/10 kalenderår positiva — precis vid den hårda gränsen — och båda de senaste åren negativa (2025 −10.5%, 2026 −9.9%).
Backtestgranskning
Sharpe 0.664 med sharpe_ci_low 0.0042 och PSR 0.924 (<0.95): redan marginellt innan ~225-försöks-urvalsgränsen.
Backtestgranskning
QAs oro delvis bekräftad: den 'normala' voltertilen förblir negativ (−7.70%, 16.1% DD), information_ratio −0.757, alfa bara +2.4%/år — den underpresterar jämfört med att hålla BTC, och benchmark_meaningful=true så det underskottet är verkligt.
Backtestgranskning
Parametrarna är en out-of-sample-överföring från en annan marknadsplats/riktningsuppsättning — otrimmade snarare än överanpassade, men även otestade här.
Stratmill är ett research- och pappershandelsverktyg, inte finansiell rådgivning eller en mäklare. Backtest- och pappershandelsresultat är hypotetiska. Handel innebär risk för förlust.