feat: restructure OKX options UI with header funds, settings card, and dual-column layout
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -478,6 +478,95 @@ def transfer_ccy(
|
||||
return {"ok": False, "msg": str(e)}
|
||||
|
||||
|
||||
_OKX_ACCT_CODE = {"funding": "6", "trading": "18", "spot": "18"}
|
||||
|
||||
|
||||
def fetch_options_trading_usdc(ex: ccxt.okx) -> float | None:
|
||||
bal = fetch_options_balances(ex)
|
||||
v = bal.get("trading_usdc")
|
||||
if v is None:
|
||||
return None
|
||||
return round(float(v), 2)
|
||||
|
||||
|
||||
def spot_market_swap_usdt_usdc(
|
||||
ex: ccxt.okx,
|
||||
*,
|
||||
direction: str,
|
||||
amount: float,
|
||||
) -> dict[str, Any]:
|
||||
"""现货市价兑换 USDC-USDT。direction: usdt_to_usdc | usdc_to_usdt。"""
|
||||
if amount <= 0:
|
||||
return {"ok": False, "msg": "数量须大于 0"}
|
||||
d = (direction or "").lower()
|
||||
inst_id = "USDC-USDT"
|
||||
try:
|
||||
if d == "usdt_to_usdc":
|
||||
body = {
|
||||
"instId": inst_id,
|
||||
"tdMode": "cash",
|
||||
"side": "buy",
|
||||
"ordType": "market",
|
||||
"sz": str(amount),
|
||||
"tgtCcy": "quote",
|
||||
}
|
||||
elif d == "usdc_to_usdt":
|
||||
body = {
|
||||
"instId": inst_id,
|
||||
"tdMode": "cash",
|
||||
"side": "sell",
|
||||
"ordType": "market",
|
||||
"sz": str(amount),
|
||||
"tgtCcy": "base",
|
||||
}
|
||||
else:
|
||||
return {"ok": False, "msg": "direction 须为 usdt_to_usdc 或 usdc_to_usdt"}
|
||||
resp = ex.private_post_trade_order(body)
|
||||
data = (resp or {}).get("data") or []
|
||||
if data and str(data[0].get("sCode")) == "0":
|
||||
return {"ok": True, "data": data[0], "raw": resp}
|
||||
msg = data[0].get("sMsg") if data else str(resp)
|
||||
return {"ok": False, "msg": msg or "现货兑换失败", "raw": resp}
|
||||
except Exception as e:
|
||||
return {"ok": False, "msg": str(e)}
|
||||
|
||||
|
||||
def transfer_main_sub_account(
|
||||
ex: ccxt.okx,
|
||||
*,
|
||||
ccy: str,
|
||||
amount: float,
|
||||
sub_acct: str,
|
||||
main_to_sub: bool,
|
||||
account: str = "funding",
|
||||
) -> dict[str, Any]:
|
||||
"""主账户与子账户之间划转(须主账户 API)。"""
|
||||
if amount <= 0:
|
||||
return {"ok": False, "msg": "划转金额须大于 0"}
|
||||
sub = (sub_acct or "").strip()
|
||||
if not sub:
|
||||
return {"ok": False, "msg": "未配置子账户名称 OKX_SUB_ACCOUNT_NAME"}
|
||||
acct_code = _OKX_ACCT_CODE.get((account or "funding").lower(), "6")
|
||||
try:
|
||||
resp = ex.private_post_asset_transfer(
|
||||
{
|
||||
"type": "1" if main_to_sub else "2",
|
||||
"ccy": str(ccy).upper(),
|
||||
"amt": str(amount),
|
||||
"from": acct_code,
|
||||
"to": acct_code,
|
||||
"subAcct": sub,
|
||||
}
|
||||
)
|
||||
data = (resp or {}).get("data") or []
|
||||
if data and str(data[0].get("sCode", "0")) == "0":
|
||||
return {"ok": True, "data": data[0], "raw": resp}
|
||||
msg = data[0].get("sMsg") if data else str(resp)
|
||||
return {"ok": False, "msg": msg or "主/子账户划转失败", "raw": resp}
|
||||
except Exception as e:
|
||||
return {"ok": False, "msg": str(e)}
|
||||
|
||||
|
||||
def format_position_row(pos: dict[str, Any], ct_mult: float = 0.01) -> dict[str, Any]:
|
||||
sheets = _safe_float(pos.get("pos")) or 0.0
|
||||
avg = _safe_float(pos.get("avgPx"))
|
||||
|
||||
Reference in New Issue
Block a user