2.5 KiB
2.5 KiB
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 模式):
fetch_balance()+fetch_positions()拿实时 total / 持仓占用target = total × 0.70; 已用 ≤ target → 不动margin_per_ct = initialMargin / contracts(实测值, 含浮盈亏)reduce_ct = ceil((已用 − target) / margin_per_ct, 到 lot step)- 市价
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 拍板"现有的仓位按这个来减", 存量立即对齐