From cd6f590742bf770bac48ce17a8dd1dd1a9923544 Mon Sep 17 00:00:00 2001 From: mindesbunister Date: Wed, 19 Nov 2025 21:39:13 +0100 Subject: [PATCH] fix: Correct v8 trade P&L to match Drift UI actual values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Database had inflated P&L from compounding bugs. Corrected to match Drift Protocol's actual TP1+runner P&L values. Corrections: - Trade cmi5p09y: 37.67 → 38.90 (TP1 9.72 + runner 29.18) - Trade cmi5ie3c: 59.35 → 40.09 (TP1 21.67 + runner 18.42) - Trade cmi5a6jm: 19.79 → 13.72 (TP1 1.33 + runner 4.08 + 8.31) v8 total P&L: $46.97 (matches Drift UI exactly) Note: Each trade shows as 2 lines in Drift UI (TP1 + runner close), so 5 trades = 10 lines in trade history. --- CRITICAL_MISSING_TRADES_NOV19.md | 82 ++++++++++++++++++++++++++++++ app/api/withdrawals/stats/route.ts | 17 ++++++- 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 CRITICAL_MISSING_TRADES_NOV19.md diff --git a/CRITICAL_MISSING_TRADES_NOV19.md b/CRITICAL_MISSING_TRADES_NOV19.md new file mode 100644 index 0000000..8449c34 --- /dev/null +++ b/CRITICAL_MISSING_TRADES_NOV19.md @@ -0,0 +1,82 @@ +# CRITICAL: Missing Trades in Database (Nov 19, 2025) + +## Issue +Database shows 5 v8 trades with $71.07 P&L, but Drift UI shows 10 trades with $46.97 P&L. + +**5 trades are MISSING from the database despite being executed on Drift.** + +## Evidence + +### Drift UI (TRUTH - 10 trades in last 19 hours): +1. $31.41 profit (6h ago) +2. $22.78 profit (6h ago) +3. $9.72 profit (12h ago) +4. $29.18 profit (12h ago) +5. $18.42 profit (14h ago) +6. $21.67 profit (15h ago) +7. $1.33 profit (19h ago) +8. $4.08 profit (19h ago) +9. $8.31 profit (19h ago) +10. **-$99.93 loss** (19h ago) + +**Total: $46.97** + +### Database (5 trades recorded): +1. $54.19 (13:56) - v8, quality 85 +2. $37.67 (07:47) - v8, quality 110 +3. $59.35 (05:56) - v8, quality 105 +4. $19.79 (01:24) - v8, quality 90 +5. -$99.93 (00:45) - v8, quality 80 + +**Total: $71.07** + +## Analysis + +**Missing trades (not in database but in Drift):** +- Approximately 5 trades with smaller P&L values +- Likely the 9.72, 29.18, 18.42, 21.67, 1.33, 4.08, 8.31 trades +- All appear to be profitable small trades + +**Database P&L values don't match Drift:** +- Trade showing $54.19 in DB might be $31.41 in Drift +- Trade showing $37.67 in DB might be $22.78 in Drift +- Discrepancies suggest BOTH missing trades AND incorrect P&L recording + +## Root Causes to Investigate + +1. **Database save failures:** Execute endpoint may be failing to save trades +2. **Position Manager not tracking:** Trades executing but PM not adding them +3. **External closures:** Some trades closed by on-chain orders without PM detection +4. **Container restarts:** Trades executed during downtime not recovered +5. **n8n workflow failures:** Some signals reaching Drift but not saving to DB + +## Impact + +- **Data integrity compromised:** Can't trust database for analytics +- **Performance metrics wrong:** Showing $71 when actual is $47 +- **Missing trade history:** Can't analyze what trades were executed +- **Withdrawal calculations affected:** Total P&L used for withdrawal decisions + +## Immediate Actions Required + +1. Query Drift for complete trade history (last 24 hours) +2. Identify which trades are missing from database +3. Check logs for database save failures during those times +4. Check if trades were manual (Telegram) or automated (TradingView) +5. Verify Position Manager was running during those times +6. Check for container restarts that might explain gaps + +## Long-term Fix + +Need to implement **trade reconciliation system**: +- Periodic job queries Drift for all trades +- Compares with database records +- Alerts if trades found on Drift but not in DB +- Backfills missing trades automatically +- Added to Common Pitfalls in copilot instructions + +## Date +November 19, 2025 - 15:00 CET + +## Status +🔴 CRITICAL - Investigating root cause diff --git a/app/api/withdrawals/stats/route.ts b/app/api/withdrawals/stats/route.ts index a9a87ae..bd56570 100644 --- a/app/api/withdrawals/stats/route.ts +++ b/app/api/withdrawals/stats/route.ts @@ -29,17 +29,30 @@ export async function GET() { const totalInvested = cumulativeDeposits // Use actual deposits as "invested" - // Calculate total P&L from database + // Calculate total P&L from database (v8 trades only, exclude archived) const trades = await prisma.trade.findMany({ where: { exitReason: { not: null }, + status: { not: 'archived' }, // Exclude pre-v8 trades }, select: { realizedPnL: true, + entryPrice: true, + exitPrice: true, + positionSizeUSD: true, + direction: true, }, }) - const totalPnL = trades.reduce((sum, trade) => sum + (trade.realizedPnL || 0), 0) + // Recalculate P&L from entry/exit prices (fixes compounding bugs) + const totalPnL = trades.reduce((sum, trade) => { + const correctPnL = trade.positionSizeUSD * ( + trade.direction === 'long' + ? (trade.exitPrice - trade.entryPrice) / trade.entryPrice + : (trade.entryPrice - trade.exitPrice) / trade.entryPrice + ) + return sum + correctPnL + }, 0) // Get total withdrawn from .env const totalWithdrawn = parseFloat(process.env.TOTAL_WITHDRAWN || '0')