综合改进分析报告 — 基于 6 个开源项目的架构提炼

综合改进分析报告 — 基于 6 个开源项目的架构提炼

目标项目: 当前 HYPE/PURR 配对交易系统
信息来源: 6 个 Hyperliquid 相关开源项目的架构分析
分析日期: 2026-02-08
目的: 整合 6 个项目的最佳实践,去重合并后生成当前项目的统一改进路线图


1. 信息来源概览

# 项目 Stars 类型 核心价值
A ai-trading-agent (Nocturne) 454 LLM 驱动单腿交易 LLM 辅助决策、对账思想、HTTP 可观测性
B copytrading-agent 42 自动跟单 对账机制、IOC 限价单、Delta 模型、权益比例分配
C Hyperliquid_Copy_Trader fork 多钱包跟单 模拟交易、Pydantic 校验、双向远程控制
D hyperliquid-trading-bot 网格交易框架 接口抽象、EventBus、自定义异常、API 容灾
E passivbot 1,860 多交易所网格做市 订单容差匹配、Unstuck解套、TWEL双层敞口、TradingMode状态机、回测优化器
F Hyper-Alpha-Arena 582 AI交易平台 市场制度分类、资金流信号、边缘触发、TP/SL去重、预言机价格保护

2. 当前项目已有优势(无需改动)

在对比 6 个项目后,以下能力是当前项目的独有优势,任何参考项目都不具备:

维度 当前项目能力 6 个参考项目
时序数据库 TimescaleDB 完整记录信号/仓位/订单/日统计 A/B/C/D 无持久化;E 文件缓存;F 普通 PostgreSQL(无时序优化)
崩溃恢复 从 DB 恢复 open 仓位 + 交易所对账 A/B/C/D 重启即丢;E 依赖交易所重建;F 依赖 DB 但无显式恢复逻辑
三层安全防护 KillSwitch + RateLimiter + CircuitBreaker A 无防护,B/C 仅仓位上限,D 基础规则;E/F 无 CircuitBreaker/RateLimiter
双腿配对交易 两腿对冲 + 回滚机制 A/C/F 单腿方向性,B 单腿跟单,D/E 单腿网格
多周期协整分析 5m/1h/4h Z-score + 协整检验 A 靠 LLM,B/C 纯跟单,D 价格网格;E 仅 3-EMA;F 无协整
日损限额 UTC 日自动重置的每日亏损限额 仅 C 有总敞口上限;E 基于峰值余额;F 无日损限额
线程安全状态 Lock/RLock 保护共享状态 A/B/C 无保护;D/E 单线程 asyncio;F 部分锁
审计追踪 信号拒绝原因、原始数据 JSON 存储 A 仅 diary.jsonl;E 无信号级审计;F 有决策日志但无拒绝原因
飞书告警 开仓/平仓/止损全链路通知 仅 C 有 Telegram;E/F 仅日志/Web UI
批量写入优化 COPY 方法 >40K records/sec 均不涉及

3. 统一改进路线图

以下改进建议从 6 份分析报告中提炼、去重、合并,按 价值/成本比 重新排序。每项标注来源项目。

3.1 P0 — 高价值低成本(建议优先实施)


【改进 1】交易所状态定时对账(Reconciliation)

来源: 项目 A + 项目 B(两个项目独立提出,高度共识)

现状问题:

  • position_manager.py_positions 字典是本地内存状态
  • 如果 WS 丢消息、手动在交易所操作、或 TP/SL 被交易所自动执行,本地状态会偏离
  • 偏离的状态可能导致:重复开仓、漏平仓、风控计算错误

改进方案:

每 60s 定时:
  1. 从交易所 API 拉取当前持仓快照 (info.user_state)
  2. 与本地 _positions 字典对比
  3. 差异处理:
     - 本地有 / 交易所无 → 标记为已平仓(TP/SL 被交易所执行)
     - 本地无 / 交易所有 → 告警(可能是手动操作或未知来源)
     - 仓位大小不一致 → 用交易所数据修正本地状态
  4. 对账结果写入 DB + 飞书告警

参考实现 (项目 B 的 reconciler.ts):

reconcileOnce():
  [leader, follower] = await Promise.all([
    infoClient.clearinghouseState(leader),
    infoClient.clearinghouseState(follower),
  ])
  leaderState.applyClearinghouseState(leader)     // 全量覆盖
  followerState.applyClearinghouseState(follower)  // 全量覆盖

核心原则: 交易所状态永远是权威来源,本地状态只是缓存。

维度 说明
工作量 ~4-6 小时
风险 低(只读对账,不自动修正仓位)
收益 防止状态偏离导致的风控失效
影响文件 position_manager.py

【改进 2】IOC 限价单 + 滑点保护

来源: 项目 B

现状问题:

  • executor.py 使用市价单下单
  • PURR 等低流动性品种的市价单滑点不可控
  • 极端行情下可能以远偏离预期的价格成交

改进方案:

将 market_open() 中的市价单替换为 IOC 限价单:
  买入: limit_price = mark_price × (1 + max_slippage_bps / 10000)
  卖出: limit_price = mark_price × (1 - max_slippage_bps / 10000)

  order_type = {"limit": {"tif": "Ioc"}}

  优势:
  - 成交价不会超过 mark ± slippage
  - 未成交部分自动取消,不会挂单
  - 默认 25bps (0.25%) 滑点保护

参考实现 (项目 B 的 tradeExecutor.ts):

buildOrder(delta, markPrice):
  slippageMultiplier = 1 + risk.maxSlippageBps / 10_000
  limitPrice = isBuy ? markPrice * slippageMultiplier : markPrice / slippageMultiplier
  return { orderType: { limit: { tif: "Ioc" } }, reduceOnly: isReduceOnly }
维度 说明
工作量 ~3-4 小时
风险 低(IOC 未成交自动取消,不会挂单)
收益 滑点可控,特别利好 PURR 等低流动性品种
影响文件 executor.py, config.py (新增 max_slippage_bps 配置)

