当前系统订单跟踪存在哪些严重的bug3

订单跟踪严重 Bug 分析

一、架构与数据流

订单跟踪涉及三条线:

sequenceDiagram
  participant Exec as Executor
  participant WSM as WebSocketOrderManager
  participant WS as WebSocket
  participant Kline as KlineService.on_message

  Exec->>WSM: track_order(oid, coin, timeout)
  WSM->>WSM: _timeout_then_verify(oid) [daemon thread]
  Exec->>WSM: wait_for_order(tracking)
  WS->>Kline: orderUpdates / userFills
  Kline->>WSM: handle_message(msg)
  WSM->>WSM: _on_order_update / _on_user_fill
  WSM->>Exec: result_event.set()
  Note over WSM: 若超时未 set
  WSM->>WSM: _resolve_via_http(oid)
  WSM->>Exec: result_event.set()

二、严重 Bug 列表

1. HTTP 失败时订单追踪永不结束且泄漏(严重)

位置websocket_order_manager._resolve_via_http 第 245–272 行。

问题:在第一次 with self._lock 之后调用 self._executor.query_order_status(oid)(第 252 行)。若此处抛异常(网络错误、超时、API 异常等),则:

  • 永远不会进入第二次 with self._lock
  • 不会执行 tracking.result_event.set()
  • 不会执行 self._tracking.pop(oid, None)

后果

  • wait_for_order 会一直阻塞到 tracking.timeout_seconds + 30 才因 wait 超时返回,且返回值为“未成交”;
  • 该订单的 OrderTracking 会一直留在 _tracking 中,造成内存泄漏
  • 若同一 oid 再次被追踪(理论上可能),会与旧条目冲突或行为混乱。

修复方向:在 _resolve_via_http 中用 try/except/finally 保证:无论 HTTP 是否成功,只要进入了“对该 oid 做 HTTP 解析”的分支,最终都要在适当条件下 result_event.set()、将状态设为 TIMEOUT(或保持 PENDING 并标记失败)、并从 _tracking 中移除该 oid。


2. oid 类型不一致导致 WS 订单更新被忽略(严重)

位置

问题:若一端为 int、另一端为 str(例如 123 vs "123"),则 self._tracking.get(oid)None,该条 orderUpdates/userFills 完全不会更新任何追踪

后果

  • 订单实际已成交/取消,但系统一直认为 PENDING;
  • 只能依赖超时后的 HTTP 兜底才能结束等待,且若 HTTP 也失败则叠加 Bug 1 的问题;
  • 用户可能误判为“未成交”并触发撤单等逻辑,而交易所端可能已成交。

修复方向:在所有使用 oid 作为 _tracking / _fill_prices key 的地方统一规范为同一类型(建议 int):在 track_order_on_order_update_on_user_fill_resolve_via_http、以及 verify_pending_orders 的迭代中,对 oid 做 int(oid)(或安全转换),并保证 API 响应解析处(如 executor 的 _parse_order_responsefilled.get("oid") / resting.get("oid"))也统一为同一类型再写入 result.order_id


3. 订单消息在依赖未就绪时被静默丢弃(严重)

位置RealtimeKlineServiceBase.on_message 第 614–623 行。

问题:当 channel in ("orderUpdates", "userFills") 时,仅当以下全部为真才转发到订单管理器:

  • hasattr(self, '_trading_orchestrator') 且非 None;
  • hasattr(self._trading_orchestrator, '_executor') 且非 None;
  • hasattr(self._trading_orchestrator._executor, '_ws_order_manager') 且非 None。

若启动顺序或依赖注入导致某一环为 None 或未设置,则:

  • 订单消息直接 return,不调用 handle_message
  • 没有任何日志,难以发现“订单推送没被处理”。

后果

  • 已下的限价单在交易所已成交/取消,但本系统永远收不到 WS 更新;
  • 表现与 Bug 2 类似:一直 PENDING,只能等超时 HTTP;若再叠加 Bug 1,则可能长时间阻塞甚至泄漏。

修复方向

  • channel in ("orderUpdates", "userFills") 但上述依赖链不完整时,至少打 warning 日志(例如 “订单消息已收到但未路由:orchestrator/executor/ws_order_manager 未就绪”),便于排查;
  • 在架构上保证 K 线服务在开始接收 WS 前,订单管理器的依赖链已就绪,或对“未就绪”阶段做明确降级与告警。

