diff --git a/crypto_monitor_binance/app.py b/crypto_monitor_binance/app.py index 0d064a2..baa4a76 100644 --- a/crypto_monitor_binance/app.py +++ b/crypto_monitor_binance/app.py @@ -49,8 +49,10 @@ from fib_key_monitor_lib import ( ) from strategy_trade_labels import ( STRATEGY_ENTRY_REASON_OPTIONS, + apply_order_monitor_source_labels, entry_reason_for_monitor_type, handoff_trade_miss_reason, + order_monitor_source_type, trade_record_monitor_type as resolve_trade_record_monitor_type, trend_plan_id_from_monitor_row, ) @@ -2556,9 +2558,7 @@ def enrich_order_item(raw_item, current_capital): item["breakeven_enabled"] = 0 if be is not None and int(be) == 0 else 1 except Exception: item["breakeven_enabled"] = 1 - if not (item.get("monitor_type") or "").strip(): - item["monitor_type"] = ORDER_MONITOR_TYPE_MANUAL - return item + return apply_order_monitor_source_labels(item, default_manual=ORDER_MONITOR_TYPE_MANUAL) def ensure_exchange_live_ready(): @@ -2570,17 +2570,7 @@ def ensure_exchange_live_ready(): def order_row_monitor_type(row): - if row is None: - return ORDER_MONITOR_TYPE_MANUAL - try: - keys = row.keys() if hasattr(row, "keys") else [] - except Exception: - keys = [] - if "monitor_type" in keys: - mt = (row["monitor_type"] or "").strip() - if mt: - return mt - return ORDER_MONITOR_TYPE_MANUAL + return order_monitor_source_type(row, default_manual=ORDER_MONITOR_TYPE_MANUAL) def trade_record_monitor_type(conn, row): diff --git a/crypto_monitor_gate/app.py b/crypto_monitor_gate/app.py index ad07c97..316b4bf 100644 --- a/crypto_monitor_gate/app.py +++ b/crypto_monitor_gate/app.py @@ -50,8 +50,10 @@ from fib_key_monitor_lib import ( ) from strategy_trade_labels import ( STRATEGY_ENTRY_REASON_OPTIONS, + apply_order_monitor_source_labels, entry_reason_for_monitor_type, handoff_trade_miss_reason, + order_monitor_source_type, trade_record_monitor_type as resolve_trade_record_monitor_type, trend_plan_id_from_monitor_row, ) @@ -2282,9 +2284,7 @@ def enrich_order_item(raw_item, current_capital): item["breakeven_enabled"] = 0 if be is not None and int(be) == 0 else 1 except Exception: item["breakeven_enabled"] = 1 - if not (item.get("monitor_type") or "").strip(): - item["monitor_type"] = ORDER_MONITOR_TYPE_MANUAL - return item + return apply_order_monitor_source_labels(item, default_manual=ORDER_MONITOR_TYPE_MANUAL) def ensure_exchange_live_ready(): @@ -2296,17 +2296,7 @@ def ensure_exchange_live_ready(): def order_row_monitor_type(row): - if row is None: - return ORDER_MONITOR_TYPE_MANUAL - try: - keys = row.keys() if hasattr(row, "keys") else [] - except Exception: - keys = [] - if "monitor_type" in keys: - mt = (row["monitor_type"] or "").strip() - if mt: - return mt - return ORDER_MONITOR_TYPE_MANUAL + return order_monitor_source_type(row, default_manual=ORDER_MONITOR_TYPE_MANUAL) def trade_record_monitor_type(conn, row): diff --git a/crypto_monitor_gate_bot/app.py b/crypto_monitor_gate_bot/app.py index 4bc8ed7..28e9656 100644 --- a/crypto_monitor_gate_bot/app.py +++ b/crypto_monitor_gate_bot/app.py @@ -60,6 +60,7 @@ from journal_chart_lib import ( from hub_auth import request_allowed as hub_request_allowed from strategy_trade_labels import ( STRATEGY_ENTRY_REASON_OPTIONS, + apply_order_monitor_source_labels, handoff_trade_miss_reason, trade_record_monitor_type as resolve_trade_record_monitor_type, trend_plan_id_from_monitor_row, @@ -2311,7 +2312,7 @@ def enrich_order_item(raw_item, current_capital): item["breakeven_enabled"] = 0 if be is not None and int(be) == 0 else 1 except Exception: item["breakeven_enabled"] = 1 - return item + return apply_order_monitor_source_labels(item, default_manual="下单监控") def ensure_exchange_live_ready(): diff --git a/crypto_monitor_okx/app.py b/crypto_monitor_okx/app.py index d1a49de..e1ffa90 100644 --- a/crypto_monitor_okx/app.py +++ b/crypto_monitor_okx/app.py @@ -49,8 +49,10 @@ from fib_key_monitor_lib import ( ) from strategy_trade_labels import ( STRATEGY_ENTRY_REASON_OPTIONS, + apply_order_monitor_source_labels, entry_reason_for_monitor_type, handoff_trade_miss_reason, + order_monitor_source_type, trade_record_monitor_type as resolve_trade_record_monitor_type, trend_plan_id_from_monitor_row, ) @@ -2138,7 +2140,7 @@ def enrich_order_item(raw_item, current_capital): item["breakeven_enabled"] = 0 if be is not None and int(be) == 0 else 1 except Exception: item["breakeven_enabled"] = 1 - return item + return apply_order_monitor_source_labels(item, default_manual=ORDER_MONITOR_TYPE_MANUAL) def ensure_okx_live_ready(): @@ -2150,17 +2152,7 @@ def ensure_okx_live_ready(): def order_row_monitor_type(row): - if row is None: - return ORDER_MONITOR_TYPE_MANUAL - try: - keys = row.keys() if hasattr(row, "keys") else [] - except Exception: - keys = [] - if "monitor_type" in keys: - mt = (row["monitor_type"] or "").strip() - if mt: - return mt - return ORDER_MONITOR_TYPE_MANUAL + return order_monitor_source_type(row, default_manual=ORDER_MONITOR_TYPE_MANUAL) def trade_record_monitor_type(conn, row): diff --git a/hub_bridge.py b/hub_bridge.py index 2bfd1d5..1c4cd62 100644 --- a/hub_bridge.py +++ b/hub_bridge.py @@ -283,7 +283,14 @@ def register_hub_routes(app): for row in conn.execute( "SELECT * FROM order_monitors WHERE status='active' ORDER BY id DESC" ).fetchall(): - orders.append(_row_to_dict(row)) + od = _row_to_dict(row) + try: + from strategy_trade_labels import apply_order_monitor_source_labels + + od = apply_order_monitor_source_labels(od) + except Exception: + pass + orders.append(od) trends = [] if c.get("has_trend"): for row in conn.execute( diff --git a/manual_trading_hub/static/app.js b/manual_trading_hub/static/app.js index 551194c..1717890 100644 --- a/manual_trading_hub/static/app.js +++ b/manual_trading_hub/static/app.js @@ -303,6 +303,27 @@ return side || "—"; } + function monitorOrderSourceLabel(mo) { + const o = mo || {}; + const tid = Number(o.trend_plan_id); + if (Number.isFinite(tid) && tid > 0) return "趋势回调"; + const mt = String(o.monitor_type || "").trim(); + if (mt === "趋势回调") return "趋势回调"; + const kst = String(o.key_signal_type || "").trim(); + if (kst === "趋势回调" || kst === "趋势回调计划") return "趋势回调"; + return mt || "下单监控"; + } + + function monitorOrderSourceHtml(mo) { + const src = monitorOrderSourceLabel(mo); + const kst = String((mo && mo.key_signal_type) || "").trim(); + let text = src; + if (kst && kst !== src && !text.includes(kst)) { + text += " · " + kst; + } + return `来源: ${esc(text)}`; + } + function renderDirectionHtml(side) { const cls = sideDirCls(side); const label = sideDirLabel(side); @@ -1052,7 +1073,9 @@ : tp.avg_entry_price; const entryN = entryRaw != null && entryRaw !== "" ? Number(entryRaw) : null; const isTrend = - !!(trendPlan && trendPlan.id) || String(mo.monitor_type || "").trim() === "趋势回调"; + !!(trendPlan && trendPlan.id) || + String(mo.monitor_type || "").trim() === "趋势回调" || + (mo.trend_plan_id != null && Number(mo.trend_plan_id) > 0); let sl = mo.stop_loss != null && mo.stop_loss !== "" ? mo.stop_loss : ""; let takeProfit = mo.take_profit != null && mo.take_profit !== "" ? mo.take_profit : ""; @@ -1422,10 +1445,8 @@ pnlText += ` (${pct >= 0 ? "" : ""}${pct.toFixed(2)}%)`; } const meta = []; - if (mo.monitor_type || mo.key_signal_type) { - meta.push( - `来源: ${esc(mo.monitor_type || "下单监控")}${mo.key_signal_type ? " · " + esc(mo.key_signal_type) : ""}` - ); + if (mo.monitor_type || mo.key_signal_type || mo.trend_plan_id) { + meta.push(monitorOrderSourceHtml(mo)); } else { meta.push("来源: 交易所持仓"); } diff --git a/manual_trading_hub/static/index.html b/manual_trading_hub/static/index.html index f9e15d5..e8eef02 100644 --- a/manual_trading_hub/static/index.html +++ b/manual_trading_hub/static/index.html @@ -229,6 +229,6 @@
- +