From e933784555d50aa75f1ef212a2d8ea9e0dd25980 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 25 Apr 2026 16:38:46 +0800 Subject: [PATCH] 1 --- .../crypto_agent/executor/base_executor.py | 5 +++ .../services/bitget_live_trading_service.py | 7 ++++- .../app/services/bitget_trading_api_sdk.py | 31 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/backend/app/crypto_agent/executor/base_executor.py b/backend/app/crypto_agent/executor/base_executor.py index f4f916c..ff2467a 100644 --- a/backend/app/crypto_agent/executor/base_executor.py +++ b/backend/app/crypto_agent/executor/base_executor.py @@ -146,6 +146,11 @@ class BaseExecutor(ABC): now = datetime.now() for order in pending_orders: + if order.get('is_reduce_only'): + continue + if str(order.get('order_type') or '').lower() == 'uta_tpsl': + continue + created_at = order.get('created_at') if not created_at: continue diff --git a/backend/app/services/bitget_live_trading_service.py b/backend/app/services/bitget_live_trading_service.py index 16a8403..579d305 100644 --- a/backend/app/services/bitget_live_trading_service.py +++ b/backend/app/services/bitget_live_trading_service.py @@ -577,7 +577,12 @@ class BitgetLiveTradingService: "message": "订单已不在挂单列表,可能已成交、已撤销或已失效", } - success = self.trading_api.cancel_order(symbol=symbol, order_id=order_id) + order_type = str(matched_order.get('order_type') or '').lower() + if order_type == 'uta_tpsl': + success = self.trading_api.cancel_strategy_order(symbol=symbol, order_id=order_id) + else: + success = self.trading_api.cancel_order(symbol=symbol, order_id=order_id) + if success: logger.info(f"✅ Bitget 单笔撤单成功: {symbol} #{order_id}") return {"success": True, "order_id": normalized_order_id, "symbol": symbol} diff --git a/backend/app/services/bitget_trading_api_sdk.py b/backend/app/services/bitget_trading_api_sdk.py index 420bbed..3aebb17 100644 --- a/backend/app/services/bitget_trading_api_sdk.py +++ b/backend/app/services/bitget_trading_api_sdk.py @@ -222,6 +222,37 @@ class BitgetTradingAPI: logger.error(f"❌ 撤单异常: {e}") return False + def cancel_strategy_order(self, symbol: str, order_id: str) -> bool: + """ + 撤销 UTA 未触发策略单(TP/SL 等)。 + + Args: + symbol: 交易对 + order_id: 策略单 ID + + Returns: + 是否成功 + """ + try: + payload = { + 'category': self.DEFAULT_PRODUCT_TYPE, + 'symbol': self._to_contract_symbol_id(symbol), + 'orderId': str(order_id), + } + response = self.exchange.privateUtaPostV3TradeCancelStrategyOrder(payload) + if response.get('code') not in (None, '00000'): + logger.error(f"❌ 撤销策略单失败: {response}") + return False + + logger.info(f"✅ 撤销策略单成功: {symbol} order_id={order_id}") + return True + except ccxt.BaseError as e: + logger.error(f"❌ 撤销策略单失败: {e}") + return False + except Exception as e: + logger.error(f"❌ 撤销策略单异常: {e}") + return False + def cancel_all_orders(self, symbol: str) -> bool: """ 撤销所有挂单