diff options
Diffstat (limited to 'tests/edge_cases')
| -rw-r--r-- | tests/edge_cases/test_empty_data.py | 5 | ||||
| -rw-r--r-- | tests/edge_cases/test_extreme_values.py | 13 | ||||
| -rw-r--r-- | tests/edge_cases/test_strategy_reset.py | 29 | ||||
| -rw-r--r-- | tests/edge_cases/test_zero_volume.py | 11 |
4 files changed, 31 insertions, 27 deletions
diff --git a/tests/edge_cases/test_empty_data.py b/tests/edge_cases/test_empty_data.py index bfefc95..876a640 100644 --- a/tests/edge_cases/test_empty_data.py +++ b/tests/edge_cases/test_empty_data.py @@ -12,13 +12,14 @@ sys.path.insert( 0, str(Path(__file__).resolve().parents[2] / "services" / "portfolio-manager" / "src") ) -from shared.models import Signal, OrderSide from backtester.engine import BacktestEngine from backtester.metrics import compute_detailed_metrics -from portfolio_manager.portfolio import PortfolioTracker from order_executor.risk_manager import RiskManager +from portfolio_manager.portfolio import PortfolioTracker from strategies.rsi_strategy import RsiStrategy +from shared.models import OrderSide, Signal + class TestBacktestEngineEmptyCandles: """BacktestEngine.run([]) should return valid result with 0 trades.""" diff --git a/tests/edge_cases/test_extreme_values.py b/tests/edge_cases/test_extreme_values.py index b375d5e..8ec3b77 100644 --- a/tests/edge_cases/test_extreme_values.py +++ b/tests/edge_cases/test_extreme_values.py @@ -1,7 +1,7 @@ """Tests for extreme value edge cases.""" import sys -from datetime import datetime, timezone +from datetime import UTC, datetime from decimal import Decimal from pathlib import Path @@ -9,19 +9,20 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "strat sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "backtester" / "src")) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "order-executor" / "src")) -from shared.models import Candle, Signal, OrderSide -from strategies.rsi_strategy import RsiStrategy -from strategies.vwap_strategy import VwapStrategy -from strategies.bollinger_strategy import BollingerStrategy from backtester.engine import BacktestEngine from backtester.simulator import OrderSimulator from order_executor.risk_manager import RiskManager +from strategies.bollinger_strategy import BollingerStrategy +from strategies.rsi_strategy import RsiStrategy +from strategies.vwap_strategy import VwapStrategy + +from shared.models import Candle, OrderSide, Signal def _candle(close: str, volume: str = "1000", idx: int = 0) -> Candle: from datetime import timedelta - base = datetime(2025, 1, 1, tzinfo=timezone.utc) + base = datetime(2025, 1, 1, tzinfo=UTC) return Candle( symbol="AAPL", timeframe="1h", diff --git a/tests/edge_cases/test_strategy_reset.py b/tests/edge_cases/test_strategy_reset.py index 6e9b956..13ed4da 100644 --- a/tests/edge_cases/test_strategy_reset.py +++ b/tests/edge_cases/test_strategy_reset.py @@ -1,21 +1,22 @@ """Tests that strategy reset() properly clears internal state.""" import sys -from datetime import datetime, timezone +from datetime import UTC, datetime from decimal import Decimal from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "strategy-engine")) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "backtester" / "src")) -from shared.models import Candle -from strategies.rsi_strategy import RsiStrategy -from strategies.grid_strategy import GridStrategy -from strategies.macd_strategy import MacdStrategy from strategies.bollinger_strategy import BollingerStrategy from strategies.ema_crossover_strategy import EmaCrossoverStrategy -from strategies.vwap_strategy import VwapStrategy +from strategies.grid_strategy import GridStrategy +from strategies.macd_strategy import MacdStrategy +from strategies.rsi_strategy import RsiStrategy from strategies.volume_profile_strategy import VolumeProfileStrategy +from strategies.vwap_strategy import VwapStrategy + +from shared.models import Candle def _make_candles(count: int, base_price: float = 100.0) -> list[Candle]: @@ -28,7 +29,7 @@ def _make_candles(count: int, base_price: float = 100.0) -> list[Candle]: Candle( symbol="AAPL", timeframe="1h", - open_time=datetime(2025, 1, 1, i % 24, tzinfo=timezone.utc), + open_time=datetime(2025, 1, 1, i % 24, tzinfo=UTC), open=Decimal(str(price)), high=Decimal(str(price + 1)), low=Decimal(str(price - 1)), @@ -57,7 +58,7 @@ class TestRsiReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -71,7 +72,7 @@ class TestGridReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -84,7 +85,7 @@ class TestMacdReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -97,7 +98,7 @@ class TestBollingerReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -110,7 +111,7 @@ class TestEmaCrossoverReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -123,7 +124,7 @@ class TestVwapReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price @@ -136,6 +137,6 @@ class TestVolumeProfileReset: strategy.reset() signals2 = _collect_signals(strategy, candles) assert len(signals1) == len(signals2) - for s1, s2 in zip(signals1, signals2): + for s1, s2 in zip(signals1, signals2, strict=True): assert s1.side == s2.side assert s1.price == s2.price diff --git a/tests/edge_cases/test_zero_volume.py b/tests/edge_cases/test_zero_volume.py index ba2c133..df247cc 100644 --- a/tests/edge_cases/test_zero_volume.py +++ b/tests/edge_cases/test_zero_volume.py @@ -1,21 +1,22 @@ """Tests for strategies handling zero-volume candles gracefully.""" import sys -from datetime import datetime, timezone +from datetime import UTC, datetime from decimal import Decimal from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "strategy-engine")) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "services" / "backtester" / "src")) -from shared.models import Candle -from strategies.vwap_strategy import VwapStrategy -from strategies.volume_profile_strategy import VolumeProfileStrategy from strategies.rsi_strategy import RsiStrategy +from strategies.volume_profile_strategy import VolumeProfileStrategy +from strategies.vwap_strategy import VwapStrategy + +from shared.models import Candle def _candle(close: str, volume: str = "0", idx: int = 0) -> Candle: - base = datetime(2025, 1, 1, tzinfo=timezone.utc) + base = datetime(2025, 1, 1, tzinfo=UTC) from datetime import timedelta return Candle( |
