BtcSpotDualTimeframeMomentumConfluenceLong
Hypotheses
BTC Spot Dual-Timeframe Momentum Confluence, LONG-ONLY 1x (BTCUSDT.BINANCE_SPOT, 4H Primary + 1D Confirm, Long Only When BOTH Timeframes Point UP, FLAT naar Cash Anders, ATR-Trailing + Daily-Regime-Break Exit, Bron-Geoptimaliseerde Parameters Behouden)
Hypotheses
Een LONG-ONLY, 1x, CASH-account port van de best presterende gepromoveerde strategie van de factory (BtcDualTimeframeMomentumConfluenceLS, Sharpe 1.99, 458 trades, +$4,774 over 29 dagen paper) naar BTCUSDT.BINANCE_SPOT, specifiek gemaakt als de FIRST LIVE-TRADING CANDIDATE omdat de live-venue alleen spot is. Mechanisme ongewijzigd, puur-OHLCV, single-instrument: FAST-poot = teken van het lopende 18-bar rendement op 4-HOUR bars; SLOW-poot = teken van het lopende 15-bar rendement op DAILY bars (uitgelezen via on_extra_bar als een context-poot, nooit een sync-barrier). Beide moeten AGREE. De enige structurele wijziging die het CASH-account afdwingt, is het samenvoegen van {LONG/FLAT/SHORT} tot {LONG/FLAT}: waar de futures-ouder SHORT gaat bij joint-down confluence, houdt de spot-versie 100% USDT aan. Al het overige is letterlijk behouden: ATR(14) trailing stop op 3.033x ATR vanaf het lopende extreem, daily-regime-break exit, vol-geschaalde kapitaal-relatieve sizing (risk_pct 1.011% / 3.033xATR stop-afstand), 49.7% max-notional cap, en exact de parametervector die de brononptimalisatie selecteerde (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Drie tunables, geen aanvullende data, geen shorts, geen leverage. Spot-specifieke codewijzigingen: BINANCE_SPOT CASH venue (geen leverage-multiplier in position_size), size_precision 5 / price_precision 2, min_notional $10, sells worden alleen gedimensioneerd op aangehouden base-quantity. Geverifieerd aanwezige data: BTCUSDT.BINANCE_SPOT 4-HOUR en 1-DAY bars lopen continu vanaf 2017-08-17 (~9 jaar, ~19,800 4H bars).
Hypotheses
Directe port van de gepromoveerde futures-ouder BtcDualTimeframeMomentumConfluenceLS naar de spot-venue, omdat de beoogde live-venue alleen spot is. Mechanisme letterlijk behouden: dezelfde twee momentum-poten, dezelfde AGREE-of-flat gate, dezelfde ATR(14) 3.033x trailing stop vanaf het lopende extreem, dezelfde daily-regime-break exit, dezelfde vol-geschaalde risk_pct / stop-afstand sizing met een 49.7% notional cap, en exact de parametervector die de brononptimalisatie selecteerde (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Het CASH-account dwingt precies één structurele wijziging af, zoals de hypothese specificeert: {LONG,FLAT,SHORT} valt samen tot {LONG,FLAT} — should_enter geeft BUY alleen terug bij joint-up en anders None, dus joint-down betekent 100% USDT in plaats van een short. Spot-specifieke aanpassingen: venue BINANCE_SPOT met leverage 1.0 en geen leverage-term in position_size, size_precision 5 / price_precision 2 (BTCUSDT spot), min_notional verhoogd naar $10, en alle exits lopen via de reduce-only close_position van de basistemplate zodat een SELL alleen ooit aangehouden base-quantity kan afbouwen (een naakte spot short is door de constructie onmogelijk, en de _would_open_spot_short guard van de basis wordt nooit geraakt). calculate_signal geeft elke bar het continue 18-bar 4H-rendement terug (het varieert per bar); de discrete confluence-gate zit in should_enter, zoals vereist. Kosten per bar zijn O(1): de ATR gebruikt een vast 15-bar venster en het fast return is een enkele geïndexeerde lookup, dus er is geen met de historie schalend werk. Eén eerlijke kanttekening voor de Analist: de spot-rondritkosten bedragen ~0.20% tegenover ~0.10% bij de futures-ouder, dus de edge per trade moet dubbele frictie doorstaan — de trendvolgende exitstructuur (trail + regime break, geen vaste take-profit) maakt dat de gemiddelde houdduur lang genoeg is om dat aannemelijk te maken, maar dit is de metric die als eerste in de gaten moet worden gehouden.
Implementatie
LONG-ONLY 1x BTCUSDT spot (BINANCE_SPOT, CASH) dual-timeframe momentum confluence. FAST-poot = teken van het lopende 18-bar rendement op 4-HOUR bars (primair); SLOW-poot = teken van het lopende 15-bar rendement op 1-DAY bars, uitgelezen via on_extra_bar als een tragere-timeframe context-poot (andere timeframe, dus de cross-leg alignment barrier van de basistemplate stelt het 4H-signaal nooit uit). Beide poten moeten UP wijzen om BTC aan te houden; joint-down (waar de futures-ouder short gaat) en onenigheid betekenen beide 100% USDT aanhouden. Exits: ATR(14) trailing stop op 3.033x ATR onder de lopende piek van de positie, OR wanneer de daily-poot onder de long naar beneden omslaat (hogere-timeframe regime break). Sizing is vol-geschaald en kapitaal-relatief: equity * 1.011% / (3.033 * ATR), begrensd op 49.7% van het USDT-saldo in notional, met NO leverage-multiplier (CASH-account kan niet lenen), gekwantiseerd naar size_precision 5 en afgewezen onder de $10 spot min notional. Drie tunables, puur OHLCV, geen aanvullende data, geen shorts.
Verificatieresultaten
Gebruik ofwel self._atr (huidig) in de trail-vergelijking van should_exit om exact overeen te komen met de ouder, of vermeld expliciet in de beschrijving dat de trail verankerd is aan ATR van de entry-bar, zodat de analist afwijking van de ouder niet ten onrechte toeschrijft aan de venue-wijziging.
Verificatieresultaten
De trailing-stop ATR wordt FROZEN bij entry vastgelegd (self._entry_atr, vastgelegd in should_enter / bij positie-adoptie) en nooit ververst, dus de trail-afstand is 3.033 x ATR-bij-entry in plaats van 3.033 x het huidige ATR(14). De gepromoveerde futures-ouder (BtcDualTimeframeMomentumConfluenceLS4H) laat zijn trail elke bar meebewegen met de CURRENT ATR. De bewoording van de hypothese ('ATR(14) trailing stop op 3.033x ATR vanaf het lopende extreem') wordt in beide gevallen voldaan, en aangezien _extreme monotoon is, gaat het stopniveau nog steeds alleen omhoog, dus dit is geen correctheidsdefect — maar bij een volatiliteitsexpansie na entry is de effectieve stop krapper dan die van de ouder, wat een reëel gedragsverschil is met de strategie die beweerd wordt 'letterlijk' te zijn geport.
Verificatieresultaten
Stel de trade-state in vanuit de fill (on_order_filled / eerste bar met een open positie) in plaats van binnen should_enter, of reset deze defensief bovenaan calculate_signal vóór de positie-lookup.
Verificatieresultaten
should_enter() muteert trade-state (_in_long = True, _extreme, _entry_atr) BEFORE de basistemplate de order heeft gedimensioneerd en de min-notional gate heeft toegepast. Als position_size() 0 teruggeeft of de $10 min-notional check de entry laat vallen, blijft de strategie gemarkeerd als in-long met een gewapende trail terwijl flat. In de praktijk herstelt dit zichzelf op de volgende bar (calculate_signal ziet dat de positie None is en reset de flags, en should_exit wordt nooit bereikt terwijl flat), dus er is geen waarneembare gedragsbug — maar de invariant is fragiel als het exit-pad ooit wordt gewijzigd.
Verificatieresultaten
Geen fix vereist voor correctheid. Als exacte same-bar consumptie gewenst is, herbereken _slow_dir dan lazily vanuit self._extra_bars[...] binnen calculate_signal in plaats van het te cachen in on_extra_bar.
Verificatieresultaten
Eén bar latency op de daily-poot: de DAILY bar en de laatste 4H bar van de dag delen dezelfde close-timestamp. Als de engine eerst de primaire 4H bar aanlevert, draait _maybe_process_primary() en stempelt _last_processed_ts, en de _slow_dir-update van de daily bar (die op dezelfde ts binnenkomt) wordt pas verwerkt vanaf de NEXT 4H bar. Dit is conservatief (het kan een signaal alleen vertragen, nooit toekomstige data lekken), maar het betekent dat de daily-regime-break exit in ongeveer de helft van de gevallen tot 4 uur na de daily close kan afgaan, en dat de pariteit tussen backtest en paper afhankelijk is van een stabiele leveringsvolgorde.
Verificatieresultaten
Getrouwe implementatie, maar drie zaken die de analist moet meewegen over de volledige historie: (1) de spot-rondrit kost ~0.20% versus ~0.10% bij de futures-ouder, dus dezelfde bruto edge houdt ruwweg de helft netto over — de sandbox toont commissie al op 10.03% van bruto; (2) de parametervector (fast 18 / slow 15 / trail 3.033) is geselecteerd via een optimalisatierun op een DIFFERENT venue, timeframe-mix en richtingset (LONG/SHORT futures), dus dit is een out-of-sample overdracht, geen geoptimaliseerde configuratie — de sandbox Sharpe is 0.527 met sharpe_ci_low -0.233 en information_ratio -0.760 versus de benchmark, oftewel een long-only BTC-boek dat slechter presteert dan het aanhouden van BTC in het smoke-venster; (3) het laten vallen van de short-poot verwijdert ruwweg de helft van de trade-populatie van de ouder (250 trades, allemaal long, 43.6% exposure), dus de gerealiseerde Sharpe zou naar verwachting ruim onder die van de ouder (1.99) moeten liggen, niet in de buurt daarvan. Eerste te controleren punt bij de echte backtest: avg_trade_return_pct ten opzichte van de 0.25% spot-ondergrens (sandbox toont 0.82%, maar dat venster sluit 2017 uit en beslaat slechts 2401 dagen) en of het 'normale' vol-tertiel (-8.77% in sandbox) negatief blijft over de volledige historie.
Backtest-review
314 gesloten trades over 3146 dagen (2017-08 → 2026-03), metrics_reliable=true, entry_diag 314/314 orders ingediend waarvan 0 verworpen.
Backtest-review
Trades implementeren de hypothese: allemaal 314 LONG / 0 short (correcte CASH samenvoeging van de LONG/FLAT/SHORT van de ouder), max notional/equity 0.50 versus de 0.497 cap, gem. houdtijd 4d8u en 43.6% exposure die de futures-ouder reproduceert.
Backtest-review
avg_trade_return_pct 1.20% versus een ~0.20% BINANCE_SPOT rondrit; commissies slechts 8.97% van bruto, impact 4.33% — niet fee-marginaal.
Backtest-review
max_drawdown 10.3% (onder de 15% spot-default), PF 1.41, payoff 2.07 bij een 40.4% hit rate (correcte trendvorm), gestrest vol-tertiel +28.0%.
Backtest-review
Extreme concentratie: top 10 van 314 trades = 93.8% van het opgetelde rendement per trade, top 20 = 141% (trades 21–314 netto negatief).
Backtest-review
Slechts 6/10 kalenderjaren positief — precies op de harde ondergrens — en beide recente jaren negatief (2025 −10.5%, 2026 −9.9%).
Backtest-review
Sharpe 0.664 met sharpe_ci_low 0.0042 en PSR 0.924 (<0.95): al marginaal vóór de ~225-trial selectiedrempel.
Backtest-review
De zorg van QA deels bevestigd: het 'normale' vol-tertiel blijft negatief (−7.70%, 16.1% DD), information_ratio −0.757, alpha slechts +2.4%/jaar — het presteert slechter dan het aanhouden van BTC, en benchmark_meaningful=true dus dat tekort is reëel.
Backtest-review
Parameters zijn een out-of-sample overdracht van een andere venue/richtingset — ongetuned in plaats van overfit, maar ook hier nog ongetest.
Stratmill is een onderzoeks- en papertrading-tool, geen financieel advies of broker. Backtest- en paperresultaten zijn hypothetisch. Handelen brengt risico op verlies met zich mee.