diff --git a/lib/startup/init-position-manager.ts b/lib/startup/init-position-manager.ts index d5d32a8..f7a82b1 100644 --- a/lib/startup/init-position-manager.ts +++ b/lib/startup/init-position-manager.ts @@ -120,9 +120,14 @@ async function validateOpenTrades() { // CRITICAL: If DB says closed but Drift shows open, restore tracking! if (trade.exitReason !== null) { console.log(`🔴 CRITICAL: ${trade.symbol} marked as CLOSED in DB but still OPEN on Drift!`) + console.log(` DB entry: $${trade.entryPrice.toFixed(2)} | Drift entry: $${position.entryPrice.toFixed(2)}`) console.log(` DB exit: ${trade.exitReason} at ${trade.exitTime?.toISOString()}`) console.log(` Drift: ${position.size} ${trade.symbol} ${driftDirection} @ $${position.entryPrice.toFixed(2)}`) - console.log(` 🔄 Reopening trade in DB to restore Position Manager tracking...`) + console.log(` 🔄 Reopening trade and correcting entry price to match Drift...`) + + // Calculate position size in USD using Drift's entry price + const currentPrice = await driftService.getOraclePrice(marketConfig.driftMarketIndex) + const positionSizeUSD = position.size * currentPrice await prisma.trade.update({ where: { id: trade.id }, @@ -131,11 +136,13 @@ async function validateOpenTrades() { exitReason: null, exitTime: null, exitPrice: null, + entryPrice: position.entryPrice, // CRITICAL: Use Drift's actual entry price, not DB value + positionSizeUSD: positionSizeUSD, // Update to current size (may be runner after TP1) // Keep original realizedPnL from partial closes if any } }) - console.log(` ✅ Trade restored - Position Manager will now monitor it`) + console.log(` ✅ Trade restored with corrected entry: $${position.entryPrice.toFixed(2)} (was $${trade.entryPrice.toFixed(2)})`) } else { console.log(`✅ ${trade.symbol} ${trade.direction}: Position verified on Drift`) }