币本位持仓卡权利金/回收/门控改为按ETH/BTC展示,避免误标USDC与两位小数抹零
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -60,6 +60,14 @@ def is_close_gate_passed(inst_id: str) -> bool:
|
||||
return bool((_gates.get(inst) or {}).get("passed"))
|
||||
|
||||
|
||||
def _fmt_gate_amt(v: float, *, ccy: str) -> str:
|
||||
unit = (ccy or "USDC").strip().upper() or "USDC"
|
||||
if unit in ("ETH", "BTC"):
|
||||
txt = f"{float(v):.8f}".rstrip("0").rstrip(".")
|
||||
return txt or "0"
|
||||
return f"{float(v):.4f}"
|
||||
|
||||
|
||||
def update_close_gate(
|
||||
inst_id: str,
|
||||
*,
|
||||
@@ -68,6 +76,7 @@ def update_close_gate(
|
||||
now: float | None = None,
|
||||
min_mult: float | None = None,
|
||||
hold_seconds: float | None = None,
|
||||
premium_ccy: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
"""
|
||||
根据当前买盘可回收金额刷新门控.
|
||||
@@ -89,9 +98,16 @@ def update_close_gate(
|
||||
if hold < 0:
|
||||
hold = 0.0
|
||||
|
||||
with _lock:
|
||||
prev_ccy = (_gates.get(inst) or {}).get("premium_ccy")
|
||||
ccy = (premium_ccy or prev_ccy or "USDC").strip().upper() or "USDC"
|
||||
if ccy not in ("ETH", "BTC", "USDC"):
|
||||
ccy = "USDC"
|
||||
need_decimals = 8 if ccy in ("ETH", "BTC") else 4
|
||||
|
||||
prem = _safe_float(premium_paid)
|
||||
recv = _safe_float(recycle_usdc)
|
||||
need = round(prem * mult, 4) if prem is not None and prem > 0 else None
|
||||
need = round(prem * mult, need_decimals) if prem is not None and prem > 0 else None
|
||||
recycle_ok = bool(
|
||||
prem is not None and prem > 0 and recv is not None and need is not None and recv + 1e-12 >= need
|
||||
)
|
||||
@@ -117,6 +133,7 @@ def update_close_gate(
|
||||
"min_mult": mult,
|
||||
"hold_seconds": hold,
|
||||
"passed": passed,
|
||||
"premium_ccy": ccy,
|
||||
}
|
||||
_gates[inst] = state
|
||||
|
||||
@@ -126,10 +143,13 @@ def update_close_gate(
|
||||
elif recv is None:
|
||||
msg = "暂无有效买盘可回收金额"
|
||||
elif not recycle_ok:
|
||||
msg = f"可回收 {recv:.4f} USDC < 权利金×{mult:g}({need:.4f}),目标平仓门控未过"
|
||||
msg = (
|
||||
f"可回收 {_fmt_gate_amt(recv, ccy=ccy)} {ccy} < 权利金×{mult:g}"
|
||||
f"({_fmt_gate_amt(need, ccy=ccy)}),目标平仓门控未过"
|
||||
)
|
||||
elif not ready:
|
||||
msg = (
|
||||
f"可回收已达×{mult:g}({recv:.4f}/{need:.4f}),"
|
||||
f"可回收已达×{mult:g}({_fmt_gate_amt(recv, ccy=ccy)}/{_fmt_gate_amt(need, ccy=ccy)} {ccy}),"
|
||||
f"需再持续 {remain:.0f}s(已 {held:.0f}/{hold:.0f}s)门控才通过"
|
||||
)
|
||||
else:
|
||||
@@ -144,6 +164,7 @@ def update_close_gate(
|
||||
"recycle_usdc": recv,
|
||||
"premium_paid": prem,
|
||||
"need_recycle_usdc": need,
|
||||
"premium_ccy": ccy,
|
||||
"min_mult": mult,
|
||||
"hold_seconds": hold,
|
||||
"held_seconds": round(held, 1) if recycle_ok else 0.0,
|
||||
@@ -160,25 +181,39 @@ def check_close_gate(
|
||||
*,
|
||||
recycle_usdc: float | None = None,
|
||||
premium_paid: float | None = None,
|
||||
premium_ccy: str | None = None,
|
||||
refresh: bool = True,
|
||||
) -> dict[str, Any]:
|
||||
"""检查是否允许平仓;默认先用最新回收/权利金刷新."""
|
||||
inst = (inst_id or "").strip()
|
||||
if refresh:
|
||||
if recycle_usdc is None or premium_paid is None:
|
||||
if recycle_usdc is None or premium_paid is None or premium_ccy is None:
|
||||
with _lock:
|
||||
prev = _gates.get(inst) or {}
|
||||
if recycle_usdc is None:
|
||||
recycle_usdc = prev.get("recycle")
|
||||
if premium_paid is None:
|
||||
premium_paid = prev.get("premium")
|
||||
return update_close_gate(inst, recycle_usdc=recycle_usdc, premium_paid=premium_paid)
|
||||
if premium_ccy is None:
|
||||
premium_ccy = prev.get("premium_ccy")
|
||||
return update_close_gate(
|
||||
inst,
|
||||
recycle_usdc=recycle_usdc,
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
)
|
||||
with _lock:
|
||||
prev = _gates.get(inst)
|
||||
if not prev:
|
||||
return update_close_gate(inst, recycle_usdc=recycle_usdc, premium_paid=premium_paid)
|
||||
return update_close_gate(
|
||||
inst,
|
||||
recycle_usdc=recycle_usdc,
|
||||
premium_paid=premium_paid,
|
||||
premium_ccy=premium_ccy,
|
||||
)
|
||||
return update_close_gate(
|
||||
inst,
|
||||
recycle_usdc=recycle_usdc if recycle_usdc is not None else prev.get("recycle"),
|
||||
premium_paid=premium_paid if premium_paid is not None else prev.get("premium"),
|
||||
premium_ccy=premium_ccy if premium_ccy is not None else prev.get("premium_ccy"),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user