56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
"""Tests for Bollinger Bands mean reversion strategy."""
|
|
|
|
import pytest
|
|
from decimal import Decimal
|
|
from src.strategies.technical.bollinger_mean_reversion import BollingerMeanReversionStrategy
|
|
from src.strategies.base import SignalType
|
|
|
|
|
|
class TestBollingerMeanReversionStrategy:
|
|
"""Tests for BollingerMeanReversionStrategy."""
|
|
|
|
@pytest.fixture
|
|
def strategy(self):
|
|
"""Create Bollinger mean reversion strategy instance."""
|
|
return BollingerMeanReversionStrategy(
|
|
name="test_bollinger_mr",
|
|
parameters={
|
|
'period': 20,
|
|
'std_dev': 2.0,
|
|
'trend_filter': True,
|
|
'trend_ma_period': 50,
|
|
'entry_threshold': 0.95,
|
|
'exit_threshold': 0.5
|
|
}
|
|
)
|
|
|
|
def test_initialization(self, strategy):
|
|
"""Test strategy initialization."""
|
|
assert strategy.period == 20
|
|
assert strategy.std_dev == 2.0
|
|
assert strategy.trend_filter is True
|
|
assert strategy.trend_ma_period == 50
|
|
assert strategy.entry_threshold == 0.95
|
|
assert strategy.exit_threshold == 0.5
|
|
|
|
def test_on_tick_insufficient_data(self, strategy):
|
|
"""Test that strategy returns None with insufficient data."""
|
|
signal = strategy.on_tick(
|
|
symbol="BTC/USD",
|
|
price=Decimal("50000"),
|
|
timeframe="1h",
|
|
data={'volume': 1000}
|
|
)
|
|
assert signal is None
|
|
|
|
def test_position_tracking(self, strategy):
|
|
"""Test position tracking."""
|
|
assert strategy._in_position is False
|
|
assert strategy._entry_price is None
|
|
|
|
def test_strategy_metadata(self, strategy):
|
|
"""Test strategy metadata."""
|
|
assert strategy.name == "test_bollinger_mr"
|
|
assert strategy.enabled is False
|
|
|