修复okx止盈止损

This commit is contained in:
dekun
2026-05-25 11:14:20 +08:00
parent dccd490a46
commit 4e8498f736
3 changed files with 156 additions and 58 deletions
+26 -12
View File
@@ -7,6 +7,8 @@ import os
import time
from typing import Any
from okx_orders_lib import fetch_okx_all_open_orders
def _coerce_float(*values) -> float | None:
for v in values:
@@ -98,23 +100,33 @@ def _normalize_raw_order(order: dict, *, channel: str) -> dict[str, Any] | None:
reduce_only = bool(reduce_only) if reduce_only is not None else None
except (TypeError, ValueError):
reduce_only = None
sl_trig = _coerce_float(info.get("slTriggerPx"), order.get("stopLossPrice"))
tp_trig = _coerce_float(info.get("tpTriggerPx"), order.get("takeProfitPrice"))
trig = _coerce_float(
order.get("stopPrice"),
order.get("triggerPrice"),
info.get("triggerPrice"),
info.get("stopPrice"),
info.get("slTriggerPx"),
info.get("tpTriggerPx"),
info.get("triggerPx"),
sl_trig,
tp_trig,
)
price = _coerce_float(order.get("price"), info.get("price"))
amt = _coerce_float(order.get("amount"), order.get("remaining"), info.get("quantity"), info.get("origQty"))
price = _coerce_float(order.get("price"), info.get("price"), info.get("ordPx"))
amt = _coerce_float(order.get("amount"), order.get("remaining"), info.get("quantity"), info.get("origQty"), info.get("sz"))
category = "conditional" if _is_conditional_type(typ) or channel == "algo" else "limit"
label = _order_label(typ, side, reduce_only)
if sl_trig is not None and tp_trig is not None:
label = f"止盈止损 SL={sl_trig:g} TP={tp_trig:g}"
elif sl_trig is not None:
label = f"止损 {sl_trig:g}"
elif tp_trig is not None:
label = f"止盈 {tp_trig:g}"
return {
"id": str(oid),
"symbol": sym,
"channel": channel,
"category": category,
"label": _order_label(typ, side, reduce_only),
"label": label,
"type": typ,
"side": side,
"amount": amt,
@@ -210,17 +222,19 @@ def _okx_list(ex: Any, symbol: str | None) -> list[dict]:
pass
if symbol and not symbols:
symbols = [symbol]
seen = set()
seen: set[tuple[str, str]] = set()
for sym in symbols:
if sym in seen:
continue
seen.add(sym)
try:
for o in ex.fetch_open_orders(sym) or []:
for o in fetch_okx_all_open_orders(ex, sym):
ch = "algo" if _is_conditional_type(_order_type_str(o)) else "regular"
n = _normalize_raw_order(dict(o), channel=ch)
if n:
out.append(n)
if not n:
continue
key = (n["id"], n.get("channel") or ch)
if key in seen:
continue
seen.add(key)
out.append(n)
except Exception:
pass
return out