diff --git a/app/analytics/optimization/page.tsx b/app/analytics/optimization/page.tsx index a2c0e5a..5ffb5c8 100644 --- a/app/analytics/optimization/page.tsx +++ b/app/analytics/optimization/page.tsx @@ -39,10 +39,20 @@ export default function OptimizationPage() {
{/* Header */}
-

🔬 Optimization Analytics Dashboard

-

- Data-driven analysis for trading system improvements based on roadmaps and SQL queries -

+
+
+

🔬 Optimization Analytics Dashboard

+

+ Data-driven analysis for trading system improvements based on roadmaps and SQL queries +

+
+ + ← Home + +
{lastRefresh && (

Last refresh: {lastRefresh.toLocaleTimeString()} diff --git a/app/api/optimization/analyze/route.ts b/app/api/optimization/analyze/route.ts index d2615fd..33df37a 100644 --- a/app/api/optimization/analyze/route.ts +++ b/app/api/optimization/analyze/route.ts @@ -190,10 +190,10 @@ export async function GET() { const runnerPerformance = await prisma.$queryRaw` SELECT COUNT(*) as total_trades, - SUM(CASE WHEN "tp1Hit" = true THEN 1 ELSE 0 END) as tp1_hits, - SUM(CASE WHEN "tp2Hit" = true THEN 1 ELSE 0 END) as tp2_hits, - ROUND(100.0 * SUM(CASE WHEN "tp1Hit" = true THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as tp1_rate, - ROUND(100.0 * SUM(CASE WHEN "tp2Hit" = true THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as tp2_rate, + SUM(CASE WHEN "tp1Filled" = true THEN 1 ELSE 0 END) as tp1_hits, + SUM(CASE WHEN "tp2Filled" = true THEN 1 ELSE 0 END) as tp2_hits, + ROUND(100.0 * SUM(CASE WHEN "tp1Filled" = true THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as tp1_rate, + ROUND(100.0 * SUM(CASE WHEN "tp2Filled" = true THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as tp2_rate, ROUND(AVG("maxFavorableExcursion")::numeric, 2) as avg_mfe, ROUND(AVG("maxAdverseExcursion")::numeric, 2) as avg_mae FROM "Trade" @@ -244,9 +244,9 @@ export async function GET() { const atrCorrelation = await prisma.$queryRaw` SELECT CASE - WHEN atr < 0.3 THEN '<0.3 (Low Vol)' - WHEN atr < 0.5 THEN '0.3-0.5 (Med Vol)' - WHEN atr < 0.7 THEN '0.5-0.7 (High Vol)' + WHEN "atrAtEntry" < 0.3 THEN '<0.3 (Low Vol)' + WHEN "atrAtEntry" < 0.5 THEN '0.3-0.5 (Med Vol)' + WHEN "atrAtEntry" < 0.7 THEN '0.5-0.7 (High Vol)' ELSE '0.7+ (Very High Vol)' END as atr_range, COUNT(*) as trades, @@ -255,9 +255,9 @@ export async function GET() { ROUND(100.0 * SUM(CASE WHEN "realizedPnL" > 0 THEN 1 ELSE 0 END) / COUNT(*)::numeric, 1) as win_rate FROM "Trade" WHERE "exitReason" IS NOT NULL - AND atr IS NOT NULL + AND "atrAtEntry" IS NOT NULL GROUP BY atr_range - ORDER BY MIN(atr) + ORDER BY MIN("atrAtEntry") ` const formattedData = atrCorrelation.map(row => ({ @@ -356,7 +356,7 @@ export async function GET() { SELECT COUNT(*) FILTER (WHERE "exitReason" IS NOT NULL) as completed_trades, COUNT(*) FILTER (WHERE "signalQualityScore" IS NOT NULL) as with_quality, - COUNT(*) FILTER (WHERE atr IS NOT NULL) as with_atr, + COUNT(*) FILTER (WHERE "atrAtEntry" IS NOT NULL) as with_atr, COUNT(*) FILTER (WHERE "maxFavorableExcursion" IS NOT NULL) as with_mfe, COUNT(*) FILTER (WHERE "indicatorVersion" = 'v8') as v8_trades, (SELECT COUNT(*) FROM "BlockedSignal" WHERE "blockReason" = 'QUALITY_SCORE_TOO_LOW') as blocked_quality diff --git a/app/page.tsx b/app/page.tsx index c865849..49e1cc9 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -124,6 +124,33 @@ export default function HomePage() {

+ + {/* Analytics Card */} + +
+ +
+
+ 🔬 +
+ +

Analytics

+ +

+ Data-driven optimization analysis with automated SQL insights +

+ +
+ View Analytics + + + +
+
+
{/* Quick Stats */}