diff --git a/src/multi_swarm_core/multi_swarm_core/config.py b/src/multi_swarm_core/multi_swarm_core/config.py index 0ea0ca2..2c20e0f 100644 --- a/src/multi_swarm_core/multi_swarm_core/config.py +++ b/src/multi_swarm_core/multi_swarm_core/config.py @@ -6,7 +6,7 @@ in the project root. Required secrets are validated at instantiation time. from pathlib import Path -from pydantic import Field, SecretStr +from pydantic import AliasChoices, Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict @@ -35,7 +35,24 @@ class Settings(BaseSettings): run_name: str = "phase1-spike-001" data_dir: Path = Field(default=Path("./data")) series_dir: Path = Field(default=Path("./series")) - db_path: Path = Field(default=Path("./runs.db")) + + # GA core DB (tabelle universali: runs, generations, genomes, evaluations, ...) + # Alias DB_PATH legacy mantenuto per backcompat (deprecato, rimuovere nei prossimi cicli). + ga_db_path: Path = Field( + default=Path("./state/runs.db"), + validation_alias=AliasChoices("GA_DB_PATH", "DB_PATH"), + ) + + # DB per la strategia crypto (tabelle paper_trading_*, isolato dal core) + strategy_crypto_db_path: Path = Field( + default=Path("./state/strategy_crypto.db"), + validation_alias="STRATEGY_CRYPTO_DB_PATH", + ) + + @property + def db_path(self) -> Path: + """Backcompat alias: legge ga_db_path. Deprecato — usare ga_db_path.""" + return self.ga_db_path def load_settings() -> Settings: diff --git a/src/multi_swarm_core/multi_swarm_core/paper_trading/__init__.py b/src/multi_swarm_core/multi_swarm_core/paper_trading/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/strategy_crypto/strategy_crypto/backend/__init__.py b/src/strategy_crypto/strategy_crypto/backend/__init__.py index e69de29..3d071d1 100644 --- a/src/strategy_crypto/strategy_crypto/backend/__init__.py +++ b/src/strategy_crypto/strategy_crypto/backend/__init__.py @@ -0,0 +1,23 @@ +"""Backend paper-trading per la strategia crypto. + +Espone le classi principali per import ergonomici in scripts/runner: + + from strategy_crypto.backend import PaperExecutor, Portfolio, PaperRepository + +Per i tipi interni (TickResult, OpenPosition, Trade) importare dal sotto-modulo. +""" + +from .executor import PaperExecutor, TickResult +from .persistence import PaperRepository +from .portfolio import OpenPosition, Portfolio +from .schema import PAPER_SCHEMA_SQL, init_schema + +__all__ = [ + "PAPER_SCHEMA_SQL", + "OpenPosition", + "PaperExecutor", + "PaperRepository", + "Portfolio", + "TickResult", + "init_schema", +] diff --git a/src/multi_swarm_core/multi_swarm_core/paper_trading/executor.py b/src/strategy_crypto/strategy_crypto/backend/executor.py similarity index 94% rename from src/multi_swarm_core/multi_swarm_core/paper_trading/executor.py rename to src/strategy_crypto/strategy_crypto/backend/executor.py index dbbd32c..524f26e 100644 --- a/src/multi_swarm_core/multi_swarm_core/paper_trading/executor.py +++ b/src/strategy_crypto/strategy_crypto/backend/executor.py @@ -20,9 +20,10 @@ from pathlib import Path import pandas as pd # type: ignore[import-untyped] -from ..backtest.orders import Side, Trade -from ..protocol.compiler import compile_strategy -from ..protocol.parser import parse_strategy +from multi_swarm_core.backtest.orders import Side, Trade +from multi_swarm_core.protocol.compiler import compile_strategy +from multi_swarm_core.protocol.parser import parse_strategy + from .portfolio import OpenPosition, Portfolio diff --git a/src/multi_swarm_core/multi_swarm_core/paper_trading/persistence.py b/src/strategy_crypto/strategy_crypto/backend/persistence.py similarity index 88% rename from src/multi_swarm_core/multi_swarm_core/paper_trading/persistence.py rename to src/strategy_crypto/strategy_crypto/backend/persistence.py index b58c620..7d08987 100644 --- a/src/multi_swarm_core/multi_swarm_core/paper_trading/persistence.py +++ b/src/strategy_crypto/strategy_crypto/backend/persistence.py @@ -1,5 +1,9 @@ -"""Persistenza paper-trading: usa lo stesso ``runs.db`` con tabelle dedicate -``paper_trading_*`` (vedi :mod:`multi_swarm_core.persistence.schema`). +"""Persistenza paper-trading: scrive su un DB dedicato (state/strategy_crypto.db) +con le tabelle ``paper_trading_*`` definite localmente in :mod:`.schema`. + +Il DB e' isolato dal ``runs.db`` del core GA: nessun naming conflict con +future strategie (state/strategy_.db), nessuna contention di lock +fra writer GA e writer paper. """ from __future__ import annotations @@ -13,12 +17,17 @@ from typing import Any from .executor import TickResult from .portfolio import Portfolio +from .schema import init_schema as _init_paper_schema class PaperRepository: def __init__(self, db_path: Path | str): self.db_path = Path(db_path) + def init_schema(self) -> None: + """Crea (se mancanti) le tabelle paper_trading_* su ``self.db_path``.""" + _init_paper_schema(self.db_path) + def _conn(self) -> sqlite3.Connection: conn = sqlite3.connect(self.db_path, isolation_level=None) conn.row_factory = sqlite3.Row diff --git a/src/multi_swarm_core/multi_swarm_core/paper_trading/portfolio.py b/src/strategy_crypto/strategy_crypto/backend/portfolio.py similarity index 98% rename from src/multi_swarm_core/multi_swarm_core/paper_trading/portfolio.py rename to src/strategy_crypto/strategy_crypto/backend/portfolio.py index 4b99bfa..8945958 100644 --- a/src/multi_swarm_core/multi_swarm_core/paper_trading/portfolio.py +++ b/src/strategy_crypto/strategy_crypto/backend/portfolio.py @@ -17,7 +17,7 @@ from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime -from ..backtest.orders import Side, Trade +from multi_swarm_core.backtest.orders import Side, Trade @dataclass(frozen=True)