|
@@ -101,45 +101,42 @@ class RiskManager:
|
|
|
logger.warning(f"Hard exit triggered for {symbol}: ROE {roe:.2%} < {self.hard_exit_roe:.2%}")
|
|
|
|
|
|
# Place market order to close position
|
|
|
- order_result = await self.hl_client.place_order(
|
|
|
- symbol=symbol,
|
|
|
+ full_symbol = f"{symbol}/USDC:USDC"
|
|
|
+ order_result, error_msg = self.hl_client.place_market_order(
|
|
|
+ symbol=full_symbol,
|
|
|
side=side,
|
|
|
- size=order_size,
|
|
|
- order_type='market',
|
|
|
- reduce_only=True
|
|
|
+ amount=order_size
|
|
|
)
|
|
|
|
|
|
- if order_result and 'response' in order_result:
|
|
|
- response = order_result['response']
|
|
|
- if response.get('type') == 'order':
|
|
|
-
|
|
|
- # Send alert notification
|
|
|
- message = (
|
|
|
- f"🚨 HARD EXIT EXECUTED\n"
|
|
|
- f"Token: {symbol}\n"
|
|
|
- f"ROE: {roe:.2%}\n"
|
|
|
- f"Threshold: {self.hard_exit_roe:.2%}\n"
|
|
|
- f"Size: {order_size:.4f}\n"
|
|
|
- f"Est. PnL: ${unrealized_pnl:.3f}\n"
|
|
|
- f"Risk management action taken!"
|
|
|
- )
|
|
|
-
|
|
|
- await self.notification_manager.send_notification(message)
|
|
|
- logger.info(f"Hard exit executed for {symbol}: {order_size} @ ROE {roe:.2%}")
|
|
|
-
|
|
|
- else:
|
|
|
- logger.error(f"Failed to execute hard exit for {symbol}: {response}")
|
|
|
-
|
|
|
- # Send failure notification
|
|
|
- error_message = (
|
|
|
- f"❌ HARD EXIT FAILED\n"
|
|
|
- f"Token: {symbol}\n"
|
|
|
- f"ROE: {roe:.2%}\n"
|
|
|
- f"Could not place market order!\n"
|
|
|
- f"Manual intervention required!"
|
|
|
- )
|
|
|
- await self.notification_manager.send_notification(error_message)
|
|
|
-
|
|
|
+ if order_result and not error_msg:
|
|
|
+ # Send alert notification
|
|
|
+ message = (
|
|
|
+ f"🚨 HARD EXIT EXECUTED\n"
|
|
|
+ f"Token: {symbol}\n"
|
|
|
+ f"ROE: {roe:.2%}\n"
|
|
|
+ f"Threshold: {self.hard_exit_roe:.2%}\n"
|
|
|
+ f"Size: {order_size:.4f}\n"
|
|
|
+ f"Est. PnL: ${unrealized_pnl:.3f}\n"
|
|
|
+ f"Risk management action taken!"
|
|
|
+ )
|
|
|
+
|
|
|
+ await self.notification_manager.send_generic_notification(message)
|
|
|
+ logger.info(f"Hard exit executed for {symbol}: {order_size} @ ROE {roe:.2%}")
|
|
|
+
|
|
|
+ else:
|
|
|
+ logger.error(f"Failed to execute hard exit for {symbol}: {error_msg}")
|
|
|
+
|
|
|
+ # Send failure notification
|
|
|
+ error_message = (
|
|
|
+ f"❌ HARD EXIT FAILED\n"
|
|
|
+ f"Token: {symbol}\n"
|
|
|
+ f"ROE: {roe:.2%}\n"
|
|
|
+ f"Could not place market order!\n"
|
|
|
+ f"Error: {error_msg}\n"
|
|
|
+ f"Manual intervention required!"
|
|
|
+ )
|
|
|
+ await self.notification_manager.send_generic_notification(error_message)
|
|
|
+
|
|
|
except Exception as e:
|
|
|
logger.error(f"Error executing hard exit for {position['symbol']}: {e}")
|
|
|
|
|
@@ -151,7 +148,7 @@ class RiskManager:
|
|
|
f"Error: {str(e)}\n"
|
|
|
f"Manual intervention required!"
|
|
|
)
|
|
|
- await self.notification_manager.send_notification(error_message)
|
|
|
+ await self.notification_manager.send_generic_notification(error_message)
|
|
|
|
|
|
async def get_risk_status(self) -> Dict:
|
|
|
"""Get current risk status"""
|