diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index a876d35..c916106 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -720,14 +720,20 @@ WHERE "blockReason" = 'QUALITY_SCORE_TOO_LOW' - **Comprehensive:** Tracks best/worst case scenarios (MFE/MAE) - **API accessible:** Check status anytime via `/api/analytics/signal-tracking` -**Current Status (Nov 22, 2025):** +**Current Status (Nov 26, 2025):** - ✅ System deployed and running in production - ✅ **Enhanced Nov 22:** Now tracks quality-blocked signals (QUALITY_SCORE_TOO_LOW) in addition to multi-timeframe data collection +- ✅ **Enhanced Nov 26:** Quality scoring now calculated for ALL timeframes (not just 5min production signals) + - Execute endpoint calculates `scoreSignalQuality()` BEFORE timeframe check (line 112) + - Data collection signals now get real quality scores (not hardcoded 0) + - BlockedSignal records include: `signalQualityScore` (0-100), `signalQualityVersion` ('v9'), `minScoreRequired` (90/95) + - Enables SQL queries: `WHERE signalQualityScore >= minScoreRequired` to compare quality-filtered win rates + - Commit: dbada47 "feat: Calculate quality scores for all timeframes (not just 5min)" - ✅ TradingView alerts configured for 15min and 1H - ✅ Background tracker runs every 5 minutes autonomously - 📊 **Data collection:** Multi-timeframe (50+ per timeframe) + quality-blocked (20-30 signals) - 🎯 **Dual goals:** - 1. Determine which timeframe has best win rate + 1. Determine which timeframe has best win rate (now with quality filtering capability) 2. Validate if quality 91 threshold filters winners or losers - 📈 **First result (Nov 21, 16:50):** Quality 80 signal blocked (weak ADX 16.6), would have profited +0.52% (+$43) within 1 minute - **FALSE NEGATIVE confirmed** @@ -1315,7 +1321,9 @@ TradingView alert → n8n Parse Signal Enhanced (extracts metrics + timeframe) ↓ /api/trading/execute ↓ normalize symbol (SOLUSDT → SOL-PERP) ↓ getMergedConfig() - ↓ scoreSignalQuality({ ..., timeframe }) [CRITICAL: calculate EARLY, before position sizing] + ↓ scoreSignalQuality({ ..., timeframe }) [CRITICAL: calculate EARLY for ALL timeframes - line 112, Nov 26] + ↓ IF timeframe !== '5': Save to BlockedSignal with quality scores → return success + ↓ IF timeframe === '5': Continue to execution (production trade) ↓ getPositionSizeForSymbol(qualityScore) [adaptive leverage based on quality score] ↓ openPosition() [MARKET order with adaptive leverage] ↓ calculate dual stop prices if enabled @@ -1324,6 +1332,15 @@ TradingView alert → n8n Parse Signal Enhanced (extracts metrics + timeframe) ↓ positionManager.addTrade() [ONLY after DB save succeeds - prevents unprotected positions] ``` +**CRITICAL EXECUTION ORDER (Nov 26, 2025 - Multi-Timeframe Quality Scoring):** +Quality scoring MUST happen BEFORE timeframe filtering - this is NOT arbitrary: +- All timeframes (5min, 15min, 1H, 4H, Daily) need real quality scores for analysis +- Data collection signals (15min+) save to BlockedSignal with full quality metadata +- Enables SQL queries: `WHERE blockReason = 'DATA_COLLECTION_ONLY' AND signalQualityScore >= X` +- Purpose: Compare quality-filtered win rates across timeframes to determine optimal trading interval +- Old flow: Timeframe check → Quality score only for 5min → Data collection signals get hardcoded 0 +- **New flow:** Quality score ALL signals → Timeframe routing → Data collection gets real scores + **CRITICAL EXECUTION ORDER (Nov 24, 2025 - Adaptive Leverage):** The order of quality scoring → position sizing is NOT arbitrary - it's a requirement: - Quality score MUST be calculated BEFORE position sizing @@ -4274,6 +4291,14 @@ if (!enabled) { - Create reference docs in `docs/` for complex features (e.g., `MANUAL_TRADE_FILTERING.md`) - **WHY:** Future AI agents need complete context to maintain data integrity and avoid breaking analysis - **EXAMPLES:** signalSource field for filtering, MAE/MFE tracking, phantom trade detection +19. **MULTI-TIMEFRAME DATA COLLECTION CHANGES (Nov 26, 2025):** When modifying signal processing for different timeframes: + - Quality scoring MUST happen BEFORE timeframe filtering (execute endpoint line 112) + - All timeframes need real quality scores for analysis (not hardcoded 0) + - Data collection signals (15min/1H/4H/Daily) save to BlockedSignal with full quality metadata + - BlockedSignal fields to populate: signalQualityScore, signalQualityVersion, minScoreRequired, scoreBreakdown + - Enables SQL: `WHERE blockReason = 'DATA_COLLECTION_ONLY' AND signalQualityScore >= X` + - Purpose: Compare quality-filtered win rates across timeframes to determine optimal trading interval + - Update Multi-Timeframe section in copilot-instructions.md when changing flow ## Development Roadmap