Hybrid passive+active approach per user specification:
- 30s: Passive check only (give initial placement time to propagate)
- 60s: Check + attemptSLPlacement() if missing (recovery attempt #1)
- 90s: Check + attemptSLPlacement() if missing (recovery attempt #2)
- If both attempts fail: haltTradingAndClosePosition()
New function: attemptSLPlacement(tradeId, symbol, marketIndex)
- Loads trade from database (positionSizeUSD, entryPrice, stopLossPrice, etc.)
- Calls placeExitOrders() with tp1SizePercent=0, tp2SizePercent=0 (SL-only)
- Updates database with SL signatures if successful
- Returns true on success, false on failure
Modified: verifySLWithRetries() with conditional active recovery
- Attempt 1 (30s): Passive verification only
- Attempt 2 (60s): Verification + active placement if missing
- Attempt 3 (90s): Verification + active placement if missing
- Emergency: Halt + close if all attempts exhausted
Benefits:
- Maximizes trade survival by attempting recovery before shutdown
- Two recovery chances reduce false positive emergency shutdowns
- 30s passive first gives initial placement reasonable propagation time
User requirement: '30sec after position was opened it shall only check.
after 60s and 90s check if it does not exist it shall try to place the SL.
if both attempts on 60 and 90 fail then stop trading and close position'
Deployed: Dec 15, 2025 13:30 UTC
Container: trading-bot-v4 (image sha256:4eaef891...)
TypeScript compilation: ✅ Clean (no errors)
Database schema fields: positionSizeUSD, takeProfit1Price, takeProfit2Price