From b02be648315ebc05fcf8949a476eeb95f893bd1e Mon Sep 17 00:00:00 2001 From: Adriano Dal Pastro Date: Fri, 15 May 2026 17:54:31 +0000 Subject: [PATCH] =?UTF-8?q?refactor(paper=5Ftrading):=20move=20multi=5Fswa?= =?UTF-8?q?rm=5Fcore/paper=5Ftrading=20=E2=86=92=20strategy=5Fcrypto/backe?= =?UTF-8?q?nd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - git mv executor.py, portfolio.py, persistence.py al backend strategy_crypto - Cancellato src/multi_swarm_core/multi_swarm_core/paper_trading/ - Patch import: from ..backtest/protocol → from multi_swarm_core.backtest/protocol - persistence.py: * usa schema locale strategy_crypto.backend.schema (no piu' core) * docstring aggiornata: DB dedicato state/strategy_crypto.db isolato dal core * PaperRepository.init_schema() crea le tabelle paper_trading_* - backend/__init__.py: re-export pubblico (PaperExecutor, Portfolio, PaperRepository, ...) - config.py: * NEW: ga_db_path (alias DB_PATH legacy + GA_DB_PATH preferito) * NEW: strategy_crypto_db_path (STRATEGY_CRYPTO_DB_PATH) * db_path conserva come property proxy di ga_db_path per backcompat - Test: import in venv workspace OK; load_settings() resolve entrambi i path Co-Authored-By: Claude Opus 4.7 (1M context) --- .../multi_swarm_core/config.py | 21 +++++++++++++++-- .../paper_trading/__init__.py | 0 .../strategy_crypto/backend/__init__.py | 23 +++++++++++++++++++ .../strategy_crypto/backend}/executor.py | 7 +++--- .../strategy_crypto/backend}/persistence.py | 13 +++++++++-- .../strategy_crypto/backend}/portfolio.py | 2 +- 6 files changed, 58 insertions(+), 8 deletions(-) delete mode 100644 src/multi_swarm_core/multi_swarm_core/paper_trading/__init__.py rename src/{multi_swarm_core/multi_swarm_core/paper_trading => strategy_crypto/strategy_crypto/backend}/executor.py (94%) rename src/{multi_swarm_core/multi_swarm_core/paper_trading => strategy_crypto/strategy_crypto/backend}/persistence.py (88%) rename src/{multi_swarm_core/multi_swarm_core/paper_trading => strategy_crypto/strategy_crypto/backend}/portfolio.py (98%) 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)