"""Tests for the risk management engine.""" import pytest from risk.risk_manager import RiskManager class TestRiskManager: """Tests for RiskManager.""" def setup_method(self): self.rm = RiskManager( max_risk_per_trade=0.02, max_daily_loss=0.05, max_concurrent_positions=3, max_leverage=3, max_drawdown=0.15, ) def test_calculate_position_size(self): size = self.rm.calculate_position_size( balance=1000, entry_price=50000, stop_loss=49000, risk_pct=0.02 ) # risk = 1000 * 0.02 = 20, price_risk = 1000 # size = 20 / 1000 = 0.02 assert size == 0.02 def test_position_size_zero_risk(self): size = self.rm.calculate_position_size( balance=1000, entry_price=50000, stop_loss=50000 ) assert size == 0.0 def test_approve_trade_success(self): approval = self.rm.approve_trade( entry_price=50000, stop_loss=49000, balance=1000 ) assert approval.approved assert approval.position_size > 0 def test_approve_trade_max_positions(self): for _ in range(3): self.rm.on_position_opened() approval = self.rm.approve_trade( entry_price=50000, stop_loss=49000, balance=1000 ) assert not approval.approved assert "concurrent" in approval.reason.lower() def test_emergency_stop(self): self.rm.emergency_stop() assert self.rm.is_stopped approval = self.rm.approve_trade( entry_price=50000, stop_loss=49000, balance=1000 ) assert not approval.approved def test_reset_emergency(self): self.rm.emergency_stop() self.rm.reset_emergency() assert not self.rm.is_stopped def test_daily_pnl_tracking(self): self.rm.update_daily_pnl(50) self.rm.update_daily_pnl(-30) assert self.rm.get_daily_pnl() == 20 def test_drawdown_check(self): self.rm._peak_equity = 1000 assert not self.rm.check_drawdown(900) # 10% < 15% assert self.rm.check_drawdown(800) # 20% >= 15%