4. 其他观察(非致命但值得注意)

  • 重连后补查:重连时调用 verify_pending_orders 会与同一订单的超时线程可能同时调用 _resolve_via_http(oid),会产生重复 HTTP 请求,但先完成者会 pop 并 set,后完成者会因 get(oid) 为 None 而 return,不会破坏一致性,仅多一次请求。
  • 消息去重MessageDeduplicator 已对 orderUpdatesuserFills_SKIP_DEDUP_CHANNELS,订单消息不会被去重掉,此处无问题。
  • API 响应中 oid 类型executor._parse_order_responseresult.order_id = filled.get("oid") / resting.get("oid") 未强制转为 int,若交易所返回 str,会与 Bug 2 的修复联动,建议在解析处统一为 int 再赋给 result.order_id

三、修复优先级建议

优先级 Bug 影响 建议
P0 HTTP 失败未清理(Bug 1) 永久阻塞 + 内存泄漏 _resolve_via_http 中加 try/except/finally,保证 set + pop + 状态
P0 oid 类型不一致(Bug 2) WS 更新全部丢失 全链路 oid 规范为 int(track、WS 处理、HTTP、API 解析)
P1 订单消息静默丢弃(Bug 3) 难以排查的“收不到更新” 依赖未就绪时打 warning 日志;保证启动顺序/依赖注入

按上述顺序修复后,订单跟踪的健壮性和可观测性会有明显提升。

Read more

跑步的技巧(滚动落地)

“滚动落地(rolling contact / rolling foot strike)”不是一种教条式的“脚法”,而是一种 让冲击沿着整只脚、整条后链逐级传递的落地机制。 它的核心不是“你先用哪儿着地”,而是: 你的脚落地之后,冲击是不是像轮子一样滚过去,而不是像锤子一样砸下去。 这就是滚动落地的本质。 一、什么叫“滚动落地”? 你可以把它理解成两种完全不同的落地方式: 1. 砸地(撞击式) 脚像锤子一样拍到地上: * 要么后跟先砸 * 要么前掌先戳 * 冲击集中在一个点 * 一个结构瞬间吃掉大部分载荷 结果就是: * 后跟砸 → 膝盖难受 * 前掌戳 → 前脚掌磨烂 * 都不是长跑友好模式 这叫 撞击式着地(impact strike)。 2. 滚地(滚动式) 脚像轮胎一样“滚”过地面: * 不是某一点硬砸 * 而是外侧中足先轻触 * 再向前滚到前掌 * 最后从大脚趾蹬离

By SHI XIAOLONG

AMI的优越性

世界模型(World Models)的具体例子 如下,我按类型分类,便于理解。每类都附带实际实现、演示效果和应用场景。 1. Yann LeCun / Meta 的 JEPA 系列(最直接对应“世界模型”概念) 这些是 LeCun 主张的非生成式抽象预测世界模型代表。 * I-JEPA(Image JEPA,2023) 输入一张图像,模型把不同区域(context 和 target)编码成抽象表示,然后预测 target 的表示(不在像素级别重建)。 例子:给定一张遮挡了部分物体的图片,模型能预测“被遮挡物体的大致位置和属性”,构建对物体持久性和空间关系的理解。 这是一个“原始世界模型”,能学习物理常识(如物体不会凭空消失)。 * V-JEPA / V-JEPA 2(Video JEPA,

By SHI XIAOLONG

什么是:“世界模型(World Models)”

世界模型(World Models) 是人工智能领域的一个核心概念,尤其在 Yann LeCun 等研究者推动的下一代 AI 架构中占据中心位置。它指的是 AI 系统在内部构建的对现实世界的抽象模拟或内部表示,让机器能够像人类或动物一样“理解”物理世界、预测未来、规划行动。 简单比喻 想象你闭上眼睛也能“看到”房间里的物体会如何移动、碰撞或掉落——这就是你大脑里的世界模型。AI 的世界模型就是类似的“数字孪生”(digital twin)或“内部模拟器”:它不是简单记住数据,而是学习世界的动态、因果关系和物理直觉(如重力、物体持久性、遮挡、因果等)。 为什么需要世界模型? 当前主流的大型语言模型(LLM) 擅长处理文本(统计模式预测),但存在根本局限: * 缺乏对物理世界的真正理解 → 容易“幻觉”、无法可靠规划。 * 样本效率低 → 人类/

By SHI XIAOLONG

K线周期可配置化设计方案

K线周期可配置化设计方案 1. 背景与目标 当前 Beta 套利策略的 K 线周期硬编码为 "1h",分散在多个文件中。需要: 1. 将 K 线周期从 1h 改为 2h 2. 提取为环境变量 BETA_ARB_KLINE_INTERVAL,使其可在 .env 中配置 2. 影响范围分析 2.1 需要修改的文件(共 6 个) 文件 硬编码位置 修改内容 src/trading/config.py BetaArbConfig dataclass 新增 kline_interval 字段,

By SHI XIAOLONG