【改进 3】模拟交易模式(Paper Trading / Dry Run)

来源: 项目 C

现状问题:

  • 无模拟模式,策略测试只能实盘
  • 修改参数后无法安全验证
  • 新策略上线前无法做全链路测试

改进方案:

# 在 executor 层加 dry_run 标志
class HyperliquidExecutor:
    def __init__(self, config, dry_run: bool = False):
        self.dry_run = dry_run
        self._paper_positions = {}  # 模拟持仓

    def market_open(self, ...):
        if self.dry_run:
            self._paper_positions[symbol] = {
                "entry": current_price, "size": size, "side": side
            }
            logger.info(f"[PAPER] Open {side} {size} {symbol} @ {current_price}")
            return PaperOrderResult(...)
        # 实际执行...

关键设计: 上层逻辑(position_manager.pyrisk_manager.py)完全不需要修改 — dry_run 只在 executor 层拦截,信号生成、风控检查、仓位管理流程全部真实执行。

维度 说明
工作量 ~3-4 小时
风险 低(不影响实盘路径)
收益 策略验证零成本、新策略上线前可做全链路测试
影响文件 executor.py, config.py (新增 dry_run 配置)

【改进 4】自定义异常体系

来源: 项目 D

现状问题:

  • 全部使用 Exception 基类
  • except Exception as e: 无法区分错误类型
  • 网络超时、配置错误、下单拒绝全部同等处理(要么都重试,要么都放弃)

改进方案:

# src/trading/exceptions.py(新文件)
class TradingError(Exception):
    """交易系统基础异常"""

class ConfigurationError(TradingError):
    """配置错误 → 启动时立即退出"""

class ExchangeError(TradingError):
    """交易所通信错误 → 重试 + 告警"""

class OrderError(TradingError):
    """下单失败 → 记录 + 触发熔断检查"""

class PositionError(TradingError):
    """仓位操作异常 → 触发对账"""

class InsufficientMarginError(OrderError):
    """保证金不足 → 跳过本次交易 + 告警"""

精确处理策略:

  • ConfigurationError → 启动时 fail fast
  • ExchangeError → 自动重试 3 次 + 指数退避
  • OrderError → 记录日志 + 飞书告警 + 触发 CircuitBreaker 检查
  • InsufficientMarginError → 跳过 + 告警,不触发熔断
维度 说明
工作量 ~4-6 小时
风险 低(渐进式替换,不需要一次全改)
收益 错误处理精确化,不同错误不同策略
影响文件 新建 exceptions.py,渐进修改 executor.py, position_manager.py

【改进 5】启动配置校验

来源: 项目 C + 项目 A

