Переглянути джерело

feat: support base clip leverage scaling

helium3@sina.com 2 місяців тому
батько
коміт
421afdd139

+ 5 - 2
apps/runner/src/index.ts

@@ -76,6 +76,7 @@ const fillHandlers = new Map<string, Array<(fill: Fill) => Promise<void>>>();
 let killSwitchActive = false;
 let gridMakerInstance: GridMaker | undefined;
 const baseClipEquityPct = cfg.grid?.base_clip_equity_pct ?? 0;
+const baseClipLeverage = cfg.grid?.base_clip_leverage ?? 1;
 const baseClipUsdFloor = cfg.grid?.base_clip_usd ?? 0;
 const wsRateLimiterConfig = cfg.execution?.ws_rate_limiter;
 let marketMakerInstance: MarketMaker | undefined;
@@ -287,7 +288,8 @@ const defaultGridSymbol = cfg.grid?.symbol || primarySymbol;
       const equity = aggregated.quote + aggregated.base * mid;
       riskEngine.updateEquity(equity);
       if (gridMakerInstance && baseClipEquityPct > 0) {
-        const dynamicClip = Math.max(baseClipUsdFloor, equity * baseClipEquityPct);
+        const effectiveEquity = equity * Math.max(1, baseClipLeverage);
+        const dynamicClip = Math.max(baseClipUsdFloor, effectiveEquity * baseClipEquityPct);
         gridMakerInstance.updateBaseClipUsd(dynamicClip);
       }
       await maybeTriggerKillSwitch('risk_refresh');
@@ -456,7 +458,8 @@ const defaultGridSymbol = cfg.grid?.symbol || primarySymbol;
       if (baseClipEquityPct <= 0) return baseClipUsdFloor;
       const status = riskEngine.getStatus();
       const equity = status.currentEquity > 0 ? status.currentEquity : status.peakEquity;
-      const dynamic = equity * baseClipEquityPct;
+      const effectiveEquity = equity * Math.max(1, baseClipLeverage);
+      const dynamic = effectiveEquity * baseClipEquityPct;
       return Math.max(baseClipUsdFloor, dynamic);
     };
 

+ 1 - 0
config/config.example.yaml

@@ -29,6 +29,7 @@ grid:
   grid_range_bps: 400  # 网格范围 4%(基于极端波动:BTC 3-5%, ETH 4-6%, SOL 6-10%)
   base_clip_usd: 500   # 单层订单大小(USD)
   base_clip_equity_pct: 0.01  # 按账户权益比例(1%)动态调整,取最大值
+  base_clip_leverage: 1       # 动态 clip 杠杆倍数
   max_layers: 4        # 单边最大层数
   hedge_threshold_base: 0.3  # 累积 0.3 BTC 触发对冲(批量对冲模式)
   tick_size: 1         # 价格步长

+ 1 - 0
config/config.yaml

@@ -28,6 +28,7 @@ grid:
   grid_range_bps: 300  # 覆盖范围 2%
   base_clip_usd: 15   # 单层订单大小(USD)
   base_clip_equity_pct: 0.01 # 按账户权益比例(1%)动态调整,取最大值
+  base_clip_leverage: 20       # 动态 clip 计算时的杠杆倍数(>=1)
   max_layers: 15        # 单边最大层数
   hedge_threshold_base: 0.12  # 累积 0.3 BTC 触发对冲(批量对冲模式)
   tick_size: 1         # 价格步长

+ 2 - 1
docs/CONFIG_REFERENCE.md

@@ -111,7 +111,8 @@ grid:
 | `grid_step_bps` | `10`–`300` (默认 `30`) | 初始单层间距 (bps),自适应启用时作为参考值 | 支持,立即重挂 |
 | `grid_range_bps` | `200`–`800` | 覆盖范围 | 更新后触发 `reset()` |
 | `base_clip_usd` | >0 | 单层挂单名义 | 支持 |
-| `base_clip_equity_pct` | 0–1 | 按权益比例动态计算的最小 clip(取 `max(base_clip_usd, equity * pct)`) | 支持 |
+| `base_clip_equity_pct` | 0–1 | 按权益比例动态计算的最小 clip(取 `max(base_clip_usd, equity * pct * base_clip_leverage)`) | 支持 |
+| `base_clip_leverage` | ≥1 | 动态 clip 计算时的杠杆倍数 | 支持 |
 | `max_layers` | `2`–`16` | 每侧层数上限 | 支持 |
 | `incremental_mode` | bool (默认 `false`) | 启用增量更新模式(优先进行 `reconcileGrid`,减少全量撤挂) | 支持 |
 | `tick_size` | `>0` (默认 `1`) | 价格步长;下单时按此对报价做整形 | 支持 |