This commit is contained in:
dekun
2026-05-23 11:20:45 +08:00
parent 4b185133c4
commit fc8f9b70da
14 changed files with 294 additions and 79 deletions
+3 -61
View File
@@ -5,7 +5,7 @@ import os
from functools import wraps
from typing import Any, Callable, Optional
from flask import Flask, flash, jsonify, redirect, render_template, request, url_for
from flask import Flask, flash, jsonify, redirect, request, url_for
from jinja2 import ChoiceLoader, FileSystemLoader
from strategy_db import init_strategy_tables
@@ -13,14 +13,12 @@ from strategy_roll_lib import preview_roll
def install_strategy_trading(app: Flask, repo_root: str, app_module: Any = None, **build_kw) -> None:
"""在 app.py 末尾调用(login_required 已定义后)。build_kw 传给 build_strategy_config"""
"""在 app.py 末尾调用(login_required 已定义后)。仅注册 POST API;页面由各 app 的 render_main_page 渲染"""
from strategy_config import build_strategy_config
render_trend_page = build_kw.pop("render_trend_page", None)
build_kw.pop("render_trend_page", None)
attach_strategy_templates(app, repo_root)
cfg = build_strategy_config(app_module, **build_kw)
if render_trend_page is not None:
cfg["render_trend_page"] = render_trend_page
register_strategy_trading(app, cfg)
@@ -43,66 +41,10 @@ def register_strategy_trading(app: Flask, cfg: dict[str, Any]) -> None:
login_required = cfg["login_required"]
get_db = cfg["get_db"]
trend_enabled = bool(cfg.get("trend_enabled"))
render_trend_page = cfg.get("render_trend_page")
def _lr(f):
return login_required(f)
if trend_enabled and callable(render_trend_page):
app.add_url_rule(
"/strategy/trend",
endpoint="strategy_trend_page",
view_func=_lr(render_trend_page),
)
else:
@_lr
@app.route("/strategy/trend")
def strategy_trend_disabled_page():
return render_template(
"strategy_trend_disabled.html",
exchange_display=cfg.get("exchange_display", ""),
trend_note=cfg.get(
"trend_disabled_note",
"趋势回调(自动补仓)当前仅在 Gate 趋势机器人实例中启用。",
),
)
@_lr
@app.route("/strategy/roll")
def strategy_roll_page():
conn = get_db()
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))
legs = []
for row in conn.execute(
"SELECT * FROM roll_legs ORDER BY id DESC LIMIT 50"
).fetchall():
legs.append(_row_to_dict(row))
trend_n = _count_active_trends(conn, cfg)
conn.close()
return render_template(
"strategy_roll.html",
page="strategy_roll",
exchange_display=cfg.get("exchange_display", ""),
monitors=monitors,
roll_groups=roll_groups,
roll_legs=legs,
trend_active=trend_n,
default_risk_percent=cfg.get("default_risk_percent", 2),
price_fmt=cfg.get("price_fmt"),
)
@_lr
@app.route("/strategy/roll/preview", methods=["POST"])
def strategy_roll_preview():