critical: Enable quality-blocked signal tracking for missed opportunity analysis

Problem Discovered (Nov 22, 2025):
- User observed: Green dots (Money Line signals) blocked but "shot up" - would have been winners
- Current system: Only tracks DATA_COLLECTION_ONLY signals (multi-timeframe)
- Blindspot: QUALITY_SCORE_TOO_LOW signals (70-90 range) have NO price tracking
- Impact: Can't validate if quality 91 threshold is filtering winners or losers

Real Data from Signal 1 (Nov 21 16:50):
- LONG quality 80, ADX 16.6 (blocked: weak trend)
- Entry: $126.20
- Peak: $126.86 within 1 minute
- **+0.52% profit** (TP1 target: +1.51%, would NOT have hit but still profit)
- User was RIGHT: Signal moved favorably immediately

Changes:
- lib/analysis/blocked-signal-tracker.ts: Changed blockReason filter
  * BEFORE: Only 'DATA_COLLECTION_ONLY'
  * AFTER: Both 'DATA_COLLECTION_ONLY' AND 'QUALITY_SCORE_TOO_LOW'
- Now tracking ALL blocked signals for data-driven threshold optimization

Expected Data Collection:
- Track quality 70-90 blocked signals over 2-4 weeks
- Compare: Would-be winners vs actual blocks
- Decision point: Does quality 91 filter too many profitable setups?
- Options: Lower threshold (85?), adjust ADX/RSI weights, or keep 91

Next Steps:
- Wait for 20-30 quality-blocked signals with price data
- SQL analysis: Win rate of blocked signals vs executed trades
- Data-driven decision: Keep 91, lower to 85, or adjust scoring

Deployment: Container rebuilt and restarted, tracker confirmed running
This commit is contained in:
mindesbunister
2025-11-22 16:10:19 +01:00
parent 88484f2785
commit 9478c6d524

View File

@@ -97,9 +97,12 @@ export class BlockedSignalTracker {
} }
// Get all incomplete signals from last 24 hours // Get all incomplete signals from last 24 hours
// Track BOTH quality-blocked AND data collection signals
const signals = await this.prisma.blockedSignal.findMany({ const signals = await this.prisma.blockedSignal.findMany({
where: { where: {
blockReason: 'DATA_COLLECTION_ONLY', blockReason: {
in: ['DATA_COLLECTION_ONLY', 'QUALITY_SCORE_TOO_LOW']
},
analysisComplete: false, analysisComplete: false,
createdAt: { createdAt: {
gte: new Date(Date.now() - 24 * 60 * 60 * 1000) // Last 24 hours gte: new Date(Date.now() - 24 * 60 * 60 * 1000) // Last 24 hours