-
🔬 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() {