|
@@ -164,13 +164,14 @@ class RiskCleanupManager:
|
|
|
|
|
|
if self.notification_manager:
|
|
if self.notification_manager:
|
|
await self.notification_manager.send_generic_notification(
|
|
await self.notification_manager.send_generic_notification(
|
|
- f"""🚨 AUTOMATIC STOP LOSS TRIGGERED!\\n
|
|
|
|
-Token: {token}\\n
|
|
|
|
-Lifecycle ID: {lifecycle_id_str}\\n
|
|
|
|
-Position: {position_side} {abs(contracts):.6f}\\n
|
|
|
|
-Entry Price: ${entry_price:.4f}\\n
|
|
|
|
-Unrealized P&L: ${unrealized_pnl:+.2f} ({roe_percentage:+.2f}% ROE)\\n
|
|
|
|
-Safety Threshold: -{Config.STOP_LOSS_PERCENTAGE}% ROE\\n
|
|
|
|
|
|
+ f"""🚨 AUTOMATIC STOP LOSS TRIGGERED!
|
|
|
|
+
|
|
|
|
+Token: {token}
|
|
|
|
+Lifecycle ID: {lifecycle_id_str}
|
|
|
|
+Position: {position_side} {abs(contracts):.6f}
|
|
|
|
+Entry Price: ${entry_price:.4f}
|
|
|
|
+Unrealized P&L: ${unrealized_pnl:+.2f} ({roe_percentage:+.2f}% ROE)
|
|
|
|
+Safety Threshold: -{Config.STOP_LOSS_PERCENTAGE}% ROE
|
|
Action: Executing emergency exit order..."""
|
|
Action: Executing emergency exit order..."""
|
|
)
|
|
)
|
|
|
|
|
|
@@ -179,25 +180,18 @@ Action: Executing emergency exit order..."""
|
|
if exit_result.get('success'):
|
|
if exit_result.get('success'):
|
|
placed_order_details = exit_result.get('order_placed_details', {})
|
|
placed_order_details = exit_result.get('order_placed_details', {})
|
|
logger.info(f"✅ Emergency exit order placed for {token} (Lifecycle: {lifecycle_id_str}). Order details: {placed_order_details}")
|
|
logger.info(f"✅ Emergency exit order placed for {token} (Lifecycle: {lifecycle_id_str}). Order details: {placed_order_details}")
|
|
- if stats:
|
|
|
|
- cancelled_sl_count = stats.cancel_pending_stop_losses_by_symbol(
|
|
|
|
- symbol=symbol,
|
|
|
|
- new_status='cancelled_auto_exit'
|
|
|
|
- )
|
|
|
|
- if cancelled_sl_count > 0:
|
|
|
|
- logger.info(f"🛑 Cancelled {cancelled_sl_count} pending stop losses for {symbol} (Lifecycle: {lifecycle_id_str}) after automatic exit")
|
|
|
|
|
|
|
|
if self.notification_manager:
|
|
if self.notification_manager:
|
|
await self.notification_manager.send_generic_notification(
|
|
await self.notification_manager.send_generic_notification(
|
|
- f"""✅ <b>Emergency Exit Initiated</b>\\n\\n
|
|
|
|
-📊 <b>Position:</b> {token} {position_side}\\n
|
|
|
|
-🆔 <b>Lifecycle ID:</b> {lifecycle_id_str}\\n
|
|
|
|
-📉 <b>Loss at Trigger:</b> {roe_percentage:+.2f}% ROE (${unrealized_pnl:+.2f})\\n
|
|
|
|
-⚠️ <b>Threshold:</b> -{Config.STOP_LOSS_PERCENTAGE}% ROE\\n
|
|
|
|
-✅ <b>Action:</b> Market exit order placed successfully\\n
|
|
|
|
-🆔 <b>Exit Order ID:</b> {placed_order_details.get('exchange_order_id', 'N/A')}\\n
|
|
|
|
-{f'🛑 <b>Cleanup:</b> Cancelled {cancelled_sl_count} other pending stop losses' if cancelled_sl_count > 0 else ''}
|
|
|
|
-\\n\\n
|
|
|
|
|
|
+ f"""✅ <b>Emergency Exit Initiated</b>
|
|
|
|
+
|
|
|
|
+📊 <b>Position:</b> {token} {position_side}
|
|
|
|
+🆔 <b>Lifecycle ID:</b> {lifecycle_id_str}
|
|
|
|
+📉 <b>Loss at Trigger:</b> {roe_percentage:+.2f}% ROE (${unrealized_pnl:+.2f})
|
|
|
|
+⚠️ <b>Threshold:</b> -{Config.STOP_LOSS_PERCENTAGE}% ROE
|
|
|
|
+✅ <b>Action:</b> Market exit order placed successfully
|
|
|
|
+🆔 <b>Exit Order ID:</b> {placed_order_details.get('exchange_order_id', 'N/A')}
|
|
|
|
+
|
|
🛡️ The system will confirm closure and P&L once the exit order fill is processed."""
|
|
🛡️ The system will confirm closure and P&L once the exit order fill is processed."""
|
|
)
|
|
)
|
|
else:
|
|
else:
|
|
@@ -205,12 +199,14 @@ Action: Executing emergency exit order..."""
|
|
logger.error(f"❌ Failed to execute emergency exit order for {token} (Lifecycle: {lifecycle_id_str}): {error_msg}")
|
|
logger.error(f"❌ Failed to execute emergency exit order for {token} (Lifecycle: {lifecycle_id_str}): {error_msg}")
|
|
if self.notification_manager:
|
|
if self.notification_manager:
|
|
await self.notification_manager.send_generic_notification(
|
|
await self.notification_manager.send_generic_notification(
|
|
- f"""❌ <b>CRITICAL: Emergency Exit Failed!</b>\\n\\n
|
|
|
|
-📊 <b>Position:</b> {token} {position_side}\\n
|
|
|
|
-🆔 <b>Lifecycle ID:</b> {lifecycle_id_str}\\n
|
|
|
|
-📉 <b>Loss:</b> {roe_percentage:+.2f}% ROE\\n
|
|
|
|
-❌ <b>Error Placing Order:</b> {error_msg}\\n\\n
|
|
|
|
-⚠️ <b>MANUAL INTERVENTION REQUIRED</b>\\n
|
|
|
|
|
|
+ f"""❌ <b>CRITICAL: Emergency Exit Failed!</b>
|
|
|
|
+
|
|
|
|
+📊 <b>Position:</b> {token} {position_side}
|
|
|
|
+🆔 <b>Lifecycle ID:</b> {lifecycle_id_str}
|
|
|
|
+📉 <b>Loss:</b> {roe_percentage:+.2f}% ROE
|
|
|
|
+❌ <b>Error Placing Order:</b> {error_msg}
|
|
|
|
+
|
|
|
|
+⚠️ <b>MANUAL INTERVENTION REQUIRED</b>
|
|
Please close this position manually via /exit {token}"""
|
|
Please close this position manually via /exit {token}"""
|
|
)
|
|
)
|
|
except Exception as pos_error:
|
|
except Exception as pos_error:
|