fix: Skip frequency checks for data collection signals

PROBLEM:
- 1-minute data collection signals were getting blocked
- Overtrading penalty: '30 signals in 30min (-20 pts)'
- Flip-flop penalty: 'opposite direction 1min ago (-25 pts)'
- These penalties don't make sense for data collection

ROOT CAUSE:
- Quality scoring runs for ALL timeframes (needed for analysis)
- But frequency checks (overtrading/flip-flop) only apply to production (5min)
- Data collection signals (1min, 15min, 1H, etc.) shouldn't be penalized

SOLUTION:
- Added skipFrequencyCheck parameter to scoreSignalQuality()
- Set to true for all non-5min timeframes: skipFrequencyCheck: timeframe !== '5'
- Moved timeframe variable declaration earlier for reuse
- 1-minute signals now score purely on technical merit (ADX/ATR/RSI/etc.)

IMPACT:
- 1-minute data collection works correctly
- No false 'overtrading' blocks every minute
- Quality scores still calculated for cross-timeframe analysis
- Production 5min signals still have full frequency validation

FILES CHANGED:
- app/api/trading/execute/route.ts (quality scoring call)

DEPLOYED: Nov 27, 2025 (71.8s build time)
This commit is contained in:
mindesbunister
2025-11-27 12:07:37 +01:00
parent c86b1fb24f
commit 85581a670a

View File

@@ -113,6 +113,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
// 📊 CALCULATE QUALITY SCORE BEFORE TIMEFRAME CHECK (Nov 26, 2025)
// CRITICAL: Score ALL signals (5min + data collection) for proper multi-timeframe analysis
// This enables quality-filtered win rate comparison across timeframes
const timeframe = body.timeframe || '5'
const qualityResult = await scoreSignalQuality({
atr: body.atr || 0,
adx: body.adx || 0,
@@ -120,10 +121,11 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
volumeRatio: body.volumeRatio || 0,
pricePosition: body.pricePosition || 0,
maGap: body.maGap, // V9: MA gap convergence scoring
timeframe: body.timeframe || '5',
timeframe: timeframe,
direction: body.direction,
symbol: driftSymbol,
currentPrice: body.signalPrice || 0,
skipFrequencyCheck: timeframe !== '5', // Skip overtrading/flip-flop for data collection
})
console.log(`📊 Signal quality: ${qualityResult.score} (${qualityResult.score >= 90 ? 'PASS' : 'BLOCKED'})`)
if (qualityResult.reasons?.length > 0) {
@@ -136,8 +138,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
// 🔬 MULTI-TIMEFRAME DATA COLLECTION
// Only execute trades from 5min timeframe OR manual Telegram trades
// Save other timeframes (15min, 1H, 4H, Daily) for analysis
const timeframe = body.timeframe || '5'
// Save other timeframes (1min, 15min, 1H, 4H, Daily) for analysis
if (timeframe !== '5' && timeframe !== 'manual') {
console.log(`📊 DATA COLLECTION: ${timeframe}min signal from ${driftSymbol}, saving for analysis (not executing)`)