diff --git a/backend/live_executor.py b/backend/live_executor.py index 1ca2975..6f4f70e 100644 --- a/backend/live_executor.py +++ b/backend/live_executor.py @@ -206,14 +206,21 @@ async def place_stop_order(session: aiohttp.ClientSession, symbol: str, side: st "reduceOnly": "true", } - # 测试网不支持STOP_MARKET/TAKE_PROFIT_MARKET,降级为STOP/TAKE_PROFIT(限价单) - if TRADE_ENV == "testnet" and order_type in ("STOP_MARKET", "TAKE_PROFIT_MARKET"): - fallback_type = "STOP" if "STOP" in order_type else "TAKE_PROFIT" - params["type"] = fallback_type - params["price"] = price_str # 限价单需要price - params["timeInForce"] = "GTC" - + # 先尝试传统endpoint data, status = await binance_request(session, "POST", "/fapi/v1/order", params) + + # 如果不支持(-4120),降级到Algo Order API + if status == 400 and isinstance(data, dict) and data.get("code") == -4120: + logger.info(f"[{symbol}] 传统endpoint不支持{order_type},切换Algo Order API") + algo_params = { + "symbol": symbol, + "side": side, + "type": order_type, + "stopPrice": price_str, + "quantity": qty_str, + "reduceOnly": "true", + } + data, status = await binance_request(session, "POST", "/fapi/v1/algo/order", algo_params) if status == 200: logger.info(f"[{symbol}] 📌 挂{order_type} {side} @ {price_str} qty={qty_str} | orderId={data.get('orderId')}") return data, status