计算判定改看「清空全部币」,并挡掉空窗口

判定原先比逐根的 queue_ms 与 inner_ms,结构上错了两处,十币下直接指反:

判据错。要紧的是一个收盘时刻清空所有币要多久,不是单币的 q 或 i。币同一秒
收盘,币数超 worker 数时后面的币串行等待,这笔代价不出现在任何单根的 q 或 i
里。现在按 kline_ts 聚合取各币最大 compute_ms,落到 clear_hist。

出路错。「排队为主 → 加核」只在还有空闲核时成立。worker 已等于核数时加
worker 不增吞吐,只把等待从 queue 挪到 inner。十币实测正是如此:inner 被
争抢从 144 抬到 192ms 反超 queue 135ms,于是判定落到「量级已低、无需优化」
——而此时最后一个币已在 1376ms。现在币数超核数就直接指向增量路径。

顺带修一个瞬时故障:WS 重连瞬间 feed 的 deque 可能为空,空窗口放行会让
worker 抛「DataFrame for 1m is empty」,白占一个计算槽(币数超核数时会推迟
后面所有币),而报错文本还会让人以为是缺历史数据。加 MIN_BARS 守卫。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 05:19:14 +08:00
co-authored by Cursor
parent 2b9a837a58
commit f5f456c523
2 changed files with 67 additions and 12 deletions
+7 -2
View File
@@ -18,8 +18,13 @@ NAME="${NAME:-shadow}"
# 设 0 可退回 full,用来复量两模式的耗时差。
SHADOW_LEAN="${SHADOW_LEAN:-1}"
# 币池。默认三个流动性最好的做滑点测量;十币池是实际要交易的那批(TRX 剔除,
# ATR 门控几乎全刷掉)。币数直接决定排队:所有币同一秒收盘,2 核上 10 个币
# 需要约 640ms 墙钟才算完,最后一个币的信号会落在 800ms 哨兵线之外。
# ATR 门控几乎全刷掉)。
#
# 币数超过核数时排队会成为主项:所有币同一秒收盘,2 核上十币实测清空要
# 约 640ms,最后一个币的信号落在 1376ms。此时**加 worker 没用**——CPU 密集
# 的活,worker 超过核数不增吞吐,只会把等待从 queue_ms 挪到 inner_ms。
# 唯一出路是压单币耗时,走 init_stream/append_bar 增量路径(实测约 3.7x
# 换算后十币 / 2 核清空约 265ms)。
SYMS="${SYMS:-BTC,ETH,SOL}"
IMAGE="${SHADOW_IMAGE:-hummingbot/hummingbot:latest}"
HOURS="${HOURS:-168}"