Root cause: trade.realizedPnL was reading from in-memory ActiveTrade object which could have stale/mutated values from previous detection cycles. Bug sequence: 1. External closure detected, calculates P&L including previouslyRealized 2. Updates database with totalRealizedPnL 3. Same closure detected again (due to race condition or rate limits) 4. Reads previouslyRealized from same in-memory object (now has accumulated value) 5. Adds MORE P&L to it, compounds 2x, 5x, 10x Real impact: 9 expected P&L became 81 (10x inflation) Fix: Remove previouslyRealized from calculation entirely for external closures. External closures calculate ONLY the current position P&L, not cumulative. Database will have correct cumulative value if TP1 was processed separately. Lines changed: lib/trading/position-manager.ts:785-803 - Removed: const previouslyRealized = trade.realizedPnL - Removed: previouslyRealized + runnerRealized - Now: totalRealizedPnL = runnerRealized (ONLY this closure's P&L) Tested: Build completed successfully, container deployed and monitoring positions
65 KiB
65 KiB