feat: implement blocked signals tracking system
- Add BlockedSignal table with 25 fields for comprehensive signal analysis - Track all blocked signals with metrics (ATR, ADX, RSI, volume, price position) - Store quality scores, block reasons, and detailed breakdowns - Include future fields for automated price analysis (priceAfter1/5/15/30Min) - Restore signalQualityVersion field to Trade table Database changes: - New table: BlockedSignal with indexes on symbol, createdAt, score, blockReason - Fixed schema drift from manual changes API changes: - Modified check-risk endpoint to save blocked signals automatically - Fixed hasContextMetrics variable scope (moved to line 209) - Save blocks for: quality score too low, cooldown period, hourly limit - Use config.minSignalQualityScore instead of hardcoded 60 Database helpers: - Added createBlockedSignal() function with try/catch safety - Added getRecentBlockedSignals(limit) for queries - Added getBlockedSignalsForAnalysis(olderThanMinutes) for automation Documentation: - Created BLOCKED_SIGNALS_TRACKING.md with SQL queries and analysis workflow - Created SIGNAL_QUALITY_OPTIMIZATION_ROADMAP.md with 5-phase plan - Documented data-first approach: collect 10-20 signals before optimization Rationale: Only 2 historical trades scored 60-64 (insufficient sample size for threshold decision). Building data collection infrastructure before making premature optimizations. Phase 1 (current): Collect blocked signals for 1-2 weeks Phase 2 (next): Analyze patterns and make data-driven threshold decision Phase 3-5 (future): Automation and ML optimization
This commit is contained in:
@@ -77,6 +77,7 @@ model Trade {
|
||||
volumeAtEntry Float? // Volume relative to MA
|
||||
pricePositionAtEntry Float? // Price position in range (0-100%)
|
||||
signalQualityScore Int? // Calculated quality score (0-100)
|
||||
signalQualityVersion String? @default("v1") // Tracks which scoring logic was used
|
||||
fundingRateAtEntry Float? // Perp funding rate at entry
|
||||
basisAtEntry Float? // Perp-spot basis at entry
|
||||
|
||||
@@ -151,6 +152,52 @@ model SystemEvent {
|
||||
@@index([createdAt])
|
||||
}
|
||||
|
||||
// Blocked signals for analysis (signals that didn't pass quality checks)
|
||||
model BlockedSignal {
|
||||
id String @id @default(cuid())
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
// Signal identification
|
||||
symbol String // e.g., "SOL-PERP"
|
||||
direction String // "long" or "short"
|
||||
timeframe String? // "5", "15", "60"
|
||||
|
||||
// Price at signal time
|
||||
signalPrice Float // Price when signal was generated
|
||||
|
||||
// Market metrics at signal time
|
||||
atr Float? // ATR% at signal
|
||||
adx Float? // ADX trend strength
|
||||
rsi Float? // RSI momentum
|
||||
volumeRatio Float? // Volume relative to average
|
||||
pricePosition Float? // Position in range (0-100%)
|
||||
|
||||
// Quality scoring
|
||||
signalQualityScore Int // 0-100 score
|
||||
signalQualityVersion String? // Which scoring version
|
||||
scoreBreakdown Json? // Detailed breakdown of score components
|
||||
minScoreRequired Int // What threshold was used (e.g., 65)
|
||||
|
||||
// Block reason
|
||||
blockReason String // "QUALITY_SCORE_TOO_LOW", "DUPLICATE", "COOLDOWN", etc.
|
||||
blockDetails String? // Human-readable details
|
||||
|
||||
// For later analysis: track if it would have been profitable
|
||||
priceAfter1Min Float? // Price 1 minute after (filled by monitoring job)
|
||||
priceAfter5Min Float? // Price 5 minutes after
|
||||
priceAfter15Min Float? // Price 15 minutes after
|
||||
priceAfter30Min Float? // Price 30 minutes after
|
||||
wouldHitTP1 Boolean? // Would TP1 have been hit?
|
||||
wouldHitTP2 Boolean? // Would TP2 have been hit?
|
||||
wouldHitSL Boolean? // Would SL have been hit?
|
||||
analysisComplete Boolean @default(false) // Has post-analysis been done?
|
||||
|
||||
@@index([symbol])
|
||||
@@index([createdAt])
|
||||
@@index([signalQualityScore])
|
||||
@@index([blockReason])
|
||||
}
|
||||
|
||||
// Performance analytics (daily aggregates)
|
||||
model DailyStats {
|
||||
id String @id @default(cuid())
|
||||
|
||||
Reference in New Issue
Block a user