Refactor dashboard JS to ES modules; fix collector strategy loading and add auto-backfill

- Split inline JS into separate ES module files (indicators/, strategies/, ui/, utils/)
- Fix brain.py strategy registry to use MAStrategy directly instead of missing modules
- Add auto-backfill for detected data gaps in collector monitoring loop
- Fix chart resize on sidebar toggle
- Fix chart scrollToTime -> setVisibleLogicalRange
This commit is contained in:
BTC Bot
2026-02-18 11:07:30 +01:00
parent eafba745b1
commit 30bedcbb67
31 changed files with 2516 additions and 2054 deletions

View File

@ -5,34 +5,37 @@ Pure strategy logic separated from DB I/O for testability
import json
import logging
from dataclasses import dataclass, asdict
from dataclasses import dataclass
from datetime import datetime, timezone
from typing import Dict, Optional, Any, List
import importlib
from typing import Dict, Optional, Any, List, Callable
from .database import DatabaseManager
from .indicator_engine import IndicatorEngine
from src.strategies.base import BaseStrategy, StrategySignal, SignalType
from src.strategies.ma_strategy import MAStrategy
logger = logging.getLogger(__name__)
# Registry of available strategies
STRATEGY_REGISTRY = {
"ma44_strategy": "src.strategies.ma44_strategy.MA44Strategy",
"ma125_strategy": "src.strategies.ma125_strategy.MA125Strategy",
def _create_ma44() -> BaseStrategy:
return MAStrategy(config={"period": 44})
def _create_ma125() -> BaseStrategy:
return MAStrategy(config={"period": 125})
STRATEGY_REGISTRY: Dict[str, Callable[[], BaseStrategy]] = {
"ma_trend": MAStrategy,
"ma44_strategy": _create_ma44,
"ma125_strategy": _create_ma125,
}
def load_strategy(strategy_name: str) -> BaseStrategy:
"""Dynamically load a strategy class"""
"""Load a strategy instance from registry"""
if strategy_name not in STRATEGY_REGISTRY:
# Default fallback or error
logger.warning(f"Strategy {strategy_name} not found, defaulting to MA44")
strategy_name = "ma44_strategy"
logger.warning(f"Strategy {strategy_name} not found, defaulting to ma_trend")
strategy_name = "ma_trend"
module_path, class_name = STRATEGY_REGISTRY[strategy_name].rsplit('.', 1)
module = importlib.import_module(module_path)
cls = getattr(module, class_name)
return cls()
factory = STRATEGY_REGISTRY[strategy_name]
return factory()
@dataclass
class Decision: