"""策略交易页:主站 index.html 所需数据(顺势加仓等)。""" from __future__ import annotations from typing import Any, Callable, Optional from strategy_db import init_strategy_tables def _row_to_dict(row) -> dict: if row is None: return {} try: return dict(row) except Exception: return {} def count_active_trend_plans(conn, count_fn: Optional[Callable] = None) -> int: if callable(count_fn): return int(count_fn(conn) or 0) try: return int( conn.execute( "SELECT COUNT(*) FROM trend_pullback_plans WHERE status='active'" ).fetchone()[0] ) except Exception: return 0 def fetch_roll_page_data( conn, *, default_risk_percent: float = 2.0, count_active_trends: Optional[Callable] = None, ) -> dict[str, Any]: init_strategy_tables(conn) monitors = [] for row in conn.execute( "SELECT * FROM order_monitors WHERE status='active' ORDER BY id DESC" ).fetchall(): monitors.append(_row_to_dict(row)) roll_groups = [] for row in conn.execute( "SELECT * FROM roll_groups WHERE status='active' ORDER BY id DESC" ).fetchall(): roll_groups.append(_row_to_dict(row)) roll_legs = [] for row in conn.execute( "SELECT * FROM roll_legs ORDER BY id DESC LIMIT 50" ).fetchall(): roll_legs.append(_row_to_dict(row)) return { "roll_monitors": monitors, "roll_groups": roll_groups, "roll_legs": roll_legs, "roll_trend_active": count_active_trend_plans(conn, count_active_trends), "default_risk_percent": default_risk_percent, } DEFAULT_TREND_DISABLED_NOTE = ( "趋势回调(预览、自动补仓、程序止盈)仅在 Gate 趋势机器人实例 " "(crypto_monitor_gate_bot,常见端口 5002)中启用。" "币安 / Gate 主站 / OKX 可使用本页「顺势加仓」;完整趋势回调请打开该实例。" ) def strategy_page_template_vars( conn, page: str, *, default_risk_percent: float = 2.0, count_active_trends: Optional[Callable] = None, trend_disabled_note: str = "", request_obj=None, trend_cfg: Optional[dict] = None, ) -> dict[str, Any]: """render_main_page 在 conn.close() 前合并进 render_template 的变量。""" if page not in ("strategy", "strategy_trend", "strategy_roll"): return {} out = fetch_roll_page_data( conn, default_risk_percent=default_risk_percent, count_active_trends=count_active_trends, ) if trend_cfg and request_obj is not None: from strategy_trend_register import load_trend_page_context out.update(load_trend_page_context(conn, request_obj, trend_cfg)) elif page == "strategy_trend": out["trend_disabled_note"] = trend_disabled_note or DEFAULT_TREND_DISABLED_NOTE return out