现状问题:

  • config.py 使用 os.getenv() 加载配置,缺少类型转换不会报错
  • 配置项缺失在运行时才发现(可能跑了 10 分钟后崩溃)
  • 无跨字段校验(如 max_position_usd 应 > min_position_usd

改进方案(零依赖版本):

def validate_config(config: TradingConfig) -> list[str]:
    """启动时统一校验,返回错误列表"""
    errors = []
    if not config.private_key:
        errors.append("HYPERLIQUID_PRIVATE_KEY 未配置")
    if config.max_position_usd <= 0:
        errors.append(f"max_position_usd 必须 > 0, 当前: {config.max_position_usd}")
    if config.max_daily_loss_usd >= 0:
        errors.append(f"max_daily_loss_usd 应为负数, 当前: {config.max_daily_loss_usd}")
    # ... 更多校验
    return errors

# 启动时调用
errors = validate_config(config)
if errors:
    for e in errors:
        logger.error(f"配置错误: {e}")
    raise SystemExit(1)
维度 说明
工作量 ~2-3 小时
风险
收益 Fail fast,避免运行时配置崩溃
影响文件 config.py

【改进 6】订单容差匹配(Ideal vs Actual Diff)

来源: 项目 E(passivbot 核心执行模式)

现状问题:

  • executor.py 每个执行周期都是「取消全部挂单 → 重新挂单」的模式
  • 即使价格/数量只变了 0.01%,也会触发撤单+重挂
  • 高频操作浪费 API 调用额度,增加被限流风险
  • 对 PURR 这样低流动性品种,频繁撤挂会冲击薄盘口

改进方案:

def filter_orders(actual_orders, ideal_orders, price_tol=0.003, qty_tol=0.02):
    """比较实际挂单 vs 理想挂单,只操作差异部分"""
    to_cancel = []
    to_create = []

    for actual in actual_orders:
        if not any(orders_matching(actual, ideal, price_tol, qty_tol)
                   for ideal in ideal_orders):
            to_cancel.append(actual)

    for ideal in ideal_orders:
        if not any(orders_matching(ideal, actual, price_tol, qty_tol)
                   for actual in actual_orders):
            to_create.append(ideal)

    return to_cancel, to_create

def orders_matching(a, b, price_tol, qty_tol):
    """两个订单在容差范围内视为相同"""
    if a["side"] != b["side"]:
        return False
    if abs(a["price"] - b["price"]) / a["price"] > price_tol:
        return False
    if abs(a["qty"] - b["qty"]) / max(a["qty"], b["qty"]) > qty_tol:
        return False
    return True

核心原则: 每个执行周期计算"理想订单集",与交易所实际挂单对比,只撤/挂有变化的单。

维度 说明
工作量 ~3-4 小时
风险 低(容差参数可调,初期设置宽松值)
收益 减少 50%+ 无效 API 调用,降低对薄盘口的冲击
影响文件 executor.py

【改进 7】TradingMode 状态机(5 种运行模式)

来源: 项目 E(passivbot Orchestrator 核心设计)

现状问题:

  • KillSwitch 只有 on/off 两态
  • 没有"只平仓不开仓"的中间态(日损接近限额时需要)
  • 没有"优雅停止"(维护升级时需要有序平仓)
  • 触发 KillSwitch 就是立即全停,无法渐进降级

改进方案:

from enum import Enum

class TradingMode(Enum):
    NORMAL = "normal"              # 正常交易(入场 + 出场)
    TP_ONLY = "tp_only"            # 只允许止盈平仓,不新开仓
    GRACEFUL_STOP = "graceful_stop" # 不开新仓,有序平现有仓位
    PANIC = "panic"                # 紧急模式:市价全平(= 当前 KillSwitch)
    MANUAL = "manual"              # 人工接管:bot 不操作任何订单

# 在编排器中根据 mode 过滤操作
class TradingOrchestrator:
    def __init__(self):
        self.trading_mode = TradingMode.NORMAL

    def should_open_position(self) -> bool:
        return self.trading_mode == TradingMode.NORMAL

    def should_close_position(self) -> bool:
        return self.trading_mode in (
            TradingMode.NORMAL,
            TradingMode.TP_ONLY,
            TradingMode.GRACEFUL_STOP,
        )

# 自动模式切换示例
if daily_pnl < daily_loss_limit * 0.8:  # 接近日损限额80%
    orchestrator.trading_mode = TradingMode.TP_ONLY
    lark_bot.notify("切换至 TP_ONLY 模式:日损接近限额")

核心价值: 从"运行/停止"二态进化为 5 态,支持 TpOnly(日损接近阈值)、GracefulStop(维护时)、Manual(远程调试)等精细场景。

维度 说明
工作量 ~4-6 小时
风险 低(向后兼容,Panic = 当前 KillSwitch)
收益 渐进式降级替代粗暴全停,减少不必要的强制平仓
影响文件 safety.py(或新建 trading_mode.py), risk_manager.py

【改进 8】定期健康摘要 + 内存监控

来源: 项目 E(passivbot 15 分钟健康报告)

现状问题:

  • 飞书通知只在异常事件时触发(开仓/平仓/止损)
  • 系统"静默运行"时无法确认是否健康
  • 没有内存使用监控 — 长时间运行后内存泄漏难以发现
  • WS 重连次数、API 错误率等关键指标无追踪

改进方案:

import resource, time

class HealthMonitor:
    def __init__(self, interval_seconds=900):  # 默认15分钟
        self._interval = interval_seconds
        self._last_report = time.time()
        self._counters = {
            "orders_placed": 0, "fills": 0, "errors": 0,
            "ws_reconnects": 0, "signals_generated": 0,
            "signals_rejected": 0,
        }

    def maybe_report(self, positions, daily_pnl):
        if time.time() - self._last_report < self._interval:
            return
        rss_mb = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / (1024 * 1024)
        summary = {
            "uptime": format_duration(time.time() - self._start_time),
            "positions": len(positions),
            "unrealized_pnl": sum(p.unrealized_pnl for p in positions.values()),
            "daily_pnl": daily_pnl,
            "memory_rss_mb": round(rss_mb, 1),
            **self._counters,
        }
        logger.info(f"[health] {json.dumps(summary)}")
        lark_bot.send_health_summary(summary)
        self._reset_counters()
维度 说明
工作量 ~2-3 小时
风险 低(只读监控,不影响交易逻辑)
收益 确认系统存活、及早发现内存泄漏、追踪关键运营指标
影响文件 新建 src/utils/monitoring/health_monitor.py,主循环中调用

3.2 P1 — 高价值中成本(推荐实施)


【改进 9】EventBus 事件总线

来源: 项目 D

现状问题:

  • 直接调用链:Orchestrator → PositionManager → Executor → SDK
  • 通知(Lark)、持久化(DB)、统计更新在主交易流程中同步执行
  • Lark 发送失败/超时可能拖慢交易执行路径

改进方案:

# src/utils/events.py(新文件)
class EventType(Enum):
    POSITION_OPENED = "position_opened"
    POSITION_CLOSED = "position_closed"
    ORDER_FAILED = "order_failed"
    SIGNAL_GENERATED = "signal_generated"
    SIGNAL_REJECTED = "signal_rejected"
    RECONCILIATION_DIFF = "reconciliation_diff"

class EventBus:
    def __init__(self):
        self._handlers: dict[EventType, list[Callable]] = defaultdict(list)

    def subscribe(self, event_type: EventType, handler: Callable):
        self._handlers[event_type].append(handler)

    def emit(self, event_type: EventType, data: dict):
        for handler in self._handlers[event_type]:
            try:
                handler(data)
            except Exception as e:
                logger.error(f"事件处理失败: {event_type} → {e}")
                # 单个 handler 失败不影响其他 handler

# 注册订阅者
event_bus.subscribe(EventType.POSITION_OPENED, lark_bot.notify_open)
event_bus.subscribe(EventType.POSITION_OPENED, trade_repo.record_open)
event_bus.subscribe(EventType.POSITION_OPENED, stats_tracker.update)

核心价值: 交易执行路径只关心"执行成功/失败",通知/持久化/统计作为事件消费者独立运行,互不影响。

维度 说明
工作量 ~2-3 天
风险 中(需要重构通知和持久化调用点)
收益 交易主路径不被副作用阻塞,可扩展性大幅提升
影响文件 新建 events.py,重构 position_manager.py, lark_bot.py

【改进 10】风控规则接口化

来源: 项目 D

现状问题:

  • risk_manager.pypre_trade_check() 将 9 项检查硬编码在一个方法中
  • 新增/修改/禁用某条规则需要改核心方法
  • 无法对单条规则做独立回测验证

改进方案:

# 风控规则接口
class RiskRule(ABC):
    @abstractmethod
    def evaluate(self, signal, positions, equity) -> tuple[bool, str]:
        """返回 (通过, 原因)"""

    @property
    @abstractmethod
    def name(self) -> str: ...

# 具体规则实现
class KillSwitchRule(RiskRule):
    name = "kill_switch"
    def evaluate(self, signal, positions, equity):
        if self._kill_switch.is_killed():
            return False, "Kill switch 已激活"
        return True, ""

class DailyLossRule(RiskRule):
    name = "daily_loss"
    def evaluate(self, signal, positions, equity):
        if self._daily_pnl <= self._config.max_daily_loss_usd:
            return False, f"日亏损 {self._daily_pnl} 已触及限额"
        return True, ""

# RiskManager 变为规则引擎
class RiskManager:
    def __init__(self, rules: list[RiskRule]):
        self._rules = rules

    def pre_trade_check(self, signal, positions, equity) -> tuple[bool, list[str]]:
        rejections = []
        for rule in self._rules:
            passed, reason = rule.evaluate(signal, positions, equity)
            if not passed:
                rejections.append(f"[{rule.name}] {reason}")
        return len(rejections) == 0, rejections

核心价值: 每条规则可独立测试、独立开关、独立回测。新增风控规则只需写一个新 class。

维度 说明
工作量 ~2-3 天
风险 中(需要重构现有 9 条规则)
收益 风控可插拔、可测试、可组合
影响文件 risk_manager.py

【改进 11】HTTP API 可观测端点

来源: 项目 A

现状问题:

  • 只能通过 SSH + 日志或飞书推送了解系统状态
  • 无法实时查询当前信号、持仓、风控状态
  • 调试问题需要翻日志文件

改进方案:

轻量 HTTP API(FastAPI 或 aiohttp):
  GET /status     → 系统状态、运行时长、活跃持仓数
  GET /positions  → 当前持仓详情(两腿入场价、当前价、PnL)
  GET /signals    → 最近 N 条信号历史(含拒绝原因)
  GET /metrics    → Z-score、协整强度、对账结果
  GET /health     → 健康检查(WS 连接、DB 连接、最后一次信号时间)

参考实现 (项目 A 的 aiohttp 端点):

app.router.add_get('/diary', handle_diary)   # 交易日记
app.router.add_get('/logs', handle_logs)     # 日志查看
维度 说明
工作量 ~1-2 天
风险 低(只读端点,不修改状态)
收益 远程监控能力,调试效率大幅提升
影响文件 新建 src/services/api_server.py

【改进 12】优雅关闭(Graceful Shutdown)

来源: 项目 B + 项目 E(两个项目独立实现,passivbot 使用 SIGINT + _shutdown_task 防重入)

现状问题:

  • 进程被 kill 时可能:WS 连接未关闭、DB 缓冲区未刷写、未完成订单未取消
  • 可能导致:状态不一致、数据丢失

改进方案:

import signal

def graceful_shutdown(signum, frame):
    logger.warning(f"收到信号 {signum},开始有序关闭...")
    # 1. 停止接收新信号(标记 running = False)
    orchestrator.stop()
    # 2. 等待当前交易完成(设置超时)
    # 3. 关闭 WS 连接
    ws_manager.close()
    # 4. 刷写 DB 缓冲区
    trade_repo.flush()
    # 5. 关闭 DB 连接池
    db_pool.close()
    logger.info("有序关闭完成")
    sys.exit(0)

signal.signal(signal.SIGINT, graceful_shutdown)
signal.signal(signal.SIGTERM, graceful_shutdown)
维度 说明
工作量 ~3-4 小时
风险
收益 防止状态不一致和数据丢失
影响文件 主入口文件,ws_manager.py, trade_repository.py

【改进 13】仓位 Delta 计算模型

来源: 项目 B

现状问题:

  • 开仓/加仓/减仓/平仓的计算逻辑分散在 position_manager.py 各方法中
  • 配对交易两腿的仓位变更没有统一的 delta 抽象

改进方案:

@dataclass
class PositionDelta:
    coin: str
    current_size: float        # 当前仓位
    target_size: float         # 目标仓位
    delta_size: float          # 需要变更的量 (target - current)
    is_reduce_only: bool       # 是否是减仓操作

def compute_deltas(signal, current_positions, equity, risk_config) -> list[PositionDelta]:
    """统一计算两腿的目标仓位差值"""
    # 基于信号强度和账户权益计算目标仓位
    # 统一处理 5 种场景: 新开仓、加仓、减仓、平仓、翻转
    ...

核心价值: 用一个 compute_deltas() 方法统一处理所有仓位变更场景,减少代码重复和边界条件遗漏。

维度 说明
工作量 ~1-2 天
风险
收益 逻辑集中化,减少边界条件 bug
影响文件 position_manager.py

【改进 14】权益比例仓位分配

来源: 项目 B

现状问题:

  • 仓位大小基于固定金额计算
  • 账户权益因盈亏变化后,仓位比例可能不合理(亏损后仓位占比变大 = 隐性加杠杆)

改进方案:

目标仓位计算:
  1. 获取当前账户权益
  2. target_notional = 权益 × position_ratio × signal_strength_scale
  3. 分层硬上限:
     - Layer 1: position_ratio (如 0.05 = 5% 权益)
     - Layer 2: max_leverage (杠杆绝对上限)
     - Layer 3: max_notional_usd (名义值绝对上限)
  4. target_size = min(target_notional, max_notional_usd) / mark_price
维度 说明
工作量 ~4-6 小时
风险 中(需要重新校准参数)
收益 仓位大小随权益动态调整,风险更可控
影响文件 risk_manager.py, position_manager.py

【改进 15】Unstuck 渐进解套机制

来源: 项目 E(passivbot 核心风控,Rust 实现,经 6 年实盘验证)

现状问题:

  • risk_manager.pymax_drawdown_pctdaily_loss_limit 检查
  • 触发后是粗暴的全量平仓(通过 CircuitBreaker 或 KillSwitch)
  • 没有"渐进式小额止损"的概念 — 要么持有要么全平
  • 配对交易中一腿深度被套时,全平会导致另一腿也被迫平仓,破坏对冲结构

改进方案:

class UnstuckManager:
    """被套仓位渐进解套"""

    def __init__(self, config):
        self.loss_allowance_pct = config.unstuck_loss_allowance  # 如 0.01 = 1%
        self.close_pct = config.unstuck_close_pct  # 每次解套比例,如 0.05 = 5%
        self.threshold = config.unstuck_threshold   # 触发阈值,如 0.8
        self._peak_balance = 0.0

    def update_peak(self, balance: float):
        self._peak_balance = max(self._peak_balance, balance)

    def calc_unstuck_action(self, position, balance, mark_price) -> Optional[CloseOrder]:
        """计算渐进止损订单"""
        # 1. 计算亏损预算
        loss_budget = balance - self._peak_balance * (1 - self.loss_allowance_pct)
        if loss_budget <= 0:
            return None  # 已超出亏损预算,不再止损

        # 2. 检查是否达到 unstuck 阈值
        wallet_exposure = abs(position.notional) / balance
        if wallet_exposure < self.threshold * self.max_exposure:
            return None  # 未达阈值

        # 3. 生成小额止损单(只平 close_pct 比例)
        close_qty = abs(position.size) * self.close_pct
        return CloseOrder(
            symbol=position.symbol,
            qty=close_qty,
            side="sell" if position.size > 0 else "buy",
            reduce_only=True,
        )

    def select_unstuck_target(self, positions, mark_prices) -> Optional[Position]:
        """多个被套仓位时,优先处理离市价最近的(止损成本最低)"""
        stuck = [p for p in positions if self._is_stuck(p)]
        if not stuck:
            return None
        return min(stuck, key=lambda p: abs(p.entry_price - mark_prices[p.symbol]) / p.entry_price)

核心逻辑:

  • 峰值余额追踪: 记录历史最高余额,亏损预算 = 当前余额 - 峰值 × (1 - loss_allowance_pct)
  • 优先级排序: 优先处理 |entry_price - market_price| 最小的(止损成本最低)
  • 渐进式: 每次只平一小部分(close_pct),不一次性割肉
  • 预算控制: 亏损预算耗尽后自动停止,不会无限止损
维度 说明
工作量 ~6-8 小时
风险 中(需要仔细调参,避免过早止损)
收益 被套仓位不再只能全平或死扛,特别利好配对交易单腿被套场景
影响文件 risk_manager.py, position_manager.py

【改进 16】WEL + TWEL 双层敞口限制

来源: 项目 E(passivbot 的 risk.rs 核心模块)

现状问题:

  • risk_manager.pymax_position_notional(单仓位上限)和 max_open_positions(持仓数上限)
  • 没有"全账户总敞口"的概念 — 多对配对交易同时持仓时,总敞口可能超出安全范围
  • 没有自动减仓机制 — 超限只能拒绝新单,无法动态调整已有仓位

改进方案:

# WEL = Wallet Exposure Limit(单仓位敞口上限)
# TWEL = Total Wallet Exposure Limit(全账户总敞口上限)

class ExposureLimiter:
    def __init__(self, config):
        self.wel = config.wallet_exposure_limit       # 如 0.1 = 单仓位最多占权益10%
        self.twel = config.total_wallet_exposure_limit # 如 0.3 = 总敞口最多占权益30%
        self.twel_enforcer_threshold = config.twel_enforcer  # 如 0.25 = 25%时开始自动减仓

    def gate_new_entry(self, order, positions, balance) -> Optional[Order]:
        """检查新入场单是否超限"""
        current_total = sum(abs(p.notional) for p in positions.values()) / balance
        if current_total >= self.twel:
            return None  # 总敞口已满,拒绝新单

        # 单仓位 WEL 检查
        position_exposure = abs(order.notional) / balance
        if position_exposure > self.wel:
            order.qty = self.wel * balance / order.price  # 裁剪到 WEL 限额
        return order

    def calc_auto_reduce(self, positions, balance) -> list[CloseOrder]:
        """总敞口超 TWEL Enforcer 阈值时自动减仓"""
        total_exposure = sum(abs(p.notional) for p in positions.values()) / balance
        if total_exposure <= self.twel_enforcer_threshold:
            return []

        # 优先减 price_diff 最小的仓位(最不亏的先减)
        sorted_positions = sorted(
            positions.values(),
            key=lambda p: abs(p.entry_price - p.mark_price) / p.entry_price
        )
        # 计算需要减少的总敞口
        excess = total_exposure - self.twel_enforcer_threshold
        reduce_orders = []
        for pos in sorted_positions:
            if excess <= 0:
                break
            reduce_qty = min(abs(pos.size) * 0.2, excess * balance / pos.mark_price)
            reduce_orders.append(CloseOrder(pos.symbol, reduce_qty, reduce_only=True))
            excess -= reduce_qty * pos.mark_price / balance
        return reduce_orders
维度 说明
工作量 ~4-6 小时
风险 中(需要仔细设定 WEL/TWEL 参数)
收益 全账户级风控提升,防止多对交易总敞口超限
影响文件 risk_manager.py

【改进 17】Warmup 交错预热系统

来源: 项目 E(passivbot 的 staggered warmup)

现状问题:

  • realtime_kline_service_base.py 启动时批量获取 K 线
  • 没有并发控制和抖动机制
  • 如果同时请求多个品种的多个周期(5m/1h/4h),可能触发 API 限流

改进方案:

import asyncio, random

async def warmup_klines_staggered(symbols, intervals, fetcher, concurrency=3):
    """交错式 K 线预热,防止 API 风暴"""
    semaphore = asyncio.Semaphore(concurrency)

    async def fetch_one(symbol, interval):
        async with semaphore:
            jitter = random.uniform(0.1, 0.5)
            await asyncio.sleep(jitter)
            await fetcher.fetch_klines(symbol, interval)

    tasks = [fetch_one(s, i) for s in symbols for i in intervals]
    await asyncio.gather(*tasks, return_exceptions=True)
维度 说明
工作量 ~3-4 小时
风险
收益 防止启动时 API 限流,提升启动稳定性
影响文件 realtime_kline_service_base.py

3.3 P2 — 中价值或高成本(可延后)


【改进 18】双向远程控制(飞书交互式)

来源: 项目 C

现状: 飞书只发不收,远程操作需要 SSH

改进: 利用飞书机器人的消息卡片 + 回调 URL 实现远程控制命令:/status(查状态)、/pause(暂停)、/resume(恢复)、/stop(停止)

维度 说明
工作量 ~1-2 天
风险 中(需飞书应用配置)
收益 远程运维能力

【改进 19】批量下单(减少单腿暴露)

来源: 项目 B

现状: 配对交易两腿逐笔下单,中间有时间差,存在单腿暴露风险

改进: 两腿订单在同一批次提交(Hyperliquid 支持 orders 数组批量提交)

维度 说明
工作量 ~3-4 小时
风险
收益 缩短两腿间时间差

【改进 20】交易日记持久化

来源: 项目 A

现状: 飞书通知是即发即忘,无结构化历史记录

改进: 每笔决策(含被拒绝的信号)写入结构化 JSONL 或 DB 表,用于事后分析和策略优化

维度 说明
工作量 ~3-4 小时
风险
收益 决策可追溯,策略优化有数据支撑

【改进 21】ExchangeAdapter 抽象层

来源: 项目 D + 项目 E(passivbot 的 Hook 分类法:can_*/_do_*/_get_*/_normalize_* 比简单 ABC 更灵活)

现状: HyperliquidExecutor 直接耦合 Hyperliquid SDK

改进: 抽取 ExchangeAdapter 接口,支持未来接入 dYdX、GMX 等交易所

维度 说明
工作量 ~3-5 天
风险 中(接口设计需要前瞻性)
收益 多交易所扩展能力

【改进 22】API 容灾路由

来源: 项目 D

现状: 单一 API endpoint,不可用 = 系统瘫痪

改进: 多端点健康检查 + 自动故障转移(Public API → Chainstack 付费节点)

维度 说明
工作量 ~2-3 天
风险
收益 提升高可用性

【改进 23】LLM 辅助信号过滤

来源: 项目 A

现状: 纯规则驱动信号,极端市况可能产生假信号

改进: 在规则信号触发后,增加 LLM 确认层(不替换规则,仅做过滤)

协整分析 → Z-score 信号 → [LLM 确认/过滤] → 执行
维度 说明
工作量 ~1-2 天
风险 中(引入 LLM 调用延迟 + API 成本)
收益 减少假信号,特别是极端市况下

【改进 24】配对交易回测框架

来源: 项目 E(passivbot 的 Rust 回测引擎 + DEAP 进化算法优化器,50+ 分析指标)

现状: 配对交易参数(Z-score 阈值、EMA 窗口、止损百分比等)全靠手动调参和实盘观察,没有系统化的历史回测验证。

改进:

利用 TimescaleDB 中的历史数据构建回测引擎:

1. 数据层: 从 DB 提取历史 K 线 + Z-score 时间序列
2. 策略回放: 在历史数据上模拟信号生成 → 风控检查 → 仓位变更
3. 多场景: 高波动期、低波动期、趋势行情、震荡行情
4. 分析指标:
   - Sharpe / Sortino / Calmar ratio
   - 最大回撤 + 恢复时间
   - 胜率 + 盈亏比
   - Pair spread 回归时间分布
5. 可优化参数: Z-score 开仓/平仓阈值、EMA 窗口组合、止损/止盈比例
维度 说明
工作量 ~2-3 天
风险 低(纯离线分析工具)
收益 参数验证从经验驱动升级为数据驱动

【改进 25】进化算法参数优化器

来源: 项目 E(passivbot 的 DEAP/NSGA-II 优化器,250 种群 × 500K 迭代)

现状: 参数选择基于经验,无法系统搜索最优组合

改进: 基于改进 24 的回测框架,用进化算法自动搜索最优参数配置

DEAP 框架 (NSGA-II 多目标优化):
- 评分指标: Sharpe ratio + 最大回撤(多目标)
- 约束条件: 回撤 < 15%, 日亏损 < X, 恢复时间 < 48h
- 搜索空间: Z-score 阈值、EMA 窗口、止损比例等
- 输出: Pareto 前沿上的最优配置集合
维度 说明
工作量 ~3-5 天(依赖改进 24)
风险 低(离线工具,不影响实盘)
收益 自动搜索最优参数组合,避免人工调参盲区

3.4 来自项目 F(Hyper-Alpha-Arena)的新增改进


【改进 26】市场制度分类(信号环境过滤)

来源: 项目 F(7 种市场制度,基于 CVD/OI/RSI/ATR 多维度判断)

现状问题:

  • Z-score 信号没有"市场环境"感知
  • 在趋势突破期间,Z-score 偏离可能是趋势延续而非均值回归机会
  • 在流动性陷阱和噪音市中,假信号率高

改进方案:

# 简化版市场制度分类(3 种,适配配对交易)
class MarketRegime(Enum):
    MEAN_REVERTING = "mean_reverting"   # 适合开仓(Absorption/Exhaustion)
    TRENDING = "trending"               # 应提高阈值或抑制(Breakout/Continuation)
    UNCERTAIN = "uncertain"             # 应抑制开仓(Noise/Trap/StopHunt)

def classify_regime(oi_change, funding_rate, price_volatility, cvd_ratio):
    """基于资金流和波动率判断市场环境"""
    # Trending: OI 急增 + CVD 单方向 + 波动率高
    # Mean-reverting: 极端资金费率 + OI 减少 + 价格未跟随资金流
    # Uncertain: 信号不一致
    ...

# 在信号过滤中使用
def should_open_position(z_score, threshold, regime):
    if regime == MarketRegime.UNCERTAIN:
        return False  # 不确定市场不开仓
    if regime == MarketRegime.TRENDING:
        threshold *= 1.5  # 趋势市提高阈值
    if regime == MarketRegime.MEAN_REVERTING:
        threshold *= 0.8  # 均值回归市降低阈值
    return abs(z_score) > threshold
维度 说明
工作量 ~4-6 小时(简化版 3 种制度)
风险 低(作为过滤层,不改变核心信号逻辑)
收益 减少趋势突破期间的假信号,在均值回归环境中更积极
优先级 P0
影响文件 新建 src/services/market_regime.py,修改信号过滤逻辑

【改进 27】资金流确认信号(CVD / OI / Funding Rate)

来源: 项目 F(9 种资金流指标,15 秒聚合窗口)

现状问题:

  • 信号完全基于价格衍生指标(K 线 → Z-score → 协整)
  • 无法感知"大资金在做什么"
  • Z-score 偏离可能是趋势突破(大量新仓进场)而非均值回归

改进方案:

# 通过 Hyperliquid info API 定时采集(不需要 WebSocket)
def get_flow_signals(symbol):
    ctx = info.meta_and_asset_ctxs()  # Hyperliquid API
    return {
        "oi_change": calc_oi_change(ctx, symbol),       # OI 变化
        "funding_rate": ctx[symbol]["funding"],          # 当前资金费率
        "open_interest": ctx[symbol]["openInterest"],    # 总 OI
    }

# 在交易决策中使用
def confirm_signal(z_score_signal, flow_signals):
    """资金流确认层"""
    # OI 急增 → 趋势可能延续 → 抑制均值回归信号
    if flow_signals["oi_change"] > oi_surge_threshold:
        return False

    # 极端资金费率 → 拥挤交易 → 均值回归概率高
    if abs(flow_signals["funding_rate"]) > extreme_funding_threshold:
        return True  # 加强信号

    return z_score_signal  # 默认不改变信号
维度 说明
工作量 ~1-2 天
风险 低(作为确认层,不改变核心信号)
收益 减少趋势突破期间的假信号,识别拥挤交易机会
优先级 P1
影响文件 新建 src/services/flow_signal.py,修改信号确认逻辑

【改进 28】信号边缘触发(防重复开仓)

来源: 项目 F(signal_detection_service.py 边缘检测)

现状问题:

  • Z-score 在持续超阈值期间,每个检查周期都可能触发开仓
  • 可能导致同一次偏离被反复识别为新信号

改进方案:

class EdgeTrigger:
    """边缘触发:仅在首次穿越阈值时触发"""
    def __init__(self):
        self._was_above = False

    def check(self, z_score, threshold) -> bool:
        is_above = abs(z_score) > threshold
        triggered = is_above and not self._was_above  # False → True 转换
        self._was_above = is_above
        return triggered
维度 说明
工作量 ~3-4 小时
风险
收益 防止持续超阈值期间重复开仓
优先级 P1
影响文件 信号生成逻辑

【改进 29】TP/SL 订单去重

来源: 项目 F(三步验证:API 查询 → 价格比较 → 内存缓存)

现状: 没有 TP/SL 去重机制,多次触发可能创建重复的 TP/SL 挂单

改进: 设置 TP/SL 前先查询现有挂单,价格差 <0.1% 视为重复,跳过设置

维度 说明
工作量 ~2-3 小时
风险
收益 防止重复 TP/SL 挂单
优先级 P0

【改进 30】预言机价格硬限制

来源: 项目 F(trading_commands.py 价格钳制)

现状: 改进 2 的 IOC 限价单已提供滑点保护,但缺少最后防线

改进: 在 IOC 滑点保护之外,增加预言机 ±1% 硬限制。分层保护:IOC 限价(±0.25%)→ 预言机硬限制(±1%)

维度 说明
工作量 ~1-2 小时
风险
收益 价格保护最后防线
优先级 P0

【改进 31】WebSocket 降级模式

来源: 项目 F(5 次指数退避 → 120 秒无限重试 + 过时数据检测)

现状: enhanced_ws_manager.py 有重连逻辑,但无降级模式和过时数据检测

改进: 正常模式(5 次指数退避)耗尽后进入降级模式(每 120 秒无限重试)。过时数据(>30 秒未更新)不做交易决策,与 TradingMode 联动:WS 降级时自动切 TP_ONLY 模式。

维度 说明
工作量 ~3-4 小时
风险
收益 WS 故障时安全降级而非静默失败
优先级 P1

4. 实施路线图

Phase 1: 交易安全加固(~2 周)

序号 改进项 优先级 工作量
1 交易所状态定时对账 P0 4-6h
2 IOC 限价单 + 滑点保护 P0 3-4h
30 预言机价格硬限制 P0 1-2h
4 自定义异常体系 P0 4-6h
5 启动配置校验 P0 2-3h
6 订单容差匹配 P0 3-4h
7 TradingMode 状态机 P0 4-6h
8 定期健康摘要 P0 2-3h
26 市场制度分类 P0 4-6h
29 TP/SL 订单去重 P0 2-3h

目标: 防止状态偏离、分层价格保护、错误处理精确化、减少无效API调用、渐进式降级、信号环境感知、防重复挂单

Phase 2: 开发效率提升(~1 周)

序号 改进项 优先级 工作量
3 模拟交易模式 P0 3-4h
12 优雅关闭 P1 3-4h
11 HTTP API 可观测端点 P1 1-2d

目标: 策略验证零成本、进程关闭安全、远程监控能力

Phase 3: 风控 + 信号增强(~2-3 周)

序号 改进项 优先级 工作量
9 EventBus 事件总线 P1 2-3d
10 风控规则接口化 P1 2-3d
13 仓位 Delta 计算模型 P1 1-2d
14 权益比例仓位分配 P1 4-6h
15 Unstuck 渐进解套 P1 6-8h
16 WEL + TWEL 双层敞口限制 P1 4-6h
17 Warmup 交错预热 P1 3-4h
27 资金流确认信号 P1 1-2d
28 信号边缘触发 P1 3-4h
31 WebSocket 降级模式 P1 3-4h

目标: 解耦核心与副作用、风控渐进化 + 敞口分层、信号多维度确认、防重复触发、WS 降级安全

Phase 4: 远程运维 + 扩展性(按需)

序号 改进项 优先级 工作量
18 双向远程控制 P2 1-2d
19 批量下单 P2 3-4h
20 交易日记持久化 P2 3-4h
21-23 ExchangeAdapter / API容灾 / LLM过滤 P2 按需

Phase 5: 数据驱动优化(按需)

序号 改进项 优先级 工作量
24 配对交易回测框架 P2 2-3d
25 进化算法参数优化器 P2 3-5d

目标: 从经验调参升级为数据驱动,自动搜索最优参数组合


5. 改进来源交叉矩阵

下表展示每项改进的来源项目和在各项目中的验证程度:

改进项 项目A (Nocturne) 项目B (copytrading) 项目C (CopyTrader) 项目D (trading-bot) 项目E (passivbot) 项目F (Alpha-Arena)
1. 对账机制 ✅ 提出思想 完整实现 ✅ 无状态设计原则
2. IOC 限价单 完整实现
3. 模拟交易 完整实现
4. 自定义异常 完整实现
5. 配置校验 ✅ 类型化 loader Pydantic ✅ YAML 校验 ✅ config_utils
6. 订单容差匹配 完整实现
7. TradingMode 状态机 完整实现
8. 定期健康摘要 完整实现
9. EventBus 完整实现
10. 风控接口化 完整实现
11. HTTP 可观测 完整实现
12. 优雅关闭 完整实现 ✅ SIGINT 防重入
13. Delta 模型 完整实现
14. 权益比例分配 完整实现 ✅ balance ratio ✅ WEL 概念
15. Unstuck 解套 完整实现
16. TWEL 双层敞口 完整实现
17. Warmup 预热 完整实现
18. 远程控制 ✅ HTTP API Telegram
19. 批量下单 完整实现 ✅ asyncio.gather
21. ExchangeAdapter ✅ ABC 接口 Hook 分类法
24. 回测框架 完整实现 ✅ 事件驱动回测
25. 进化算法优化 完整实现
26. 市场制度分类 完整实现
27. 资金流确认信号 完整实现
28. 信号边缘触发 完整实现
29. TP/SL 去重 完整实现
30. 预言机价格硬限制 完整实现
31. WebSocket 降级 完整实现

: 有 2+ 个项目独立提出的改进(对账、配置校验、优雅关闭、远程控制、权益比例、ExchangeAdapter、批量下单、回测框架)具有更高的可信度。


6. 总结

核心发现

  1. 最高共识改进: 交易所状态对账(3 个项目独立提出/实践)、启动配置校验(4 个项目都有实现)、优雅关闭(2 个项目独立实现)、回测框架(2 个项目独立实现)
  2. 最高性价比: 预言机价格硬限制(1-2h 补全价格保护最后防线)、订单容差匹配(3-4h 减少 50%+ API 调用)、TP/SL 去重(2-3h 防重复挂单)、定期健康摘要(2-3h 提升可观测性)
  3. 最大风控收益: Unstuck 渐进解套 + WEL/TWEL 双层敞口(从"全有或全无"进化为渐进式风控)
  4. 最大架构收益: EventBus + 风控接口化 + TradingMode 状态机(解耦 + 可扩展 + 渐进降级)
  5. 最大信号收益: 市场制度分类 + 资金流确认 + 边缘触发(信号从"数值阈值"进化为"环境感知 + 多维确认")
  6. 最大长期收益: 回测框架 + 进化算法优化器(从经验调参升级为数据驱动)
  7. 当前项目已处于领先: 在持久化、崩溃恢复、安全防护、信号系统方面,6 个参考项目无一能匹配

建议优先级排序(前 8 名)

排名 改进项 理由
1 交易所状态定时对账 3 项目共识 + 直接影响交易安全
2 订单容差匹配 成本极低 + 减少 50%+ 无效 API 调用 + 保护薄盘口
3 IOC 限价单 + 滑点保护 成本极低 + PURR 流动性差需要
4 TradingMode 状态机 5 种模式替代粗暴 KillSwitch,支持渐进降级
5 定期健康摘要 2-3 小时 + 确认系统存活 + 发现内存泄漏
6 模拟交易模式 成本低 + 大幅降低测试成本
7 自定义异常体系 渐进式改进 + 改善全模块错误处理
8 启动配置校验 2 小时 + 避免运行时崩溃

Passivbot 额外洞察

passivbot 作为 1,860 stars / 6 年迭代的成熟项目,带来了前 4 个项目未涉及的关键维度:

维度 核心洞察 对当前项目的价值
执行效率 理想订单 vs 实际订单差异对比,只操作变化部分 减少 API 调用,保护 PURR 薄盘口
渐进式风控 Unstuck / Auto-reduce / TWEL Enforcer 层层递进 从"全平或死扛"进化为精细化仓位管理
运行模式 5 种 TradingMode 支持不同运行场景 日损接近限额时自动切 TpOnly,维护时 GracefulStop
参数验证 回测 → 优化 → 实盘 → 回测的闭环 补齐当前项目缺失的回测环节
系统可观测 定期健康摘要 + 内存监控 + EMA 门控日志 长期运行的稳定性保障

Hyper-Alpha-Arena 额外洞察

Hyper-Alpha-Arena 作为 582 stars 的全栈 AI 交易平台,带来了前 5 个项目未涉及的关键维度:

维度 核心洞察 对当前项目的价值
信号环境感知 7 种市场制度分类(StopHunt/Absorption/Breakout 等) Z-score 阈值在不同市场环境下动态调整
多维信号确认 CVD + OI + Funding Rate + 订单簿深度 配对信号从单一 Z-score 进化为多维确认
信号去噪 边缘触发(False→True 转换才触发) 防止持续超阈值期间重复开仓
价格保护 TP/SL 去重 + 预言机硬限制 补全分层价格保护的最后防线
连接韧性 WS 降级模式 + 过时数据检测 WS 故障时安全降级而非静默失败

一句话总结

当前项目在交易安全数据持久化上已处于领先,最大的提升空间在于执行效率(订单容差匹配)、渐进式风控(Unstuck + TWEL 替代粗暴全平)、运行模式(TradingMode 状态机替代 KillSwitch)、信号智能化(市场制度分类 + 资金流确认 + 边缘触发)、可观测性(健康摘要 + HTTP API)和参数验证闭环(回测框架)。

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