Files
Hermes-Skills/okx-auto-position/references/v4.5.86-2026-09-11-single-coin-70pct-config-driven.md
T

2.5 KiB
Raw Blame History

v4.5.86 (2026-09-11) 单币种上限 70% 配置化 + 存量减仓实证

用户原话

  • "可用资金大于100刀了,现在要控制仓位了,一个币种满仓最多就是200刀的70%。现在将近300刀,就要分配一下了,你规划一下,这个分配的算法。先计划,不修改。"
  • "多币方案是,比如现在一共是290刀,单币种上限是200刀,暂定,可配置的。你看看。现有的仓位按这个来减。"

改动清单 (1 行配置 + 0 行代码)

~/.hermes/skills/trading/okx-auto-position/config.json:

"position_sizing": {
    "balance_utilization": 0.60,
    "single_coin_max_pct": 0.70,   // ← 新增 (旧: 代码 fallback 0.75)
    ...
}

advisor 既有代码 (不用改):

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 拍板"现有的仓位按这个来减", 存量立即对齐