Skip to content

Commit b5be462

Browse files
committed
add delisting check for bybit futures
1 parent b55e7bc commit b5be462

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

freqtrade/exchange/bybit.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import logging
2+
import time
23
from datetime import datetime, timedelta
34

45
import ccxt
56

67
from freqtrade.constants import BuySell
7-
from freqtrade.enums import MarginMode, PriceType, TradingMode
8+
from freqtrade.enums import TRADE_MODES, MarginMode, PriceType, TradingMode
89
from freqtrade.exceptions import DDosProtection, ExchangeError, OperationalException, TemporaryError
910
from freqtrade.exchange import Exchange
1011
from freqtrade.exchange.common import retrier
1112
from freqtrade.exchange.exchange_types import CcxtOrder, FtHas
1213
from freqtrade.misc import deep_merge_dicts
14+
from freqtrade.util.datetime_helpers import dt_from_ts
1315

1416

1517
logger = logging.getLogger(__name__)
@@ -54,6 +56,7 @@ class Bybit(Exchange):
5456
"exchange_has_overrides": {
5557
"fetchOrder": True,
5658
},
59+
"has_delisting": True,
5760
}
5861

5962
_supported_trading_mode_margin_pairs: list[tuple[TradingMode, MarginMode]] = [
@@ -294,3 +297,35 @@ def get_leverage_tiers(self) -> dict[str, list[dict]]:
294297

295298
self.cache_leverage_tiers(tiers, self._config["stake_currency"])
296299
return tiers
300+
301+
def check_delisting_time(self, pair: str) -> datetime | None:
302+
"""
303+
Check if the pair gonna be delisted.
304+
By default, it returns None.
305+
:param pair: Market symbol
306+
:return: Datetime if the pair gonna be delisted, None otherwise
307+
"""
308+
if self._config["runmode"] not in TRADE_MODES:
309+
return None
310+
311+
if self.trading_mode == TradingMode.FUTURES:
312+
return self._check_delisting_futures(pair)
313+
return None
314+
315+
def _check_delisting_futures(self, pair: str) -> datetime | None:
316+
delivery_time = self.markets.get(pair, {}).get("info", {}).get("deliveryTime", 0)
317+
if delivery_time:
318+
if isinstance(delivery_time, str) and (delivery_time != ""):
319+
delivery_time = int(delivery_time)
320+
321+
if not isinstance(delivery_time, int) or delivery_time <= 0:
322+
return None
323+
324+
max_delivery = int(time.time() * 1000) + (
325+
14 * 24 * 60 * 60 * 1000
326+
) # Assume exchange don't announce delisting more than 14 days in advance
327+
328+
if delivery_time < max_delivery:
329+
return dt_from_ts(delivery_time)
330+
331+
return None

0 commit comments

Comments
 (0)