# v4.5.86 (2026-09-11) 单币种上限 70% 配置化 + 存量减仓实证 ## 用户原话 - "可用资金大于100刀了,现在要控制仓位了,一个币种满仓最多就是200刀的70%。现在将近300刀,就要分配一下了,你规划一下,这个分配的算法。先计划,不修改。" - "多币方案是,比如现在一共是290刀,单币种上限是200刀,暂定,可配置的。你看看。现有的仓位按这个来减。" ## 改动清单 (1 行配置 + 0 行代码) `~/.hermes/skills/trading/okx-auto-position/config.json`: ```json "position_sizing": { "balance_utilization": 0.60, "single_coin_max_pct": 0.70, // ← 新增 (旧: 代码 fallback 0.75) ... } ``` advisor 既有代码 (不用改): ```python single_coin_cap_pct = cfg('position_sizing', 'single_coin_max_pct', 0.75) total_cap = acct_info['total_capital'] # = free + used_margin, 实时 single_coin_cap = total_cap * single_coin_cap_pct single_coin_avail = max(0, single_coin_cap - same_coin_margin) avail_margin = min(free/1.07, single_coin_avail/1.07) # SAFETY_FACTOR 见 v4.5.74 ``` 验证: `python3 -c "from config_loader import get; print(get('position_sizing','single_coin_max_pct'))"` → `0.7` ✓ ## 存量减仓实证 (2026-09-11) | 项 | 减仓前 | 减仓后 | |---|---|---| | SKHYNIX long @10x | 1.784 张 / $229.10 (73.9%) | **1.69 张 / $217.06 (69.8%)** ✓ | | Free | $76.85 | $93.78 | | Total | $310.14 | $310.83 | 流程 (`/tmp/reduce_to_70.py` 模式): 1. `fetch_balance()` + `fetch_positions()` 拿实时 total / 持仓占用 2. `target = total × 0.70`; 已用 ≤ target → 不动 3. `margin_per_ct = initialMargin / contracts` (**实测值**, 含浮盈亏) 4. `reduce_ct = ceil((已用 − target) / margin_per_ct, 到 lot step)` 5. 市价 `reduceOnly=True` 反方向平 → sleep 2 → 重 fetch 验证占用 ≤70% ## 多币分配语义 (user 选定 "先到先得") - 无预约槽位/均分 — 每个信号独立 `min(该币剩余额度, free/1.07)` - 第 1 个币最多吃满 70%, 后续信号只能用剩余 Free - 上限随 total_capital 浮动: 赚钱 → 上限自动涨; 亏钱 → 自动缩 ## 坑 - ❌ 硬编码 0.70 进 advisor (违反"任何名单/阈值不硬编码"铁律) — 走 config - ❌ 每张保证金用理论值 `ctVal×price/lev` — 浮盈亏会让实际 initialMargin 偏离, 用实测 - ❌ 减仓后不验证 — 必须 re-fetch 确认占用真的 ≤ 70% - ❌ 只减增量不管存量 — user 拍板"现有的仓位按这个来减", 存量立即对齐