From 7c05359bccfa0ca50a8f55c1a99cfadd731c8e89 Mon Sep 17 00:00:00 2001 From: TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> Date: Wed, 1 Apr 2026 18:06:25 +0900 Subject: fix: resolve final 3 issues for production readiness - Fix API strategies endpoint path resolution (use STRATEGIES_DIR env var) - Add DATABASE_URL env var override in alembic env.py - Move risk config fields to shared Settings base class - Remove duplicate fields from ExecutorConfig --- services/api/src/trading_api/routers/strategies.py | 22 ++++++++++++++++------ .../order-executor/src/order_executor/config.py | 5 +---- shared/alembic/env.py | 8 ++++++++ shared/src/shared/config.py | 4 ++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/services/api/src/trading_api/routers/strategies.py b/services/api/src/trading_api/routers/strategies.py index e968529..7ddd54e 100644 --- a/services/api/src/trading_api/routers/strategies.py +++ b/services/api/src/trading_api/routers/strategies.py @@ -1,15 +1,26 @@ """Strategy endpoints.""" import logging +import os import sys from pathlib import Path from fastapi import APIRouter, HTTPException -# Add strategy-engine to path for plugin loading -_STRATEGY_DIR = Path(__file__).resolve().parents[5] / "strategy-engine" -if str(_STRATEGY_DIR) not in sys.path: - sys.path.insert(0, str(_STRATEGY_DIR)) +# Resolve strategies directory from env or relative paths +_STRATEGIES_DIR = Path( + os.environ.get( + "STRATEGIES_DIR", + str(Path(__file__).resolve().parents[5] / "services" / "strategy-engine" / "strategies"), + ) +) +# Add parent so `from strategies.base import BaseStrategy` works +if str(_STRATEGIES_DIR.parent) not in sys.path: + sys.path.insert(0, str(_STRATEGIES_DIR.parent)) +# Add strategy-engine src for plugin_loader +_SE_SRC = Path(__file__).resolve().parents[5] / "services" / "strategy-engine" / "src" +if str(_SE_SRC) not in sys.path: + sys.path.insert(0, str(_SE_SRC)) logger = logging.getLogger(__name__) @@ -22,8 +33,7 @@ async def list_strategies(): try: from strategy_engine.plugin_loader import load_strategies - strategies_dir = _STRATEGY_DIR / "strategies" - strategies = load_strategies(strategies_dir) + strategies = load_strategies(_STRATEGIES_DIR) return [ { "name": s.name, diff --git a/services/order-executor/src/order_executor/config.py b/services/order-executor/src/order_executor/config.py index 14828ea..6542a31 100644 --- a/services/order-executor/src/order_executor/config.py +++ b/services/order-executor/src/order_executor/config.py @@ -4,7 +4,4 @@ from shared.config import Settings class ExecutorConfig(Settings): - risk_trailing_stop_pct: float = 0.0 - risk_max_open_positions: int = 10 - risk_volatility_lookback: int = 20 - risk_volatility_scale: bool = False + pass diff --git a/shared/alembic/env.py b/shared/alembic/env.py index 14303f6..18687f2 100644 --- a/shared/alembic/env.py +++ b/shared/alembic/env.py @@ -1,6 +1,7 @@ """Alembic environment configuration for async PostgreSQL migrations.""" import asyncio +import os from logging.config import fileConfig from alembic import context @@ -14,6 +15,13 @@ config = context.config if config.config_file_name is not None: fileConfig(config.config_file_name) +# Override URL from DATABASE_URL env var if set +database_url = os.environ.get("DATABASE_URL") +if database_url: + if database_url.startswith("postgresql://"): + database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1) + config.set_main_option("sqlalchemy.url", database_url) + target_metadata = Base.metadata diff --git a/shared/src/shared/config.py b/shared/src/shared/config.py index 867702b..ab0331c 100644 --- a/shared/src/shared/config.py +++ b/shared/src/shared/config.py @@ -14,6 +14,10 @@ class Settings(BaseSettings): risk_max_position_size: float = 0.1 risk_stop_loss_pct: float = 5.0 risk_daily_loss_limit_pct: float = 10.0 + risk_trailing_stop_pct: float = 0.0 + risk_max_open_positions: int = 10 + risk_volatility_lookback: int = 20 + risk_volatility_scale: bool = False dry_run: bool = True telegram_bot_token: str = "" telegram_chat_id: str = "" -- cgit v1.2.3