refactor: fetch_orders pagination to base class

This commit is contained in:
Matthias
2025-05-22 19:07:10 +02:00
parent 12a482a6ba
commit 84e816fc5b
3 changed files with 21 additions and 20 deletions

View File

@@ -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

View File

@@ -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]:
"""

View File

@@ -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