summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 18:06:25 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-01 18:06:25 +0900
commit7c05359bccfa0ca50a8f55c1a99cfadd731c8e89 (patch)
treee6d182f6ce6c32b6d53aefa5d2cd7677e154e3eb
parent1270e5edfa8e00ec6306e0921c54d5c130a01b54 (diff)
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
-rw-r--r--services/api/src/trading_api/routers/strategies.py22
-rw-r--r--services/order-executor/src/order_executor/config.py5
-rw-r--r--shared/alembic/env.py8
-rw-r--r--shared/src/shared/config.py4
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 = ""