diff --git a/freqtrade/exchange/bybit.py b/freqtrade/exchange/bybit.py index 7db300acc..a5cba4997 100644 --- a/freqtrade/exchange/bybit.py +++ b/freqtrade/exchange/bybit.py @@ -1,15 +1,17 @@ import logging +import time from datetime import datetime, timedelta import ccxt from freqtrade.constants import BuySell -from freqtrade.enums import MarginMode, PriceType, TradingMode +from freqtrade.enums import TRADE_MODES, MarginMode, PriceType, TradingMode from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError from freqtrade.exchange import Exchange from freqtrade.exchange.common import retrier from freqtrade.exchange.exchange_types import CcxtOrder, FtHas from freqtrade.misc import deep_merge_dicts +from freqtrade.util.datetime_helpers import dt_from_ts logger = logging.getLogger(__name__) @@ -54,6 +56,7 @@ class Bybit(Exchange): "exchange_has_overrides": { "fetchOrder": True, }, + "has_delisting": True, } _supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [ @@ -294,3 +297,35 @@ class Bybit(Exchange): self.cache_leverage_tiers(tiers, self._config["stake_currency"]) return tiers + + def check_delisting_time(self, pair: str) -> datetime | None: + """ + Check if the pair gonna be delisted. + By default, it returns None. + :param pair: Market symbol + :return: Datetime if the pair gonna be delisted, None otherwise + """ + if self._config["runmode"] not in TRADE_MODES: + return None + + if self.trading_mode == TradingMode.FUTURES: + return self._check_delisting_futures(pair) + return None + + def _check_delisting_futures(self, pair: str) -> datetime | None: + delivery_time = self.markets.get(pair, {}).get("info", {}).get("deliveryTime", 0) + if delivery_time: + if isinstance(delivery_time, str) and (delivery_time != ""): + delivery_time = int(delivery_time) + + if not isinstance(delivery_time, int) or delivery_time <= 0: + return None + + max_delivery = int(time.time() * 1000) + ( + 14 * 24 * 60 * 60 * 1000 + ) # Assume exchange don't announce delisting more than 14 days in advance + + if delivery_time < max_delivery: + return dt_from_ts(delivery_time) + + return None