89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
"""策略交易页:主站 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 = "",
|
||
) -> dict[str, Any]:
|
||
"""render_main_page 在 conn.close() 前合并进 render_template 的变量。"""
|
||
if page == "strategy_roll":
|
||
return fetch_roll_page_data(
|
||
conn,
|
||
default_risk_percent=default_risk_percent,
|
||
count_active_trends=count_active_trends,
|
||
)
|
||
if page == "strategy_trend":
|
||
return {
|
||
"trend_disabled_note": trend_disabled_note or DEFAULT_TREND_DISABLED_NOTE,
|
||
}
|
||
return {}
|