修复复盘盈亏未按ETH指数折U;买一平仓取消确认,自动卖回USDT。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2128,24 +2128,13 @@
|
|||||||
alert("暂无有效买一深度,请稍后重试或到 OKX App 挂限价");
|
alert("暂无有效买一深度,请稍后重试或到 OKX App 挂限价");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const lv = (preview.levels && preview.levels[0]) || {};
|
|
||||||
const posLike = {
|
const posLike = {
|
||||||
inst_id: inst,
|
inst_id: inst,
|
||||||
premium_ccy: q.premium_ccy || (preview.close_gate && preview.close_gate.premium_ccy) || null,
|
premium_ccy: q.premium_ccy || (preview.close_gate && preview.close_gate.premium_ccy) || null,
|
||||||
margin_mode: q.options_margin_mode || q.margin_mode || null,
|
margin_mode: q.options_margin_mode || q.margin_mode || null,
|
||||||
};
|
};
|
||||||
const premCcy = posPremiumCcy(posLike);
|
const premCcy = posPremiumCcy(posLike);
|
||||||
const msg = [
|
// 买一平仓后币本位会自动卖回 ETH/BTC→USDT,不再弹确认框
|
||||||
"按买一限价卖出本轮可平张数?",
|
|
||||||
"合约: " + inst,
|
|
||||||
"锁定买一: " + (lv.px != null ? lv.px : "—") + " × " + (lv.sheets != null ? lv.sheets : preview.covered_sheets) + " 张",
|
|
||||||
"预计收回: " + fmtClosePreviewText(preview, posLike),
|
|
||||||
preview.estimated_pnl != null
|
|
||||||
? ("预估盈亏: " + fmtPremiumAmtSigned(preview.estimated_pnl, premCcy))
|
|
||||||
: "",
|
|
||||||
preview.uncovered_sheets > 0 ? "\n注意: 买一深度不足,预计仍剩 " + preview.uncovered_sheets + " 张,需下次再平。" : ""
|
|
||||||
].filter(function (x) { return x !== ""; }).join("\n");
|
|
||||||
if (!confirm(msg)) return;
|
|
||||||
if (btn) btn.disabled = true;
|
if (btn) btn.disabled = true;
|
||||||
try {
|
try {
|
||||||
const r = await apiJson("/api/options/close", {
|
const r = await apiJson("/api/options/close", {
|
||||||
@@ -2161,6 +2150,12 @@
|
|||||||
}
|
}
|
||||||
if (r.remaining_sheets > 0) okMsg += "\n剩余: " + r.remaining_sheets + " 张(下次再平)";
|
if (r.remaining_sheets > 0) okMsg += "\n剩余: " + r.remaining_sheets + " 张(下次再平)";
|
||||||
if (r.stopped_reason) okMsg += "\n状态: " + r.stopped_reason;
|
if (r.stopped_reason) okMsg += "\n状态: " + r.stopped_reason;
|
||||||
|
const ss = r.spot_sell;
|
||||||
|
if (ss && ss.ok && !ss.skipped) {
|
||||||
|
okMsg += "\n已自动卖回 USDT";
|
||||||
|
} else if (ss && ss.bridge_status === "pending_sell_spot") {
|
||||||
|
okMsg += "\n卖回 USDT 失败,请点「重试卖回」";
|
||||||
|
}
|
||||||
alert(okMsg);
|
alert(okMsg);
|
||||||
} else {
|
} else {
|
||||||
alert(r.msg || "平仓失败");
|
alert(r.msg || "平仓失败");
|
||||||
|
|||||||
@@ -298,21 +298,43 @@ def sync_options_from_local_trades(
|
|||||||
|
|
||||||
def _index_px(underly: str) -> float | None:
|
def _index_px(underly: str) -> float | None:
|
||||||
u = (underly or "ETH").strip().upper() or "ETH"
|
u = (underly or "ETH").strip().upper() or "ETH"
|
||||||
pub = ex
|
inst = f"{u}-USDT"
|
||||||
if pub is None:
|
pubs: list[Any] = []
|
||||||
try:
|
try:
|
||||||
from lib.sim.hooks import _APP_MODULE
|
from lib.sim.hooks import _APP_MODULE, _sim_public_exchange
|
||||||
|
|
||||||
pub = getattr(_APP_MODULE, "exchange", None) if _APP_MODULE else None
|
pub = _sim_public_exchange(ex) if _APP_MODULE is not None else None
|
||||||
|
if pub is not None:
|
||||||
|
pubs.append(pub)
|
||||||
except Exception:
|
except Exception:
|
||||||
pub = None
|
pass
|
||||||
if pub is None:
|
if ex is not None and ex not in pubs:
|
||||||
return None
|
pubs.append(ex)
|
||||||
|
for pub in pubs:
|
||||||
|
try:
|
||||||
|
if hasattr(pub, "public_get_market_ticker"):
|
||||||
|
rows = (pub.public_get_market_ticker({"instId": inst}) or {}).get("data") or []
|
||||||
|
if rows:
|
||||||
|
last = rows[0].get("last") or rows[0].get("lastPx")
|
||||||
|
if last is not None and float(last) > 0:
|
||||||
|
return float(last)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
from lib.exchange.okx_options_lib import fetch_index_price
|
||||||
|
|
||||||
|
px = fetch_index_price(pub, f"{u}-USD")
|
||||||
|
if px is not None and float(px) > 0:
|
||||||
|
return float(px)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
try:
|
try:
|
||||||
t = pub.fetch_ticker(f"{u}/USDT") or {}
|
t = pub.fetch_ticker(f"{u}/USDT") or {}
|
||||||
last = t.get("last") or t.get("close")
|
last = t.get("last") or t.get("close")
|
||||||
return float(last) if last is not None else None
|
if last is not None and float(last) > 0:
|
||||||
|
return float(last)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
continue
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _to_usdt(amount: float | None, *, ccy: str, idx: float | None) -> float | None:
|
def _to_usdt(amount: float | None, *, ccy: str, idx: float | None) -> float | None:
|
||||||
|
|||||||
Reference in New Issue
Block a user