#!/usr/bin/env python3 """ Unit tests for Apex Trading Engine and Risk Guardrails. """ import unittest from pathlib import Path import sys BASE_DIR = Path(__file__).resolve().parent if str(BASE_DIR / "src") not in sys.path: sys.path.insert(0, str(BASE_DIR / "src")) from engine.trader import ApexEngine from risk.risk_guard import ApexRiskGuard from strategies.momentum import MomentumStrategy class TestApexTrading(unittest.TestCase): def setUp(self): self.config_path = str(BASE_DIR / "config" / "trading.config.json") self.engine = ApexEngine(self.config_path) def test_risk_guard_limits(self): guard = self.engine.risk_guard # Normal order passes normal_order = {"symbol": "BTC/USDT", "risk_percent": 0.3} approved, reason = guard.validate_order(normal_order, current_drawdown=0.5, open_position_count=1) self.assertTrue(approved) self.assertEqual(reason, "APPROVED") # Exceeding single trade risk risky_order = {"symbol": "BTC/USDT", "risk_percent": 0.8} approved, reason = guard.validate_order(risky_order, current_drawdown=0.5, open_position_count=1) self.assertFalse(approved) self.assertIn("exceeds limit", reason) # Exceeding max drawdown trips circuit breaker approved, reason = guard.validate_order(normal_order, current_drawdown=1.6, open_position_count=1) self.assertFalse(approved) self.assertIn("CIRCUIT BREAKER", reason) self.assertTrue(guard.circuit_breaker_active) def test_engine_process_tick(self): # 25 prices trending sharply upwards prices = [100.0 + (i * 1.5) for i in range(25)] volume = [1000.0] * 25 result = self.engine.process_tick("SOL/USDT", prices, volume) self.assertEqual(result.get("status"), "EXECUTED") self.assertEqual(result.get("action"), "BUY") if __name__ == "__main__": unittest.main()