From b1731f0f79c4bb38d17dd74a53095caeba363c1e Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Mar 2026 10:38:30 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20SL/TP=E6=8C=82=E5=8D=95=E7=94=A8Algo=20O?= =?UTF-8?q?rder=20API=E9=99=8D=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 币安2025年底breaking change: STOP_MARKET/TAKE_PROFIT_MARKET 从/fapi/v1/order移到/fapi/v1/algo/order - 先尝试传统endpoint - 收到-4120错误码自动切换Algo Order API - 实盘和测试网都兼容 --- backend/live_executor.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) 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