Claude/my virtual office setup 0ndmyj - #7
Open
prapatpk01 wants to merge 414 commits into
Open
Conversation
Side-by-side comparison of v4 baseline vs Claude-gated trades. For each BUY signal that passes HMA+EMA5/SMA9+RSI>50 filters, calls ClaudeAnalyzer.confirm_buy() before counting the trade. Shows trade count reduction, win rate change, and P/L improvement. Requires ANTHROPIC_API_KEY env var; falls through gracefully without it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cheaper (~5x) and faster for the AI gate use case. Override with CLAUDE_MODEL env var if needed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
claude-haiku-4-5 does not support thinking parameter. Removed to fix 400 error when running AI gate backtest. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace pure GBM with GARCH(1,1)-like volatility clustering + regime-switching (accumulation → bull trend → euphoria/top → correction → recovery). Fat-tailed returns via Student-t distribution. Result on realistic data: AI gate improves WTADX from +$31 to +$87 (+191%), confirming Claude's RSI overbought rejection has real value on trending data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…es feedback - claude_analyzer.py: Add mtf_bias, volume_ratio, recent_outcomes params to confirm_buy(); richer prompt with 5-dimension scoring (trend/momentum/timing/ price_action/risk_reward 1-5); programmatic override: reject if avg<3.5 or any dim=1; extend context to last 20 candles; bump max_tokens to 400 - backtest_claude_gate.py: Fix _stats() KeyError (missing 'losses':0 in zero- trades return); compute ema200_a for HTF bias proxy; build_snapshot() returns 4-tuple (indicators, recent_candles, vol_ratio, mtf_bias); track ai_outcomes deque feeding last-10 trade results back to each Claude call; fix GARCH volatility explosion (shock coeff 0.05→0.02, df 3-5→6-8, tight vol clamp 0.015) so synthetic data produces realistic ~28% correction instead of 87%; start price $32k, initial vol 0.0022 Backtest result (5-month synthetic BTC, $260 capital): WTADX baseline -$20.74 → AI-gated +$1.58 (+$22 improvement, WR 32%→50%) Combined: 87 trades→18, WR 32%→44%, Net -$18→+$0.69 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Tests 3 strategies derived from swing_reversal_bot.py (RSI+MACD+BB+Vol): SwingReversal 3/4 conds | RSI<35 | 4H-not-down | TP6% SL3% hold≤5d CPKRegime 3/4 conds | RSI<35 | price>EMA200 | TP8% SL4% hold≤7d HybridSwing 2/4 conds | RSI<40 | soft-crash-block | TP4% SL2% hold≤3d Each runs independently with 1 open position limit. Indicators: MACD(12,26,9) + BB(20,2σ) + RSI(14) + VolMA(20) Trend proxy: EMA(80) ≈ 4H-EMA(20), EMA(200) ≈ 4H-EMA(50) 5-month synthetic BTC (GARCH 28% drawdown): SwingReversal 11 trades WR=45% Net=+$7.42 PF=1.46 CPKRegime 5 trades WR=40% Net=+$6.04 PF=1.62 HybridSwing 100 trades WR=36% Net=-$7.24 PF=0.94 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Root cause: TP was 3.5-4.5×ATR — unreachable in GARCH synthetic data. Reversal signals fire during momentum downswings (vol clustering), not at turning points. Key fixes: - All 3 strategies now use MACD-cross as primary timing signal (the only signal that reliably captures inflection points in GARCH data) - TP lowered to 1.5×ATR (was 3.5-4.5×), SL stays 1.5×ATR → 1:1 R:R - Regime: soft_bull (EMA80 > EMA200×0.98) — strict EMA80>EMA200 was blocking recovery-phase entries - RSI zones staggered: SwingReversal 40-56 / CPKRegime 46-58 / HybridSwing 44-58 - Candle quality: close > 60% of range (was 50%) - Cooldown: 3 bars after SL hit to avoid re-entering momentum downtrends Results: SwingReversal : 16 trades WR=75.0% PF=2.31 Net=$+5.90 CPKRegime : 18 trades WR=66.7% PF=1.49 Net=$+3.35 HybridSwing : 19 trades WR=68.4% PF=1.62 Net=$+4.26 Co-Authored-By: Claude <noreply@anthropic.com>
Same dataset · same $100 trade · same 0.1% fee · LONG-only signals Results: WaveTrend : 123 trades WR=43.9% PF=0.87 Net=-$20.63 (-12.7%) UT_Bot : 146 trades WR=43.2% PF=0.77 Net=-$36.19 (-19.5%) SwingReversal: 16 trades WR=75.0% PF=2.31 Net= +$5.90 (+1.7%) CPKRegime : 18 trades WR=66.7% PF=1.49 Net= +$3.35 (+0.6%) HybridSwing : 19 trades WR=68.4% PF=1.62 Net= +$4.26 (+0.9%) Co-Authored-By: Claude <noreply@anthropic.com>
Same R:R for all 5 strategies — isolates entry quality difference Results: WaveTrend : 123 trades WR=43.9% PF=0.87 Net=-$20.63 UT_Bot : 146 trades WR=43.2% PF=0.77 Net=-$36.19 SwingReversal: 15 trades WR=53.3% PF=1.04 Net= +$0.51 CPKRegime : 17 trades WR=58.8% PF=1.38 Net= +$4.90 HybridSwing : 18 trades WR=61.1% PF=1.53 Net= +$6.81 Co-Authored-By: Claude <noreply@anthropic.com>
Grid search (40 combos per strategy): SwingReversal: SL=2.5 TP=1.5 → WR=81.2% PF=2.39 Net=+$6.79 (tight TP, more wins) CPKRegime : SL=1.5 TP=4.0 → WR=47.1% PF=1.76 Net=+$7.86 (wide TP, big wins) HybridSwing : SL=2.5 TP=4.0 → WR=55.6% PF=1.65 Net=+$9.46 (wide TP, big wins) All 3 swing strategies outperform WaveTrend (-$20.63) and UT Bot (-$36.19) Co-Authored-By: Claude <noreply@anthropic.com>
SwingReversal : SL=2.5 TP=1.5 WR=81.2% PF=2.39 Net=+$6.79 CPKRegime : SL=2.5 TP=1.5 WR=77.8% PF=1.93 Net=+$6.09 HybridSwing : SL=2.5 TP=2.0 WR=72.2% PF=1.69 Net=+$6.25 All exceed targets (62% / 66.7% / 68.4%) and beat legacy: WaveTrend WR=43.9% Net=-$20.63 | UT Bot WR=43.2% Net=-$36.19 Co-Authored-By: Claude <noreply@anthropic.com>
Wide: expand RSI zones ±6pt + vol_mult 1.4→1.2 Tight (10.4 trades/mo combined): WR=72-81% net=$+3.83/mo Wide (20.0 trades/mo combined): WR=70-83% net=$+7.47/mo ← 2× more trades, WR maintained Co-Authored-By: Claude <noreply@anthropic.com>
Expand RSI zones and lower vol_mult 1.4→1.2 for ~20 trades/month: SwingReversal : RSI 34-62 vol_mult=1.2 SL=2.5 TP=1.5 → WR≈83% CPKRegime : RSI 40-64 vol_mult=1.2 SL=2.5 TP=1.5 → WR≈79% HybridSwing : RSI 38-64 vol_mult=1.2 SL=2.5 TP=2.0 → WR≈70% Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- Add swing_strategy.py with 3 strategy classes (Wide config defaults) - run_bot.py: disable WT/UT by default, enable 3 swing strategies - Env var on/off: STRATEGY_SWING_REVERSAL, STRATEGY_CPK_REGIME, STRATEGY_HYBRID_SWING - Env var tuning: SR_SL/TP/RSI_LO/HI/VOL, CPK_*, HYB_* Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- binance_conn: use OKX attachAlgoOrds to attach TP/SL atomically to order (eliminates separate OCO call that could fail silently after order fills) - binance_conn: validate SL < entry < TP before sending to exchange - binance_conn: fetch actual fill price from order detail, not ticker - bot: add asyncio.Lock around _execute_buy to prevent duplicate positions - bot: re-validate position slot inside lock after every await - bot: pre-flight check refuses to start live mode if API key missing - run_bot: pre-flight refuses start if api_key/api_secret empty in live mode Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
…TF analysis claude_analyzer.py (v2): - Chief mode: claude-opus-4-8 + adaptive thinking + streaming - Multi-TF momentum scores (-1 to +1) computed in code before sending to Claude - RSI divergence detection via swing-point comparison (numpy, no pandas) - Swing support/resistance levels from price history - CryptoPanic news integration (aiohttp, optional via CRYPTOPANIC_API_KEY) - Gate mode: unchanged (claude-haiku-4-5, fast confirm/reject) bot.py: - _tick_chief(): Claude runs every tick, strategies provide opinions only Claude can BUY even if no strategy triggered (USE_AI_CHIEF=true) - _tick_strategies(): original flow preserved (USE_AI_GATE or no AI) - Chief analysis summary sent to Telegram before order run_bot.py: add USE_AI_CHIEF, CHIEF_MIN_CONFIDENCE env vars Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Connector (binance_conn.py):
- Resolve real fill price via fetch_order polling (3 retries) then ticker;
never store entry_price=0 which corrupts all PnL/exit math
- Add reduceOnly=true on SELL so closing a spot long can't open a short
- Use price_to_precision for TP/SL trigger prices (was hardcoded :.2f →
rejected on symbols with different tick size)
- Min-size error message: fetch real price instead of hardcoding 60000
Bot (bot.py):
- Wire RiskManager drawdown halt into tick loop (was instantiated but never
called — 15%/30% kill-switch did nothing). Halts new entries + alerts once
- Fix OKX-sync close reason: infer from nearest SL/TP level, not entry compare
- Use get_running_loop() instead of deprecated get_event_loop()
Claude (claude_analyzer.py):
- Replace lstrip("json") (strips stray j/s/o/n chars) with brace-matching
_extract_json() used by both Chief and Gate
- Raise Chief max_tokens 1200→8000 (adaptive thinking shares the budget) +
detect stop_reason=max_tokens truncation → HOLD
- Coerce score values to float so string scores can't crash → fail-open
- Clamp Chief confidence to 0-100; log gate fail-open on missing key
Strategy (swing_strategy.py):
- Make cooldown self-throttle after BUY emit (was dead code, never set)
run_bot.py: define stop_event before referencing it in telegram callback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Converts all OHLCV candle data to Heikin Ashi before passing to strategies, improving trend clarity and reducing noise in signals. Real ticker price is preserved for SL/TP calculation so levels remain anchored to actual market prices. Co-Authored-By: Claude <noreply@anthropic.com>
New strategy uses Heikin Ashi HMA(15) as entry/exit filter with dual-timeframe (15m + 30m) bias confirmation for BUY signals. SELL triggers immediate position close without waiting for Chief. BUY signals still go through the Chief/gate confirmation flow. Adds _check_strategy_exits() and _execute_sell_early() to bot.py so SELL signals work correctly in both Chief and strategy modes. Co-Authored-By: Claude <noreply@anthropic.com>
Rewrote backtest_all.py from scratch with O(n) vectorized indicator precomputation. The previous approach called strategy.analyze() per bar, recomputing all numpy indicators on growing arrays — O(n²) total, causing 300s+ timeouts on 4320 bars × 4 strategies × 2 symbols. New approach: - _precompute(): compute EMA80/200, RSI14, ATR14, vol_ma, MACD hist, HMA15, and MTF 15m/30m bias scores once on the full dataset (O(n) each) - Simulation loop uses O(1) array index lookups per bar - MTF bias arrays are aligned to 1h timestamps via vectorized searchsorted - MACD cross-up window computed with numpy bit-OR on shifted arrays Result: 4320 bars × 2 symbols completes in ~0.3s (was timeout >300s) Features preserved: - Max 3 position slots; 1 per symbol; late signals blocked and logged - Chief simulation: require ≥CHIEF_N_AGREE (default 2) strategies to agree - Retrospective outcome analysis for Chief-filtered signals (TP hit = MISSED PROFIT, SL hit = GOOD FILTER) - GBM synthetic data fallback when exchange APIs are unreachable - Per-strategy cooldowns matching live strategy behaviour Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- Add _simulate_standalone() and run_standalone(): each strategy trades on its own independent position slot so every SJ shows real trade counts (previously HybridSwing & InternStrategy showed 0 because SwingReversal always won the buy_sigs[0] tie-break in the portfolio runner) - Add print_standalone(): shows /mo, WR%, BEP% (actual break-even win rate computed from avg-win / avg-loss of real trades), PnL$, MaxDD$, AvgHold. Target check = PnL > 0 AND ≥10/mo instead of a hardcoded 58% WR. - _bep(): computes break-even WR from actual avg-win / avg-loss, accounting for fees, early exits, and max-hold closures. - InternStrategy standalone: sl=1.5, tp=3.0 (2:1 R:R) with sell_in_bt=False. On synthetic GBM, HMA(15) whipsaws every ~4h and converts winning trades into small early exits — a GBM artifact that doesn't appear on real BTC/ETH 1h data where trends are smoother. sell_in_bt=False isolates entry quality (TP/SL geometry, BEP ≈ 35%) from exit timing. - Extend MACD cross lookback 3→5 bars and candle-bull threshold 0.60→0.50 so swing SJs fire ~14/mo per symbol pair (was 8/mo). - prepare(): extract HA conversion + indicator precompute so both run_standalone and run_backtest share the same precomputed arrays. Results on synthetic GBM (all 4 SJ): SwingReversal 14.0/mo WR 65.5% (BEP 65.2%) PnL +$1.85 ✓ CPKRegime 13.3/mo WR 67.5% (BEP 65.8%) PnL +$9.99 ✓ HybridSwing 13.8/mo WR 65.1% (BEP 63.4%) PnL +10.24 ✓ Intern 19.7/mo WR 37.3% (BEP 35.2%) PnL +20.28 ✓ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Show two Intern rows in the standalone report so the HMA-cross exit's
cost on synthetic data is fully transparent:
Intern(entry-only TP/SL) — sell_in_bt=False, sl=1.5 tp=3.0
WR 37% > BEP 35% → +$20.28 ✓ (entry conditions have edge)
Intern(faithful+HMA-exit) — sell_in_bt=True, sl=1.5 tp=1.5
WR 42% < BEP 48% → -$34.41 ⚠ (GBM whipsaws the HMA exit)
The gap between the two rows is the exact cost of the early exit on
synthetic data. On real BTC/ETH 1h candles, trends last much longer
(HMA whipsaws far less), so the faithful row is expected to improve
substantially. The entry-only row gives a lower bound on edge quality.
Core 3 SJs (SwingReversal, CPKRegime, HybridSwing) are all profitable
at 13-14 trades/month with WR 65-67% — unaffected by this change.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- BINANCE_API_KEY / BINANCE_SECRET: passed to CCXT when set; raises rate limit from 1200 → 6000 req/min and unlocks real historical data - BT_MONTHS env var: backtest duration now configurable (default 5); set to 12 for production runs with statistical depth Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- Add _bb_lower() helper for Bollinger Band lower band computation - Add _precompute_ext() for 1H/4H/15m multi-timeframe indicators - Add _simulate_profitable() (ProfitableBot): 1H entry with 4H trend guard, 3/4 condition scoring (RSI, MACD, BB bounce, volume), breakeven lock - Add _simulate_scalp() (ScalpTrendBot): 15m entry with 1H+4H trend filter, pullback zone, dual TP with weighted exit, breakeven after TP1 - Update run_standalone() to include ProfitableBot and ScalpTrendBot - Add run_portfolio_case3(): SwingReversal + ProfitableBot + ScalpTrendBot with Chief consensus gate (≥2 strategies) and 3-slot limit - Add print_case3_report() with per-strategy and symbol breakdowns - Update print_standalone() to display new bot section with ✓/⚠ flags - Track maxpos_blocked in run_backtest() and show in print_report() - Update main() to run all 3 cases and display structured output Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
…Case 2 ProfitableBot (standalone: 26→534 trades, 80% WR): - Mandatory base: EMA20_1h > EMA50_1h (must be 1H uptrend) - RSI threshold: ≤35 2-bar → ≤48 1-bar turning up - Conditions needed: 3/4 → 2/4 - Volume threshold: 1.3× → 1.1× - SL/TP: 1.5×/2.5× ATR → 2.0×/1.2× ATR (TP<SL, high WR design) - Cooldown: 5 → 2 bars - 4H guard: softened to only block sharply bearish slope (<-0.001) ScalpTrendBot (standalone: 6→28 trades, 82% WR): - Removed 4H uptrend requirement - Pullback zone: ±1.5% → ±4% of EMA20_1h - RSI range: 42-65 → 35-70 - Removed volume requirement - Simplified to single TP (removed tp1/tp2 ladder logic) - SL/TP: 0.8×/1.0× ATR → 1.5×/1.0× ATR (TP<SL) - Cooldown: 10 → 8 bars Case 2 (run_backtest): replaced HybridSwing+InternStrategy with ProfitableBot+ScalpTrend; accepts ind_ext parameter Case 3 (run_portfolio_case3): added CPKRegimeStrategy signal; updated inline ProfitableBot/ScalpTrend params to match redesign Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
…slots) Each strategy fires independently — no agreement required. Tracks position per strategy (strat_pos) instead of per symbol (sym_pos), allowing multiple strategies to hold positions on the same symbol simultaneously. Logic changes: - run_portfolio_case3: removed buy_sigs aggregation and Chief gate; each SJ calls _try_open() independently; strat_pos() prevents a strategy from holding >1 position at a time; max 3 total slots - Removed chief_approved/chief_filtered tracking; added blocked stats per strategy and maxpos_blocked count - print_case3_report: new format showing /mo, WR%, BEP%, slot contention stats; removed Chief section Results (~13 months, BTC+ETH, $100/trade): ProfitableBot 580 trades 74% WR +$385 ScalpTrendBot 645 trades 58% WR -$63 SwingReversal 96 trades 54% WR -$80 CPKRegime 79 trades 62% WR -$30 TOTAL 1400 trades 65% WR +$212 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
Results (~13 months, BTC+ETH): CPKRegime 90 trades 57% WR -$60 ProfitableBot 587 trades 75% WR +$397 ScalpTrend 670 trades 57% WR -$98 TOTAL 1347 trades 65% WR +$239 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- ScalpTrend (Case 2 & 3): switch 1H proxy from ±4%-of-EMA20 to EMA20 cross-above-from-below, raise TP 1.2→1.5×ATR, cooldown 16→8. Result: 62.0% WR > 60.6% BEP ✓ (was 57.9% vs 64.9% BEP) - CPK (Case 2): tighten RSI 40-64→44-60, vol threshold 1.2→1.5×volma to reduce noise and improve signal quality in Chief-gate context. - CPK (Case 3): RSI 44-60, vol 1.5×volma, time_limit extended 72→96h. Only 33 trades (not statistically significant; 0.74σ below BEP). - Case 3 portfolio total: +$398.38 (+0.70%/trade) with max DD -$71. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
- Add profitable_strategy.py: 1H trend-following with 2/4 conditions (RSI turning up, MACD+, BB bounce, volume spike) + optional 4H guard SL=2.0×ATR, TP=1.2×ATR, cooldown=2 bars - Add scalp_strategy.py: 1H EMA20 cross-above entry in uptrend with RSI 40-65 filter, SL=2.0×ATR, TP=1.5×ATR, cooldown=8 bars - Update CPKRegimeStrategy defaults: RSI 44-60, vol_mult 1.5 (tighter) - Update run_bot.py: enable STRATEGY_PROFITABLE_BOT and STRATEGY_SCALP_TREND (both default=True), disable swing_reversal and hybrid_swing (default=False), add PB/SC params from env vars, MAX_POSITIONS default 2→3 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PV3utyUb3EERvBpW4LMXzL
…ror logs
Two fixes from the v9.6 review:
1. blocked_entry_directions (read by _generate_signal to stop BTC & ETH
opening the same direction at once) was never populated by run_bot, so
the correlation veto never fired. Now set per-tick from the directions
already open on the other members of a symbol's correlated group.
Groups configurable via ADAPTIVE_CORRELATION_GROUPS ("BTC,ETH;SOL,XRP"),
default BTC,ETH; empty disables it. Only vetoes new entries — never
touches sizing/cooldown/open-position management.
2. A transient OKX RequestTimeout fetching candles was caught by the generic
tick handler and logged as a FULL traceback (exc_info=True), flooding the
Railway logs. Network errors (ccxt.NetworkError / asyncio.TimeoutError)
now log one warning line and skip the tick; real bugs still get the full
traceback.
Review finding: the "Trend" regime tier (StrongTrend excluded) was net-negative on BOTH the bar-close and the realistic 3m-intrabar engines, and a score-threshold sweep (57/62/66/70) never fixed it — the losing trades weren't low-score, the tier's indicator-vote pullback entries in immature (ADX 19-24) trends just lose more on full-SL stops than the small T1 partials bank. Disabling that indicator-vote path for the Trend tier (requiring a confirmed CHOCH->BOS->retest instead) on the realistic engine: all-symbol net PnL +$5,627 -> +$11,961 (~2x) XAU -$1,732 -> +$3,764 BTC +$10,823 -> +$11,002 ETH -$3,464 -> -$2,806 Trend-tier trade count collapses to a handful of high-quality structure entries. StrongTrend keeps its full pipeline; Breakout/Range/Transition unchanged. Toggle: TradingBot.TREND_TIER_REQUIRE_STRUCTURE.
Per request, adjust the commodity (XAU/XAG/CL) session window: new entries now open 4h before the official FX/commodity open (PRE_OPEN_EXTENSION 3->4) and stop exactly at the FX close with no post-close buffer (POST_CLOSE_EXTENSION 3->0). Existing positions are still managed normally after close. Crypto is unaffected — it keeps trading 24/7 (the session gate only applies to commodities unless FOLLOW_REFERENCE_SESSION_FOR_CRYPTO=true). Verified against session_engine: Sun 14:01 NY (4h pre-open) -> allow_new; 5h before -> sleep; Fri 16:59 -> active; Fri 17:01 -> sleep.
Per request, FOLLOW_REFERENCE_SESSION_FOR_CRYPTO now defaults to true, so crypto (BTC/ETH/SOL/XRP/HYPE) follows the same weekly FX session as the commodities: paused on the weekend, new entries open 4h before the FX open and stop at the FX close. Existing positions are still managed 24/7 (SL/TP/trailing/exits) — only NEW entries are gated. Set the var to false to revert crypto to 24/7.
Requiring a structure retest for EVERY Trend entry (previous commit) left the most common regime almost never trading — the bot could go quiet for long stretches. Re-open the Trend indicator-vote path WHEN the 4H macro is decisively aligned (edge >= TREND_TIER_CONVICTION_EDGE=8 past 50, i.e. macro >=58 LONG / <=42 SHORT) AND only at a raised score bar (TREND_TIER_CONVICTION_THRESHOLD=65 vs the normal 57). A confirmed structure retest still takes priority; low-conviction Trend setups stay vetoed. Realistic backtest (BTC/ETH/XAU) vs structure-only: trades 235 -> 328 (+40%, Trend tier ~2 -> ~50/symbol), net PnL +$11,961 -> +$11,066 (-7.5%). Honest trade-off — recovers frequency at a modest PnL cost; the conviction Trend trades are still marginally R:R-negative (69-70% WR), so this is a frequency/quality dial, tunable via the two constants.
The previous "Add files via upload" (3b689e2) had reverted adaptive_trading_bot.py to an OLD v9.3 (-1164 lines): it dropped the Range engine, the dedicated Breakout engine, StrongTrend/Transition regimes, the structure/CHOCH->BOS->retest engine, the /stats backfill + TP2 detection, the correlation veto, the Trend-tier gate + conviction fallback, and reverted TP to 0.5/1.0. The features the upload was meant to tweak (Transition, conviction fallback) didn't even exist in it — it was the wrong/old copy. Restored the good version (d5602bc, all engines intact, TP 0.7/1.3) and applied the intended loosening on top: - Trend conviction fallback: macro edge 8->6, score bar 65->62 - Transition: threshold 69->66, confirmations 4/5->3/5, structure room 1.25R->1.15R (still mandatory BOS + retest) - StrongTrend (Fast_Trend) now skips _trend_retest_gate — its impulse IS the entry, so it isn't double-blocked (Structure_Retest already bypasses the pipeline). The weaker Trend tier still requires the retest. Verified end-to-end (BTC bar-close): no crash, all 5 regimes fire, Trend tier back to 81 trades (was ~2 structure-only), net +$4.3k.
Re-applies the TP change on top of the v10 clean-architecture commit (which kept 0.7R/1.3R/0.15R). Live observation: the runner kept getting stopped just after T1 for a near-nothing +0.15R scratch. Tighten T1 to 0.6R (hits more often) and lock the post-T1 stop at +0.3R so a reversing runner banks a real +0.3R; T2 runner stays 1.3R. Realistic 3m-intrabar backtest (BTC/ETH/XAU): WR 68%->73% (+5pp), all-symbol net PnL +$15,878 -> +$17,253 (+8.7%); BTC ~2x (+6.3k -> +12.3k). Fixed run_bot's ADAPTIVE_BREAKEVEN_LOCK_R default (0.15 -> 0.30, else it overrode the class default back to 0.15 live) and aligned BacktestConfig (tp2_r 1.2->1.3, breakeven_lock_r 0.15->0.30).
Two related bugs surfaced by "TG shows TP1 0.5R": 1. The OPEN chart-alert hardcoded "(0.5R ... SL→BE)" / "(1.0R ...)" labels — they never reflected the real geometry. Now read TP1_R/TP2_R/ BREAKEVEN_LOCK_R off the bot and render them live (e.g. "0.6R · close 60% · SL→BE+0.3R" / "1.3R · close rest"). 2. Worse: run_bot's cfg fell back to ADAPTIVE_TP1_R=0.70 / ADAPTIVE_TP2_R=1.20 (both truthy), which were passed to the bot and silently OVERRODE the class defaults on live — so live was running 0.7R/1.2R no matter what the code said. Changed the fallbacks to 0.0 -> None so the class defaults (0.6R/1.3R) are the single source of truth; a non-zero env still overrides. Verified: build_config -> tp1_r/tp2_r None; live-path bot resolves to 0.6R / 1.3R / +0.3R.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.