From 665fa4782e11c56b6d63889b608afd7616ee5ce2 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 23 Apr 2026 15:08:01 +0800 Subject: [PATCH] 1 --- .../app/services/bitget_trading_api_sdk.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/backend/app/services/bitget_trading_api_sdk.py b/backend/app/services/bitget_trading_api_sdk.py index f08484c..dd42f8c 100644 --- a/backend/app/services/bitget_trading_api_sdk.py +++ b/backend/app/services/bitget_trading_api_sdk.py @@ -503,6 +503,37 @@ class BitgetTradingAPI: logger.warning(f"⚠️ 止盈止损价格均不合理,无法设置") return result + rounded_sl = self._price_to_precision(ccxt_symbol, valid_sl) if valid_sl else None + rounded_tp = self._price_to_precision(ccxt_symbol, valid_tp) if valid_tp else None + if rounded_sl and rounded_sl != valid_sl: + logger.info(f"Bitget 止损价按交易所精度规整: {valid_sl} -> {rounded_sl}") + valid_sl = rounded_sl + if rounded_tp and rounded_tp != valid_tp: + logger.info(f"Bitget 止盈价按交易所精度规整: {valid_tp} -> {rounded_tp}") + valid_tp = rounded_tp + if pos_side == 'long': + if valid_sl and valid_sl >= mark_price: + logger.warning(f"规整后做多止损无效: SL={valid_sl}, Mark={mark_price},跳过止损") + result["errors"].append(f"规整后止损价 {valid_sl} >= 标记价 {mark_price}") + valid_sl = None + if valid_tp and valid_tp <= mark_price: + logger.warning(f"规整后做多止盈无效: TP={valid_tp}, Mark={mark_price},跳过止盈") + result["errors"].append(f"规整后止盈价 {valid_tp} <= 标记价 {mark_price}") + valid_tp = None + else: + if valid_sl and valid_sl <= mark_price: + logger.warning(f"规整后做空止损无效: SL={valid_sl}, Mark={mark_price},跳过止损") + result["errors"].append(f"规整后止损价 {valid_sl} <= 标记价 {mark_price}") + valid_sl = None + if valid_tp and valid_tp >= mark_price: + logger.warning(f"规整后做空止盈无效: TP={valid_tp}, Mark={mark_price},跳过止盈") + result["errors"].append(f"规整后止盈价 {valid_tp} >= 标记价 {mark_price}") + valid_tp = None + + if not valid_sl and not valid_tp: + logger.warning("⚠️ 止盈止损价格规整后均不合理,无法设置") + return result + # 使用独立的止损/止盈计划订单 # 注意:这种方式需要在平仓时也取消这些计划订单 @@ -1125,6 +1156,16 @@ class BitgetTradingAPI: # 回退:4 位小数截断 return math.floor(amount * 10000) / 10000 + def _price_to_precision(self, ccxt_symbol: str, price: Optional[float]) -> Optional[float]: + """按交易所价格精度规整触发价,避免 Bitget 拒绝 TP/SL 策略单。""" + if price is None: + return None + try: + return float(self.exchange.price_to_precision(ccxt_symbol, price)) + except Exception as e: + logger.warning(f"{ccxt_symbol} 价格精度规整失败,使用兜底四位小数: {price}, error={e}") + return round(float(price), 4) + def _get_min_amount(self, ccxt_symbol: str) -> float: """获取交易对最小下单数量""" try: