From 81fcd5ea5adee9c7c85b241facc0d69006ab5086 Mon Sep 17 00:00:00 2001 From: ABS <53243996+ABSllk@users.noreply.github.com> Date: Sun, 12 Apr 2026 02:42:35 +0800 Subject: [PATCH 1/2] fix(bitget): use stopLossPrice mapping for futures stoploss handling --- freqtrade/exchange/bitget.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index 72aaf44cb..9691f72f8 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -38,6 +38,8 @@ class Bitget(Exchange): _ft_has_futures: FtHas = { "funding_fee_candle_limit": 100, "has_delisting": True, + "stop_price_param": "stopLossPrice", + "stop_price_prop": "stopLossPrice", "stop_price_type_field": "triggerType", "stop_price_type_value_mapping": { PriceType.LAST: "fill_price", From 7105279654aca2290386f22273f4a15f885bc8fc Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 14 Apr 2026 20:41:18 +0200 Subject: [PATCH 2/2] fix(bitget): handle old and new stoploss order types --- freqtrade/exchange/bitget.py | 54 ++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/freqtrade/exchange/bitget.py b/freqtrade/exchange/bitget.py index 9691f72f8..d3cb1ad83 100644 --- a/freqtrade/exchange/bitget.py +++ b/freqtrade/exchange/bitget.py @@ -101,30 +101,36 @@ class Bitget(Exchange): return order def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> CcxtOrder: - params2 = { - "stop": True, - } - for method in ( - self._api.fetch_open_orders, - self._api.fetch_canceled_and_closed_orders, - ): - try: - orders = method(pair, params=params2) - orders_f = [order for order in orders if order["id"] == order_id] - if orders_f: - order = orders_f[0] - self._log_exchange_response("get_stop_order_fallback", order) - return self._convert_stop_order(pair, order_id, order) - except (ccxt.OrderNotFound, ccxt.InvalidOrder): - pass - except ccxt.DDoSProtection as e: - raise DDosProtection(e) from e - except (ccxt.OperationFailed, ccxt.ExchangeError) as e: - raise TemporaryError( - f"Could not get order due to {e.__class__.__name__}. Message: {e}" - ) from e - except ccxt.BaseError as e: - raise OperationalException(e) from e + # old stoploss orders + paramsold = {"stop": True} + # new stoploss orders with stopLossPrice (used in futures starting 2026.4) + paramsnew = {"planType": "profit_loss"} + params_to_try = ( + (paramsnew, paramsold) if self.trading_mode == TradingMode.FUTURES else (paramsold,) + ) + + for params2 in params_to_try: + for method in ( + self._api.fetch_open_orders, + self._api.fetch_canceled_and_closed_orders, + ): + try: + orders = method(pair, params=params2) + orders_f = [order for order in orders if order["id"] == order_id] + if orders_f: + order = orders_f[0] + self._log_exchange_response("get_stop_order_fallback", order) + return self._convert_stop_order(pair, order_id, order) + except (ccxt.OrderNotFound, ccxt.InvalidOrder): + pass + except ccxt.DDoSProtection as e: + raise DDosProtection(e) from e + except (ccxt.OperationFailed, ccxt.ExchangeError) as e: + raise TemporaryError( + f"Could not get order due to {e.__class__.__name__}. Message: {e}" + ) from e + except ccxt.BaseError as e: + raise OperationalException(e) from e raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).") @retrier(retries=API_RETRY_COUNT)