Fold chain/account/PnL hints into rules; hide dust sell-coin.

Move the three noisy help lines into 规则说明, and show 手动卖回币 only when trading-coin balance meets the exchange min size.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-14 19:31:14 +08:00
parent 1d71414c56
commit ab7a2309ad
3 changed files with 110 additions and 18 deletions
+59 -1
View File
@@ -1281,10 +1281,47 @@ def register_hedge_plan_routes(app: Flask, cfg: dict[str, Any]) -> None:
pass
return jsonify(result)
@app.route("/api/hedge-plan/sell-coin-status")
@lr
def api_hedge_sell_coin_status():
"""是否显示「手动卖回币」:交易户有币且 ≥ 现货最小卖出量(粉尘隐藏)."""
if not _hedge_enabled():
return jsonify({"ok": False, "sellable": False, "msg": "对冲模块未启用"})
ex = cfg.get("exchange_options") or cfg.get("exchange")
if ex is None:
return jsonify({"ok": False, "sellable": False, "msg": "交易所未配置"})
underlying = str(
request.args.get("underlying") or cfg.get("default_underly") or "ETH"
).strip().upper()
if underlying not in ("ETH", "BTC"):
return jsonify({"ok": False, "sellable": False, "msg": "标的仅支持 ETH/BTC"})
from lib.options.options_spot_bridge_lib import (
fetch_trading_coin_available,
is_sellable_spot_coin,
spot_min_sell_sz,
)
avail = fetch_trading_coin_available(ex, underlying)
try:
avail_f = float(avail) if avail is not None else 0.0
except (TypeError, ValueError):
avail_f = 0.0
min_sz = float(spot_min_sell_sz(ex, underlying))
sellable = is_sellable_spot_coin(ex, underlying, avail_f)
return jsonify(
{
"ok": True,
"underlying": underlying,
"available": avail_f,
"min_sz": min_sz,
"sellable": bool(sellable),
}
)
@app.route("/api/hedge-plan/sell-coin", methods=["POST"])
@lr
def api_hedge_sell_coin():
"""手动卖回币:市价卖出交易账户全部可用标的币换 USDT."""
"""手动卖回币:市价卖出交易账户全部可用标的币换 USDT(粉尘拒绝)."""
if not _hedge_enabled():
return jsonify({"ok": False, "msg": "对冲模块未启用"}), 400
ex = cfg.get("exchange_options") or cfg.get("exchange")
@@ -1294,6 +1331,27 @@ def register_hedge_plan_routes(app: Flask, cfg: dict[str, Any]) -> None:
underlying = str(data.get("underlying") or cfg.get("default_underly") or "ETH").strip().upper()
if underlying not in ("ETH", "BTC"):
return jsonify({"ok": False, "msg": "标的仅支持 ETH/BTC"}), 400
from lib.options.options_spot_bridge_lib import (
fetch_trading_coin_available,
is_sellable_spot_coin,
spot_min_sell_sz,
)
avail = fetch_trading_coin_available(ex, underlying)
try:
avail_f = float(avail) if avail is not None else 0.0
except (TypeError, ValueError):
avail_f = 0.0
if not is_sellable_spot_coin(ex, underlying, avail_f):
min_sz = spot_min_sell_sz(ex, underlying)
return jsonify(
{
"ok": False,
"msg": f"无足够 {underlying} 可卖(可用 {avail_f:g} · 最小 {min_sz:g})",
"available": avail_f,
"min_sz": min_sz,
}
), 400
conn = cfg["get_db"]()
try:
from lib.options.options_db import init_options_tables
@@ -50,6 +50,9 @@
<p><strong>手动下单</strong>:开仓按<strong>卖一限价</strong>(非交易所市价)。先开期权(按张数买币并+5%滑点),再开永续。永续杠杆取 env:BTC=<code>BTC_LEVERAGE</code>/ETH=<code>ALT_LEVERAGE</code>。</p>
<p><strong>出场</strong>:盈利金额(扣开平双边手续费后净利)或目标位点数二选一。平仓先期权(须买一流动性)再永续,再把币全部卖回 USDT。一账户同时仅一笔对冲仓。</p>
<p><strong>开仓校验</strong>:已选合约 · 张数≥1 · 出场条件已填 · 门禁「开仓:可」· 账户有足够交易 USDT。</p>
<p><strong>期权链</strong>:默认显示约 <strong>5</strong> 档(平值 + 实值2 + 虚值2);勾选「展开全部」查看该到期更多行权价。</p>
<p><strong>账户</strong>:期权币本位 · 交易/资金计 USDT · 永续全仓 / 期权逐仓(余额见下方划转)。</p>
<p><strong>组合净盈亏</strong>:扣开平双边手续费;永续按平仓方向盘口均价估值。</p>
<p class="muted" id="hp-po-pair-hint">买 Call + 永续空 · 点「选择」弹窗下单。</p>
</div>
</details>
@@ -100,7 +103,7 @@
</tbody>
</table>
</div>
<div id="hp-opt-bal-line" class="muted hp-po-meta hp-opt-bal-line"></div>
<div id="hp-opt-bal-line" class="muted hp-po-meta hp-opt-bal-line" hidden aria-hidden="true"></div>
<div class="hp-oo-transfer hp-oo-transfer--compact" id="hp-po-transfer">
<div class="hp-oo-transfer-bals muted">
<span>资金 <strong id="hp-po-funding-usdt">—</strong></span>
@@ -234,11 +237,11 @@
<div class="options-pos-head">
<h2>持仓</h2>
<div class="options-pos-head-actions">
<button type="button" class="btn-secondary" id="hp-sell-coin-btn" title="市价卖出交易账户全部可用标的币(当前选中 ETH/BTC)换回 USDT">手动卖回币</button>
<button type="button" class="btn-secondary" id="hp-sell-coin-btn" hidden title="市价卖出交易账户全部可用标的币(当前选中 ETH/BTC)换回 USDT">手动卖回币</button>
<button type="button" class="btn-secondary" id="hp-pos-refresh" title="刷新持仓与历史">刷新</button>
</div>
</div>
<div class="muted" id="hp-sell-coin-msg" style="font-size:.72rem;margin:0 0 6px"></div>
<div class="muted" id="hp-sell-coin-msg" hidden style="font-size:.72rem;margin:0 0 6px"></div>
<div class="options-pos-tabs" role="tablist" aria-label="永期持仓面板">
<button type="button" class="btn-secondary opt-pos-tab hp-pos-tab active" data-hp-pos-tab="live" role="tab" aria-selected="true">当前持仓</button>
<button type="button" class="btn-secondary opt-pos-tab hp-pos-tab" data-hp-pos-tab="plans" role="tab" aria-selected="false">对冲计划</button>
@@ -494,4 +497,4 @@
</div>
</div>
</div>
<script src="/static/hedge_plan.js?v=61"></script>
<script src="/static/hedge_plan.js?v=62"></script>