**Root Cause:** Position Manager didn't detect when on-chain TP/SL orders closed positions externally, causing endless error loops and stale position data. **Issues Fixed:** 1. Position Manager now checks if on-chain position still exists before attempting to close 2. Detects external closures (by on-chain orders) and updates database accordingly 3. Determines likely exit reason based on price vs TP/SL levels 4. Automatically cancels leftover orders when position detected as closed 5. Analytics now properly shows stopped-out trades **Technical Changes:** - Added position existence check at start of checkTradeConditions() - Calls DriftService.getPosition() to verify on-chain state - Updates database with exitPrice, exitReason, realizedPnL when external closure detected - Removes trade from monitoring after external closure - Handles size mismatches for partial closes (TP1 hit externally) **Database Fix:** - Manually closed orphaned trade (stopped out 9 hours ago but still marked 'open') - Calculated and set realizedPnL = -$12.00 for stopped-out SHORT position - Analytics now shows 3 total trades instead of missing the SL exit **Testing:** - Bot starts cleanly with no error loops - Position monitoring active with 0 trades (as expected) - Analytics correctly shows stopped-out trade in statistics
12 KiB
12 KiB