bot统计

This commit is contained in:
dekun
2026-05-15 22:04:00 +08:00
parent 1f4f571210
commit a86d1a44dd
2 changed files with 253 additions and 68 deletions
+60 -24
View File
@@ -1450,20 +1450,41 @@ def _count_opens_between(conn, start_td, end_td):
).fetchone()[0]
def _load_completed_live_pnls(conn):
def _count_trend_plan_opens_between(conn, start_td, end_td):
"""趋势回调:按计划在库里的 session_date(开仓所属北京交易日)计数。"""
return conn.execute(
"SELECT COUNT(*) FROM trend_pullback_plans WHERE session_date IS NOT NULL AND TRIM(session_date) != '' "
"AND session_date >= ? AND session_date <= ?",
(start_td, end_td),
).fetchone()[0]
def _load_completed_trade_pnls(conn, monitor_type: str):
"""已平仓实盘记录:按 monitor_type 过滤;趋势回调优先用交易所同步盈亏。"""
q = """SELECT pnl_amount, reviewed_pnl_amount, closed_at, reviewed_closed_at, created_at,
result, reviewed_result
result, reviewed_result, exchange_realized_pnl
FROM trade_records
WHERE monitor_type = '下单监控'
WHERE monitor_type = ?
ORDER BY COALESCE(closed_at, created_at, opened_at) ASC, id ASC"""
rows = conn.execute(q).fetchall()
rows = conn.execute(q, (monitor_type,)).fetchall()
out = []
for r in rows:
effective_result = (r["reviewed_result"] or r["result"] or "").strip()
if effective_result not in TRADE_COMPLETED_RESULTS:
continue
try:
p = float(r["reviewed_pnl_amount"] if r["reviewed_pnl_amount"] is not None else (r["pnl_amount"] or 0))
if monitor_type == MONITOR_TYPE_TREND:
ex = None
try:
ex = r["exchange_realized_pnl"]
except (KeyError, IndexError, TypeError):
ex = None
if ex is not None and str(ex).strip() != "":
p = float(ex)
else:
p = float(r["reviewed_pnl_amount"] if r["reviewed_pnl_amount"] is not None else (r["pnl_amount"] or 0))
else:
p = float(r["reviewed_pnl_amount"] if r["reviewed_pnl_amount"] is not None else (r["pnl_amount"] or 0))
except (TypeError, ValueError):
p = 0.0
t = parse_dt_for_trading_day(r["reviewed_closed_at"]) or parse_dt_for_trading_day(r["closed_at"]) or parse_dt_for_trading_day(r["created_at"])
@@ -1537,10 +1558,12 @@ def _compute_period_metrics(trades):
def compute_stats_bundle(conn, trading_day, now_dt=None):
"""日 / 周 / 月 统计:平仓按平仓时间所在交易日计入。"""
"""日 / 周 / 月 统计:平仓按平仓时间所在交易日计入;下单监控与趋势回调分列"""
now_dt = now_dt or app_now()
pnls = _load_completed_live_pnls(conn)
total_opens_all = conn.execute("SELECT COUNT(*) FROM order_monitors").fetchone()[0]
pnls_order = _load_completed_trade_pnls(conn, "下单监控")
pnls_trend = _load_completed_trade_pnls(conn, MONITOR_TYPE_TREND)
total_opens_order = conn.execute("SELECT COUNT(*) FROM order_monitors").fetchone()[0]
total_opens_trend = conn.execute("SELECT COUNT(*) FROM trend_pullback_plans").fetchone()[0]
w_start, w_end = _session_week_bounds(trading_day)
m_start, m_end = _calendar_month_bounds(now_dt)
@@ -1552,26 +1575,39 @@ def compute_stats_bundle(conn, trading_day, now_dt=None):
_p, _t, td = tr
return td and m_start <= td <= m_end
day_trades = [tr for tr in pnls if tr[2] == trading_day]
week_trades = [tr for tr in pnls if in_week(tr)]
month_trades = [tr for tr in pnls if in_month(tr)]
day_range = f"北京时间交易日 {trading_day}"
week_range = f"{w_start} ~ {w_end}(北京日期,近7天窗口)"
month_range = f"{m_start} ~ {m_end}(北京时间自然月)"
dm = _compute_period_metrics(day_trades)
wm = _compute_period_metrics(week_trades)
mm = _compute_period_metrics(month_trades)
dm["opens_count"] = _count_opens_between(conn, trading_day, trading_day)
wm["opens_count"] = _count_opens_between(conn, w_start, w_end)
mm["opens_count"] = _count_opens_between(conn, m_start, m_end)
dm["range_label"] = f"北京时间交易日 {trading_day}"
wm["range_label"] = f"{w_start} ~ {w_end}(北京日期,近7天窗口)"
mm["range_label"] = f"{m_start} ~ {m_end}(北京时间自然月)"
day_o = [tr for tr in pnls_order if tr[2] == trading_day]
day_t = [tr for tr in pnls_trend if tr[2] == trading_day]
dm_o = _compute_period_metrics(day_o)
dm_t = _compute_period_metrics(day_t)
dm_o["opens_count"] = _count_opens_between(conn, trading_day, trading_day)
dm_t["opens_count"] = _count_trend_plan_opens_between(conn, trading_day, trading_day)
week_o = [tr for tr in pnls_order if in_week(tr)]
week_t = [tr for tr in pnls_trend if in_week(tr)]
wm_o = _compute_period_metrics(week_o)
wm_t = _compute_period_metrics(week_t)
wm_o["opens_count"] = _count_opens_between(conn, w_start, w_end)
wm_t["opens_count"] = _count_trend_plan_opens_between(conn, w_start, w_end)
month_o = [tr for tr in pnls_order if in_month(tr)]
month_t = [tr for tr in pnls_trend if in_month(tr)]
mm_o = _compute_period_metrics(month_o)
mm_t = _compute_period_metrics(month_t)
mm_o["opens_count"] = _count_opens_between(conn, m_start, m_end)
mm_t["opens_count"] = _count_trend_plan_opens_between(conn, m_start, m_end)
return {
"trading_day": trading_day,
"total_opens_all": total_opens_all,
"day": dm,
"week": wm,
"month": mm,
"total_opens_order": total_opens_order,
"total_opens_trend": total_opens_trend,
"total_opens_all": int(total_opens_order) + int(total_opens_trend),
"day": {"range_label": day_range, "order": dm_o, "trend": dm_t},
"week": {"range_label": week_range, "order": wm_o, "trend": wm_t},
"month": {"range_label": month_range, "order": mm_o, "trend": mm_t},
}