File size: 1,692 Bytes
590a501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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()