docs: Update copilot-instructions.md for Nov 26 quality scoring enhancement

- Multi-Timeframe section: Added Nov 26 implementation note
- Quality scoring now calculated for ALL timeframes (not just 5min)
- Data collection signals get real quality scores (not hardcoded 0)
- BlockedSignal records include full quality metadata
- Enables SQL: WHERE signalQualityScore >= minScoreRequired
- Execute Trade workflow: Added timeframe routing logic
- When Making Changes: Added item #19 for multi-timeframe updates
- Reflects implementation in commit dbada47
This commit is contained in:
mindesbunister
2025-11-26 15:21:08 +01:00
parent dbada477b8
commit 2338bb6283

View File

@@ -720,14 +720,20 @@ WHERE "blockReason" = 'QUALITY_SCORE_TOO_LOW'
- **Comprehensive:** Tracks best/worst case scenarios (MFE/MAE) - **Comprehensive:** Tracks best/worst case scenarios (MFE/MAE)
- **API accessible:** Check status anytime via `/api/analytics/signal-tracking` - **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 - ✅ 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 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 - ✅ TradingView alerts configured for 15min and 1H
- ✅ Background tracker runs every 5 minutes autonomously - ✅ Background tracker runs every 5 minutes autonomously
- 📊 **Data collection:** Multi-timeframe (50+ per timeframe) + quality-blocked (20-30 signals) - 📊 **Data collection:** Multi-timeframe (50+ per timeframe) + quality-blocked (20-30 signals)
- 🎯 **Dual goals:** - 🎯 **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 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** - 📈 **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 ↓ /api/trading/execute
↓ normalize symbol (SOLUSDT → SOL-PERP) ↓ normalize symbol (SOLUSDT → SOL-PERP)
↓ getMergedConfig() ↓ 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] ↓ getPositionSizeForSymbol(qualityScore) [adaptive leverage based on quality score]
↓ openPosition() [MARKET order with adaptive leverage] ↓ openPosition() [MARKET order with adaptive leverage]
↓ calculate dual stop prices if enabled ↓ 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] ↓ 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):** **CRITICAL EXECUTION ORDER (Nov 24, 2025 - Adaptive Leverage):**
The order of quality scoring → position sizing is NOT arbitrary - it's a requirement: The order of quality scoring → position sizing is NOT arbitrary - it's a requirement:
- Quality score MUST be calculated BEFORE position sizing - 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`) - 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 - **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 - **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 ## Development Roadmap