diff --git a/app/api/analytics/version-comparison/route.ts b/app/api/analytics/version-comparison/route.ts index a5875c7..f238969 100644 --- a/app/api/analytics/version-comparison/route.ts +++ b/app/api/analytics/version-comparison/route.ts @@ -36,18 +36,19 @@ export async function GET() { version: string | null trades: bigint wins: bigint - total_pnl: number - avg_pnl: number - avg_quality_score: number | null - avg_mfe: number | null - avg_mae: number | null + total_pnl: any + avg_pnl: any + avg_quality_score: any + avg_mfe: any + avg_mae: any }>>` SELECT COALESCE("signalQualityVersion", 'v1') as version, COUNT(*) as trades, SUM(CASE WHEN "realizedPnL" > 0 THEN 1 ELSE 0 END) as wins, - ROUND(SUM("realizedPnL")::numeric, 2) as total_pnl, - ROUND(AVG("realizedPnL")::numeric, 2) as avg_pnl, + SUM("realizedPnL") as total_pnl, + AVG("realizedPnL") as avg_pnl, + AVG("realizedPnL") as avg_pnl, ROUND(AVG("signalQualityScore")::numeric, 1) as avg_quality_score, ROUND(AVG("maxFavorableExcursion")::numeric, 2) as avg_mfe, ROUND(AVG("maxAdverseExcursion")::numeric, 2) as avg_mae @@ -63,10 +64,10 @@ export async function GET() { const extremePositionStats = await prisma.$queryRaw>` SELECT COALESCE("signalQualityVersion", 'v1') as version, @@ -74,7 +75,7 @@ export async function GET() { ROUND(AVG("adxAtEntry")::numeric, 1) as avg_adx, COUNT(*) FILTER (WHERE "adxAtEntry" < 18) as weak_adx_count, SUM(CASE WHEN "realizedPnL" > 0 THEN 1 ELSE 0 END) as wins, - ROUND(AVG("realizedPnL")::numeric, 2) as avg_pnl + AVG("realizedPnL") as avg_pnl FROM "Trade" WHERE "exitReason" IS NOT NULL AND "exitReason" NOT LIKE '%CLEANUP%' @@ -100,17 +101,17 @@ export async function GET() { version: stat.version || 'v1', tradeCount: trades, winRate: trades > 0 ? Math.round((wins / trades) * 100 * 10) / 10 : 0, - totalPnL: stat.total_pnl, - avgPnL: stat.avg_pnl, - avgQualityScore: stat.avg_quality_score, - avgMFE: stat.avg_mfe, - avgMAE: stat.avg_mae, + totalPnL: Number(stat.total_pnl) || 0, + avgPnL: Number(stat.avg_pnl) || 0, + avgQualityScore: stat.avg_quality_score ? Number(stat.avg_quality_score) : null, + avgMFE: stat.avg_mfe ? Number(stat.avg_mfe) : null, + avgMAE: stat.avg_mae ? Number(stat.avg_mae) : null, extremePositions: { count: extremeCount, - avgADX: extremeStats?.avg_adx || null, + avgADX: extremeStats?.avg_adx ? Number(extremeStats.avg_adx) : null, weakADXCount: extremeStats ? Number(extremeStats.weak_adx_count) : 0, winRate: extremeCount > 0 ? Math.round((extremeWins / extremeCount) * 100 * 10) / 10 : 0, - avgPnL: extremeStats?.avg_pnl || 0, + avgPnL: extremeStats?.avg_pnl ? Number(extremeStats.avg_pnl) : 0, } } })