Skip to content

Commit d55c479

Browse files
authored
Merge pull request freqtrade#13053 from ABSllk/fix-bitget-stoploss
bitget - update stopLossPrice mapping for futures
2 parents b71f91a + 7105279 commit d55c479

1 file changed

Lines changed: 32 additions & 24 deletions

File tree

freqtrade/exchange/bitget.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class Bitget(Exchange):
3838
_ft_has_futures: FtHas = {
3939
"funding_fee_candle_limit": 100,
4040
"has_delisting": True,
41+
"stop_price_param": "stopLossPrice",
42+
"stop_price_prop": "stopLossPrice",
4143
"stop_price_type_field": "triggerType",
4244
"stop_price_type_value_mapping": {
4345
PriceType.LAST: "fill_price",
@@ -99,30 +101,36 @@ def _convert_stop_order(self, pair: str, order_id: str, order: CcxtOrder) -> Ccx
99101
return order
100102

101103
def _fetch_stop_order_fallback(self, order_id: str, pair: str) -> CcxtOrder:
102-
params2 = {
103-
"stop": True,
104-
}
105-
for method in (
106-
self._api.fetch_open_orders,
107-
self._api.fetch_canceled_and_closed_orders,
108-
):
109-
try:
110-
orders = method(pair, params=params2)
111-
orders_f = [order for order in orders if order["id"] == order_id]
112-
if orders_f:
113-
order = orders_f[0]
114-
self._log_exchange_response("get_stop_order_fallback", order)
115-
return self._convert_stop_order(pair, order_id, order)
116-
except (ccxt.OrderNotFound, ccxt.InvalidOrder):
117-
pass
118-
except ccxt.DDoSProtection as e:
119-
raise DDosProtection(e) from e
120-
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
121-
raise TemporaryError(
122-
f"Could not get order due to {e.__class__.__name__}. Message: {e}"
123-
) from e
124-
except ccxt.BaseError as e:
125-
raise OperationalException(e) from e
104+
# old stoploss orders
105+
paramsold = {"stop": True}
106+
# new stoploss orders with stopLossPrice (used in futures starting 2026.4)
107+
paramsnew = {"planType": "profit_loss"}
108+
params_to_try = (
109+
(paramsnew, paramsold) if self.trading_mode == TradingMode.FUTURES else (paramsold,)
110+
)
111+
112+
for params2 in params_to_try:
113+
for method in (
114+
self._api.fetch_open_orders,
115+
self._api.fetch_canceled_and_closed_orders,
116+
):
117+
try:
118+
orders = method(pair, params=params2)
119+
orders_f = [order for order in orders if order["id"] == order_id]
120+
if orders_f:
121+
order = orders_f[0]
122+
self._log_exchange_response("get_stop_order_fallback", order)
123+
return self._convert_stop_order(pair, order_id, order)
124+
except (ccxt.OrderNotFound, ccxt.InvalidOrder):
125+
pass
126+
except ccxt.DDoSProtection as e:
127+
raise DDosProtection(e) from e
128+
except (ccxt.OperationFailed, ccxt.ExchangeError) as e:
129+
raise TemporaryError(
130+
f"Could not get order due to {e.__class__.__name__}. Message: {e}"
131+
) from e
132+
except ccxt.BaseError as e:
133+
raise OperationalException(e) from e
126134
raise RetryableOrderError(f"StoplossOrder not found (pair: {pair} id: {order_id}).")
127135

128136
@retrier(retries=API_RETRY_COUNT)

0 commit comments

Comments
 (0)