币池可配,实测十币的排队代价;标出漂移的 tick 地板

加 --syms(start.sh 传 SYMS),默认仍是三币。TRX 不进十币池:实盘口径 208 天
只有 5 笔,ATR 门控几乎全刷掉。

十币实测(对比三币):

  queue_ms        2 → 169ms(P90 519ms,每刻最大排队中位 533ms)
  inner_ms      144 → 196ms(CPU 争抢也拖慢了纯计算)
  lag_signal_ms 621 → 958ms;同一收盘时刻最后算完的币中位 1376ms

排队从可忽略变成主项,与「10 币 × 196ms ÷ 2 核 ≈ 640ms 突发」吻合。这也是
之前「加核没用」那个结论唯一会翻转的场景:CPU 占用率只有约 3%,问题纯粹是
所有币同一秒收盘的突发,加核压的是并行度而非单币耗时。

但 800ms 哨兵不受影响——它喂的是 t_data − kline_ts(数据腿),十币下逐币
154~532ms 全在线内。加币不碰那道闸。

另外发现一个会被静默误读的东西:ADA/AVAX/DOGE/LINK/LTC 的漂移中位精确等于
半个 tick 且在四个延迟点上完全相同。那不是漂移,是中价的最小变动量——ADA 半
tick 就有 2.34bp。拿这个数去比预算会误判某币不可做。shadow_report 加了
tick_floor() 标注;方向上安全(真实漂移只会更小,这些是上界)。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jack
2026-08-28 04:50:09 +08:00
co-authored by Cursor
parent 7c13781f90
commit ef2a85dd8c
3 changed files with 44 additions and 1 deletions
+8
View File
@@ -825,10 +825,18 @@ async def main_async(workers: int, hours: float, pool) -> None:
def main() -> None:
global SYMS
ap = argparse.ArgumentParser()
ap.add_argument("--hours", type=float, default=24.0)
ap.add_argument("--workers", type=int, default=2)
# 币数直接决定排队:所有币在同一秒收盘,worker 少于币数就必然排队,
# 最后一个币的信号要等 ceil(n/worker) 轮计算。TRX 不在默认池里——
# 实盘口径 208 天只有 5 笔,ATR 门控几乎全刷掉(HANDOFF §step48
ap.add_argument("--syms", default=",".join(SYMS),
help="逗号分隔。十币池:BTC,ETH,SOL,BNB,XRP,DOGE,ADA,"
"AVAX,LINK,LTC")
a = ap.parse_args()
SYMS = tuple(s.strip().upper() for s in a.syms.split(",") if s.strip())
# 进程池必须在事件循环和任何 WS 连接之前建好:fork 一个已带活跃 socket
# 的进程会把连接状态一起复制过去,后果不可预测
with ProcessPoolExecutor(max_workers=a.workers) as pool: