diff options
6 files changed, 32 insertions, 1 deletions
diff --git a/services/strategy-engine/src/strategy_engine/plugin_loader.py b/services/strategy-engine/src/strategy_engine/plugin_loader.py index 719dc6d..f99b670 100644 --- a/services/strategy-engine/src/strategy_engine/plugin_loader.py +++ b/services/strategy-engine/src/strategy_engine/plugin_loader.py @@ -3,12 +3,15 @@ import importlib.util import sys from pathlib import Path +import yaml + from strategies.base import BaseStrategy def load_strategies(strategies_dir: Path) -> list[BaseStrategy]: """Scan strategies_dir for *.py files and load all BaseStrategy subclasses.""" loaded: list[BaseStrategy] = [] + config_dir = strategies_dir / "config" for path in sorted(strategies_dir.glob("*.py")): # Skip dunder files and base @@ -31,6 +34,13 @@ def load_strategies(strategies_dir: Path) -> list[BaseStrategy]: and issubclass(obj, BaseStrategy) and obj is not BaseStrategy ): - loaded.append(obj()) + instance = obj() + yaml_path = config_dir / f"{path.stem}.yaml" + if yaml_path.exists(): + with open(yaml_path) as f: + params = yaml.safe_load(f) + if params: + instance.configure(params) + loaded.append(instance) return loaded diff --git a/services/strategy-engine/strategies/base.py b/services/strategy-engine/strategies/base.py index 06101d0..fdf49ed 100644 --- a/services/strategy-engine/strategies/base.py +++ b/services/strategy-engine/strategies/base.py @@ -5,6 +5,11 @@ from shared.models import Candle, Signal class BaseStrategy(ABC): name: str = "base" + @property + @abstractmethod + def warmup_period(self) -> int: + pass + @abstractmethod def on_candle(self, candle: Candle) -> Signal | None: pass diff --git a/services/strategy-engine/strategies/config/grid_strategy.yaml b/services/strategy-engine/strategies/config/grid_strategy.yaml new file mode 100644 index 0000000..607f3df --- /dev/null +++ b/services/strategy-engine/strategies/config/grid_strategy.yaml @@ -0,0 +1,4 @@ +lower_price: 60000 +upper_price: 70000 +grid_count: 5 +quantity: "0.01" diff --git a/services/strategy-engine/strategies/config/rsi_strategy.yaml b/services/strategy-engine/strategies/config/rsi_strategy.yaml new file mode 100644 index 0000000..8b287a1 --- /dev/null +++ b/services/strategy-engine/strategies/config/rsi_strategy.yaml @@ -0,0 +1,4 @@ +period: 14 +oversold: 30 +overbought: 70 +quantity: "0.01" diff --git a/services/strategy-engine/strategies/grid_strategy.py b/services/strategy-engine/strategies/grid_strategy.py index f669f09..78e2703 100644 --- a/services/strategy-engine/strategies/grid_strategy.py +++ b/services/strategy-engine/strategies/grid_strategy.py @@ -18,6 +18,10 @@ class GridStrategy(BaseStrategy): self._grid_levels: list[float] = [] self._last_zone: Optional[int] = None + @property + def warmup_period(self) -> int: + return 2 + def configure(self, params: dict) -> None: self._lower_price = float(params["lower_price"]) self._upper_price = float(params["upper_price"]) diff --git a/services/strategy-engine/strategies/rsi_strategy.py b/services/strategy-engine/strategies/rsi_strategy.py index aebbafc..c37957d 100644 --- a/services/strategy-engine/strategies/rsi_strategy.py +++ b/services/strategy-engine/strategies/rsi_strategy.py @@ -34,6 +34,10 @@ class RsiStrategy(BaseStrategy): self._overbought: float = 70.0 self._quantity: Decimal = Decimal("0.01") + @property + def warmup_period(self) -> int: + return self._period + 1 + def configure(self, params: dict) -> None: self._period = int(params.get("period", 14)) self._oversold = float(params.get("oversold", 30)) |
