# Proxy SSL EOF 平仓兜底 + cross 降杠杆 59108 (2026-09-13 实战总结) ## 1. 平仓时 `_okx_raw_request 返回 None` = proxy (clash 127.0.0.1:7890) SSL 抽风 现象: process_signal 处理 close 信号报 `❌ 平仓失败: _okx_raw_request 返回 None (proxy 抽风?)` 处理顺序: 1. `sleep 15~30` 后重跑同一信号 (先 `DELETE FROM processed` 清 msg_hash) 2. 仍失败 → 手动 raw REST 市价 reduceOnly 平仓 (模板见下) 3. 用户在 OKX app 手动平是最后兜底 (app 不走 proxy, 最快) ### 手动平仓模板 (按方向选 side, 张数=当前持仓) ```python import json,time,hmac,hashlib,base64,requests def okx_post(path, body, t=15): creds=open('/home/openclaw/.bashrc').read() k=s=pw=None for l in creds.splitlines(): if l.startswith('export OKX_API_KEY='): k=l.split('=',1)[1].strip().strip('"') elif l.startswith('export OKX_SECRET='): s=l.split('=',1)[1].strip().strip('"') elif l.startswith('export OKX_PASSPHRASE='): pw=l.split('=',1)[1].strip().strip('"') ts=time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime()) body_str=json.dumps(body) pre=ts+'POST'+path+body_str sig=base64.b64encode(hmac.new(s.encode(),pre.encode(),hashlib.sha256).digest()).decode() h={'OK-ACCESS-KEY':k,'OK-ACCESS-SIGN':sig,'OK-ACCESS-TIMESTAMP':ts,'OK-ACCESS-PASSPHRASE':pw,'Content-Type':'application/json'} proxies={'http':'http://127.0.0.1:7890','https':'http://127.0.0.1:7890'} return requests.post('https://www.okx.com'+path,headers=h,data=body_str,timeout=t,proxies=proxies).json() # long 平仓 → side=sell; short 平仓 → side=buy; sz=当前张数 body={"instId":"ETH-USDT-SWAP","tdMode":"cross","side":"buy","posSide":"net","ordType":"market","sz":"8.48","reduceOnly":True} print(okx_post('/api/v5/trade/order', body)) ``` 平仓后必须 `release_lock(symbol, trader, auto=True)` 释放 position_locks。 ## 2. cross 全仓模式降杠杆必报 59108 `{"code":"59108","msg":"Your account leverage is too low and has insufficient margins."}` 原因: 目标杠杆所需保证金 > 当前可用余额。降杠杆(如10x→2x)会提高保证金要求, 持仓时余额不够就拒。 结论: **降杠杆信号在持仓状态下无法直接执行**, 只有两条路: - 先减仓释放保证金, 再 set-leverage - 跳过降杠杆, 保持原杠杆等平仓信号 (实战默认做法, 已向用户说明) 加杠杆(如3x→10x)不受影响, 直接成功。 ## 3. advisor execute 张数 ≠ 建议张数 (已知 bug, 方向总是对) advisor JSON 报 contracts=X (如 0.065/78/0.85), 实际成交 ~3X (0.098/236/2.58)。方向与杠杆正确, 张数偏大。 实战处理: execute 后必须 check_account.py 实查真实张数再汇报, 不引用 advisor 数字。 ## 4. 调杠杆信号直通 set-leverage (v4.5.94) classify_signal: 文本含 `修改了杠杆/调整了杠杆` → `adjust_leverage` → 白名单闸通过 → 跳过 advisor 直接 `adjust_leverage_raw(symbol, 目标倍数)`。 目标倍数取信号 `【杠杆】` 字段 (即 "3→5" 里的 5), 不是当前值。 加杠杆直接成功; 降杠杆撞 59108 → 汇报失败原因, 不反复重试。