From 8b3ab877151b57140b3845fedaf1fa65b9adc50b Mon Sep 17 00:00:00 2001 From: dekun Date: Fri, 22 May 2026 11:12:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crypto_monitor_gate_bot/app.py | 38 ++++++++++++++------ manual_trading_hub/hub.py | 2 +- manual_trading_hub/static/app.css | 53 +++++++++++++++++++++++----- manual_trading_hub/static/app.js | 2 +- manual_trading_hub/static/index.html | 6 ++-- 5 files changed, 77 insertions(+), 24 deletions(-) diff --git a/crypto_monitor_gate_bot/app.py b/crypto_monitor_gate_bot/app.py index 5675a30..5be183f 100644 --- a/crypto_monitor_gate_bot/app.py +++ b/crypto_monitor_gate_bot/app.py @@ -1501,6 +1501,15 @@ def init_db(): executed_plan_id INTEGER )""" ) + for ddl in ( + "ALTER TABLE trend_pullback_preview_snapshots ADD COLUMN preview_created_at TEXT", + "ALTER TABLE trend_pullback_preview_snapshots ADD COLUMN outcome TEXT DEFAULT 'open'", + "ALTER TABLE trend_pullback_preview_snapshots ADD COLUMN executed_plan_id INTEGER", + ): + try: + c.execute(ddl) + except Exception: + pass conn.commit() conn.close() @@ -5238,18 +5247,27 @@ def render_main_page(page="trade"): trend_plans_raw = conn.execute( "SELECT * FROM trend_pullback_plans WHERE status='active' ORDER BY id DESC" ).fetchall() - trend_plans = [enrich_active_trend_plan_row(r) for r in trend_plans_raw] + trend_plans = [] + for r in trend_plans_raw: + try: + trend_plans.append(enrich_active_trend_plan_row(r)) + except Exception as e: + print(f"[render_main_page] enrich trend plan: {e}") + trend_plans.append(row_to_dict(r)) preview_snapshots = [] if page == "records": - snap_rows = conn.execute( - f"SELECT * FROM trend_pullback_preview_snapshots WHERE {sql_list_time_field('preview_created_at')} >= ? " - f"AND {sql_list_time_field('preview_created_at')} <= ? ORDER BY id DESC LIMIT 500", - (start_bj, end_bj), - ).fetchall() - for sr in snap_rows: - sd = row_to_dict(sr) - sd["outcome_label"] = preview_snapshot_outcome_label(sd.get("outcome")) - preview_snapshots.append(sd) + try: + snap_rows = conn.execute( + f"SELECT * FROM trend_pullback_preview_snapshots WHERE {sql_list_time_field('preview_created_at')} >= ? " + f"AND {sql_list_time_field('preview_created_at')} <= ? ORDER BY id DESC LIMIT 500", + (start_bj, end_bj), + ).fetchall() + for sr in snap_rows: + sd = row_to_dict(sr) + sd["outcome_label"] = preview_snapshot_outcome_label(sd.get("outcome")) + preview_snapshots.append(sd) + except Exception as e: + print(f"[records] trend_pullback_preview_snapshots: {e}") can_trade = ( trading_day_reset_allows_new_open(now) and active_count < MAX_ACTIVE_POSITIONS diff --git a/manual_trading_hub/hub.py b/manual_trading_hub/hub.py index 6354373..aab196b 100644 --- a/manual_trading_hub/hub.py +++ b/manual_trading_hub/hub.py @@ -86,7 +86,7 @@ def _find_exchange(ex_id: str) -> dict | None: return None -app = FastAPI(title="hub", docs_url=None, redoc_url=None) +app = FastAPI(title="复盘系统中控", docs_url=None, redoc_url=None) STATIC_DIR = DIR / "static" if STATIC_DIR.is_dir(): app.mount("/assets", StaticFiles(directory=str(STATIC_DIR)), name="assets") diff --git a/manual_trading_hub/static/app.css b/manual_trading_hub/static/app.css index e2039a4..28cf3a1 100644 --- a/manual_trading_hub/static/app.css +++ b/manual_trading_hub/static/app.css @@ -41,9 +41,10 @@ a:hover { /* —— 顶栏 —— */ .app-shell { - max-width: 1280px; + width: 100%; + max-width: none; margin: 0 auto; - padding: 0 20px 48px; + padding: 0 clamp(16px, 2.5vw, 48px) 48px; } .app-header { @@ -300,10 +301,50 @@ button:disabled { .grid-monitor { display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr)); + gap: clamp(12px, 1.2vw, 20px); +} + +@media (min-width: 1400px) { + .grid-monitor { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (min-width: 2200px) { + .grid-monitor { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +.page-head { + max-width: 100%; +} + +.trade-bar, +.toolbar, +.hint-box { + max-width: 100%; +} + +.settings-grid-wrap { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(min(100%, 420px), 1fr)); gap: 16px; } +@media (min-width: 1600px) { + .settings-grid-wrap { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (min-width: 2400px) { + .settings-grid-wrap { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + /* 监控统计 */ .stat-row { display: grid; @@ -545,12 +586,6 @@ button:disabled { } /* —— 系统设置 —— */ -.settings-cards { - display: flex; - flex-direction: column; - gap: 14px; -} - .settings-card { background: var(--panel); border: 1px solid var(--border); diff --git a/manual_trading_hub/static/app.js b/manual_trading_hub/static/app.js index ad10989..3c94f60 100644 --- a/manual_trading_hub/static/app.js +++ b/manual_trading_hub/static/app.js @@ -375,7 +375,7 @@ loadSettingsMetaLine(); loadSettings().then((data) => { const list = document.getElementById("settings-list"); - list.innerHTML = (data.exchanges || []) + document.getElementById("settings-list").innerHTML = (data.exchanges || []) .map((ex, idx) => renderSettingsCard(ex, idx)) .join(""); list.querySelectorAll(".btn-del-ex").forEach((btn) => { diff --git a/manual_trading_hub/static/index.html b/manual_trading_hub/static/index.html index 45abc63..bb76456 100644 --- a/manual_trading_hub/static/index.html +++ b/manual_trading_hub/static/index.html @@ -3,13 +3,13 @@ - 多账户交易中控 + 复盘系统中控
-
交易中控 manual_trading_hub
+
复盘系统中控
-
+