Files
crypto_news/tests/test_risk_manager.py

71 lines
2.1 KiB
Python
Raw Permalink Normal View History

2026-03-20 07:49:42 +09:00
"""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%