| from app.core.config import settings |
| from app.models.schemas import OrderRequest |
| from app.services.order_manager import order_manager |
|
|
|
|
| class RiskManager: |
| def __init__(self): |
| self.max_position_size = settings.MAX_POSITION_SIZE |
| self.risk_limit_percent = settings.RISK_LIMIT_PERCENT |
|
|
| def check_order(self, req: OrderRequest) -> tuple[bool, str]: |
| if req.quantity > self.max_position_size: |
| return False, f"Order quantity {req.quantity} exceeds max position size {self.max_position_size}" |
|
|
| account = order_manager.account |
| if account.available_balance <= 0: |
| return False, "Insufficient available balance" |
|
|
| max_risk = account.total_balance * (self.risk_limit_percent / 100) |
| if abs(account.unrealized_pnl) > max_risk: |
| return False, f"Unrealized PnL ({account.unrealized_pnl}) exceeds risk limit ({max_risk})" |
|
|
| return True, "OK" |
|
|
| def get_risk_metrics(self) -> dict: |
| account = order_manager.account |
| max_risk = account.total_balance * (self.risk_limit_percent / 100) |
| return { |
| "total_balance": account.total_balance, |
| "available_balance": account.available_balance, |
| "used_margin": account.used_margin, |
| "unrealized_pnl": account.unrealized_pnl, |
| "realized_pnl": account.realized_pnl, |
| "risk_limit": max_risk, |
| "risk_usage_percent": round( |
| abs(account.unrealized_pnl) / max_risk * 100 if max_risk else 0, 2 |
| ), |
| "position_count": len(account.positions), |
| "max_position_size": self.max_position_size, |
| } |
|
|
|
|
| risk_manager = RiskManager() |
|
|