diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 1f5c19b2a..e7dd95c46 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -35,6 +35,7 @@ class Bybit(Exchange): "order_time_in_force": ["GTC", "FOK", "IOC", "PO"], "ws_enabled": True, "trades_has_history": False, # Endpoint doesn't support pagination + "fetch_orders_limit_minutes": 7 * 1440, # 7 days "exchange_has_overrides": { # Bybit spot does not support fetch_order # Unless the account is unified. @@ -234,25 +235,6 @@ class Bybit(Exchange): logger.warning(f"Could not update funding fees for {pair}.") return 0.0 - def fetch_orders( - self, pair: str, since: datetime, params: dict | None = None - ) -> list[CcxtOrder]: - """ - Fetch all orders for a pair "since" - :param pair: Pair for the query - :param since: Starting time for the query - """ - # On bybit, the distance between since and "until" can't exceed 7 days. - # we therefore need to split the query into multiple queries. - orders = [] - - while since < dt_now(): - until = since + timedelta(days=7, minutes=-1) - orders += super().fetch_orders(pair, since, params={"until": dt_ts(until)}) - since = until - - return orders - def fetch_order(self, order_id: str, pair: str, params: dict | None = None) -> CcxtOrder: if self.exchange_has("fetchOrder"): # Set acknowledged to True to avoid ccxt exception diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index dc5a4bad2..83d199cd3 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -155,6 +155,7 @@ class Exchange: "ccxt_futures_name": "swap", "needs_trading_fees": False, # use fetch_trading_fees to cache fees "order_props_in_contracts": ["amount", "filled", "remaining"], + "fetch_orders_limit_minutes": None, # "fetch_orders" is not time-limited by default # Override createMarketBuyOrderRequiresPrice where ccxt has it wrong "marketOrderRequiresPrice": False, "exchange_has_overrides": {}, # Dictionary overriding ccxt's "has". @@ -1742,7 +1743,7 @@ class Exchange: return orders @retrier(retries=0) - def fetch_orders( + def _fetch_orders( self, pair: str, since: datetime, params: dict | None = None ) -> list[CcxtOrder]: """ @@ -1781,6 +1782,22 @@ class Exchange: except ccxt.BaseError as e: raise OperationalException(e) from e + def fetch_orders( + self, pair: str, since: datetime, params: dict | None = None + ) -> list[CcxtOrder]: + if self._config["dry_run"]: + return [] + if (limit := self._ft_has.get("fetch_orders_limit_minutes")) is not None: + orders = [] + while since < dt_now(): + until = since + timedelta(minutes=limit - 1) + orders += self._fetch_orders(pair, since, params={"until": dt_ts(until)}) + since = until + return orders + + else: + return self._fetch_orders(pair, since, params=params) + @retrier def fetch_trading_fees(self) -> dict[str, Any]: """ diff --git a/freqtrade/exchange/exchange_types.py b/freqtrade/exchange/exchange_types.py index fed6bff70..544f14ea6 100644 --- a/freqtrade/exchange/exchange_types.py +++ b/freqtrade/exchange/exchange_types.py @@ -38,6 +38,8 @@ class FtHas(TypedDict, total=False): l2_limit_range: list[int] | None l2_limit_range_required: bool l2_limit_upper: int | None + # fetch_orders + fetch_orders_limit_minutes: int | None # Futures ccxt_futures_name: str # usually swap mark_ohlcv_price: str