diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index c5605412d..f8af2b469 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -5,7 +5,7 @@ Freqtrade is the main module of this bot. It contains the class Freqtrade() import logging import traceback from copy import deepcopy -from datetime import datetime, time, timedelta, timezone +from datetime import UTC, datetime, time, timedelta from math import isclose from threading import Lock from time import sleep @@ -266,7 +266,7 @@ class FreqtradeBot(LoggingMixin): ) strategy_safe_wrapper(self.strategy.bot_loop_start, supress_error=True)( - current_time=datetime.now(timezone.utc) + current_time=datetime.now(UTC) ) with self._measure_execution: @@ -296,7 +296,7 @@ class FreqtradeBot(LoggingMixin): self._schedule.run_pending() Trade.commit() self.rpc.process_msg_queue(self.dataprovider._msg_queue) - self.last_process = datetime.now(timezone.utc) + self.last_process = datetime.now(UTC) def process_stopped(self) -> None: """ @@ -421,7 +421,7 @@ class FreqtradeBot(LoggingMixin): except InvalidOrderException as e: logger.warning(f"Error updating Order {order.order_id} due to {e}.") - if order.order_date_utc - timedelta(days=5) < datetime.now(timezone.utc): + if order.order_date_utc - timedelta(days=5) < datetime.now(UTC): logger.warning( "Order is older than 5 days. Assuming order was fully cancelled." ) @@ -755,7 +755,7 @@ class FreqtradeBot(LoggingMixin): logger.debug(f"Calling adjust_trade_position for pair {trade.pair}") stake_amount, order_tag = self.strategy._adjust_trade_position_internal( trade=trade, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), current_rate=current_entry_rate, current_profit=current_entry_profit, min_stake=min_entry_stake, @@ -916,7 +916,7 @@ class FreqtradeBot(LoggingMixin): amount=amount, rate=enter_limit_requested, time_in_force=time_in_force, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), entry_tag=enter_tag, side=trade_side, ): @@ -987,7 +987,7 @@ class FreqtradeBot(LoggingMixin): # Fee is applied twice because we make a LIMIT_BUY and LIMIT_SELL fee = self.exchange.get_fee(symbol=pair, taker_or_maker="maker") base_currency = self.exchange.get_pair_base_currency(pair) - open_date = datetime.now(timezone.utc) + open_date = datetime.now(UTC) funding_fees = self.exchange.get_funding_fees( pair=pair, @@ -1106,7 +1106,7 @@ class FreqtradeBot(LoggingMixin): )( pair=pair, trade=trade, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), proposed_rate=enter_limit_requested, entry_tag=entry_tag, side=trade_side, @@ -1124,7 +1124,7 @@ class FreqtradeBot(LoggingMixin): else: leverage = strategy_safe_wrapper(self.strategy.leverage, default_retval=1.0)( pair=pair, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), current_rate=enter_limit_requested, proposed_leverage=1.0, max_leverage=max_leverage, @@ -1157,7 +1157,7 @@ class FreqtradeBot(LoggingMixin): self.strategy.custom_stake_amount, default_retval=stake_amount )( pair=pair, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), current_rate=enter_limit_requested, proposed_stake=stake_amount, min_stake=min_stake_amount, @@ -1222,7 +1222,7 @@ class FreqtradeBot(LoggingMixin): "quote_currency": self.exchange.get_pair_quote_currency(trade.pair), "fiat_currency": self.config.get("fiat_display_currency", None), "amount": order.safe_amount_after_fee if fill else (order.safe_amount or trade.amount), - "open_date": trade.open_date_utc or datetime.now(timezone.utc), + "open_date": trade.open_date_utc or datetime.now(UTC), "current_rate": current_rate, "sub_trade": sub_trade, } @@ -1361,7 +1361,7 @@ class FreqtradeBot(LoggingMixin): exits: list[ExitCheckTuple] = self.strategy.should_exit( trade, exit_rate, - datetime.now(timezone.utc), + datetime.now(UTC), enter=enter, exit_=exit_, force_stoploss=0, @@ -1496,7 +1496,7 @@ class FreqtradeBot(LoggingMixin): if self.exchange.stoploss_adjust(stoploss_norm, order, side=trade.exit_side): # we check if the update is necessary update_beat = self.strategy.order_types.get("stoploss_on_exchange_interval", 60) - upd_req = datetime.now(timezone.utc) - timedelta(seconds=update_beat) + upd_req = datetime.now(UTC) - timedelta(seconds=update_beat) if trade.stoploss_last_update_utc and upd_req >= trade.stoploss_last_update_utc: # cancelling the current stoploss on exchange first logger.info( @@ -1584,7 +1584,7 @@ class FreqtradeBot(LoggingMixin): if fully_cancelled or ( open_order and self.strategy.ft_check_timed_out( - trade, open_order, datetime.now(timezone.utc) + trade, open_order, datetime.now(UTC) ) ): self.handle_cancel_order( @@ -1683,7 +1683,7 @@ class FreqtradeBot(LoggingMixin): trade=trade, order=order_obj, pair=trade.pair, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), proposed_rate=proposed_rate, current_order_rate=order_obj.safe_placement_price, entry_tag=trade.enter_tag, @@ -2075,7 +2075,7 @@ class FreqtradeBot(LoggingMixin): )( pair=trade.pair, trade=trade, - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), proposed_rate=proposed_limit_rate, current_profit=current_profit, exit_tag=exit_reason, @@ -2106,7 +2106,7 @@ class FreqtradeBot(LoggingMixin): time_in_force=time_in_force, exit_reason=exit_reason, sell_reason=exit_reason, # sellreason -> compatibility - current_time=datetime.now(timezone.utc), + current_time=datetime.now(UTC), ) ): logger.info(f"User denied exit for {trade.pair}.") @@ -2202,7 +2202,7 @@ class FreqtradeBot(LoggingMixin): "enter_tag": trade.enter_tag, "exit_reason": trade.exit_reason, "open_date": trade.open_date_utc, - "close_date": trade.close_date_utc or datetime.now(timezone.utc), + "close_date": trade.close_date_utc or datetime.now(UTC), "stake_amount": trade.stake_amount, "stake_currency": self.config["stake_currency"], "base_currency": self.exchange.get_pair_base_currency(trade.pair), @@ -2257,7 +2257,7 @@ class FreqtradeBot(LoggingMixin): "enter_tag": trade.enter_tag, "exit_reason": trade.exit_reason, "open_date": trade.open_date, - "close_date": trade.close_date or datetime.now(timezone.utc), + "close_date": trade.close_date or datetime.now(UTC), "stake_currency": self.config["stake_currency"], "base_currency": self.exchange.get_pair_base_currency(trade.pair), "quote_currency": self.exchange.get_pair_quote_currency(trade.pair), @@ -2338,7 +2338,7 @@ class FreqtradeBot(LoggingMixin): def _update_trade_after_fill(self, trade: Trade, order: Order, send_msg: bool) -> Trade: if order.status in constants.NON_OPEN_EXCHANGE_STATES: strategy_safe_wrapper(self.strategy.order_filled, default_retval=None)( - pair=trade.pair, trade=trade, order=order, current_time=datetime.now(timezone.utc) + pair=trade.pair, trade=trade, order=order, current_time=datetime.now(UTC) ) # If a entry order was closed, force update on stoploss on exchange if order.ft_order_side == trade.entry_side: @@ -2371,7 +2371,7 @@ class FreqtradeBot(LoggingMixin): ) profit = trade.calc_profit_ratio(current_rate) self.strategy.ft_stoploss_adjust( - current_rate, trade, datetime.now(timezone.utc), profit, 0, after_fill=True + current_rate, trade, datetime.now(UTC), profit, 0, after_fill=True ) # Updating wallets when order is closed self.wallets.update() @@ -2397,7 +2397,7 @@ class FreqtradeBot(LoggingMixin): def handle_protections(self, pair: str, side: LongShort) -> None: # Lock pair for one candle to prevent immediate re-entries - self.strategy.lock_pair(pair, datetime.now(timezone.utc), reason="Auto lock", side=side) + self.strategy.lock_pair(pair, datetime.now(UTC), reason="Auto lock", side=side) prot_trig = self.protections.stop_per_pair(pair, side=side) if prot_trig: msg: RPCProtectionMsg = { diff --git a/freqtrade/rpc/api_server/api_auth.py b/freqtrade/rpc/api_server/api_auth.py index 5f63c0aa5..44ed3db57 100644 --- a/freqtrade/rpc/api_server/api_auth.py +++ b/freqtrade/rpc/api_server/api_auth.py @@ -1,6 +1,6 @@ import logging import secrets -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from typing import Any import jwt @@ -89,15 +89,15 @@ async def validate_ws_token( def create_token(data: dict, secret_key: str, token_type: str = "access") -> str: # noqa: S107 to_encode = data.copy() if token_type == "access": # noqa: S105 - expire = datetime.now(timezone.utc) + timedelta(minutes=15) + expire = datetime.now(UTC) + timedelta(minutes=15) elif token_type == "refresh": # noqa: S105 - expire = datetime.now(timezone.utc) + timedelta(days=30) + expire = datetime.now(UTC) + timedelta(days=30) else: raise ValueError() to_encode.update( { "exp": expire, - "iat": datetime.now(timezone.utc), + "iat": datetime.now(UTC), "type": token_type, } ) diff --git a/freqtrade/rpc/api_server/webserver_bgwork.py b/freqtrade/rpc/api_server/webserver_bgwork.py index 4c335a2f2..75aadb78e 100644 --- a/freqtrade/rpc/api_server/webserver_bgwork.py +++ b/freqtrade/rpc/api_server/webserver_bgwork.py @@ -1,7 +1,7 @@ -from typing import Any, Literal +from typing import Any, Literal, NotRequired from uuid import uuid4 -from typing_extensions import NotRequired, TypedDict +from typing_extensions import TypedDict from freqtrade.exchange.exchange import Exchange diff --git a/freqtrade/rpc/external_message_consumer.py b/freqtrade/rpc/external_message_consumer.py index fe22613bd..0a11fbefe 100644 --- a/freqtrade/rpc/external_message_consumer.py +++ b/freqtrade/rpc/external_message_consumer.py @@ -266,7 +266,7 @@ class ExternalMessageConsumer: except Exception as e: logger.exception(f"Error handling producer message: {e}") - except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed): + except (TimeoutError, websockets.exceptions.ConnectionClosed): # We haven't received data yet. Check the connection and continue. try: # ping diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 2186ea9b3..c863a8392 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -5,7 +5,7 @@ This module defines the interface to apply for strategies import logging from abc import ABC, abstractmethod -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from math import isinf, isnan from pandas import DataFrame @@ -1149,7 +1149,7 @@ class IStrategy(ABC, HyperStrategyMixin): manually from within the strategy, to allow an easy way to unlock pairs. :param pair: Unlock pair to allow trading again """ - PairLocks.unlock_pair(pair, datetime.now(timezone.utc)) + PairLocks.unlock_pair(pair, datetime.now(UTC)) def unlock_reason(self, reason: str) -> None: """ @@ -1158,7 +1158,7 @@ class IStrategy(ABC, HyperStrategyMixin): manually from within the strategy, to allow an easy way to unlock pairs. :param reason: Unlock pairs to allow trading again """ - PairLocks.unlock_reason(reason, datetime.now(timezone.utc)) + PairLocks.unlock_reason(reason, datetime.now(UTC)) def is_pair_locked( self, pair: str, *, candle_date: datetime | None = None, side: str = "*" diff --git a/freqtrade/util/datetime_helpers.py b/freqtrade/util/datetime_helpers.py index 03ee3b6d9..e2390105d 100644 --- a/freqtrade/util/datetime_helpers.py +++ b/freqtrade/util/datetime_helpers.py @@ -1,5 +1,5 @@ import re -from datetime import datetime, timezone +from datetime import UTC, datetime from time import time import humanize @@ -9,7 +9,7 @@ from freqtrade.constants import DATETIME_PRINT_FORMAT def dt_now() -> datetime: """Return the current datetime in UTC.""" - return datetime.now(timezone.utc) + return datetime.now(UTC) def dt_utc( @@ -22,7 +22,7 @@ def dt_utc( microsecond: int = 0, ) -> datetime: """Return a datetime in UTC.""" - return datetime(year, month, day, hour, minute, second, microsecond, tzinfo=timezone.utc) + return datetime(year, month, day, hour, minute, second, microsecond, tzinfo=UTC) def dt_ts(dt: datetime | None = None) -> int: @@ -68,7 +68,7 @@ def dt_from_ts(timestamp: float) -> datetime: if timestamp > 1e10: # Timezone in ms - convert to seconds timestamp /= 1000 - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return datetime.fromtimestamp(timestamp, tz=UTC) def shorten_date(_date: str) -> str: diff --git a/freqtrade/util/periodic_cache.py b/freqtrade/util/periodic_cache.py index 4f7405d2b..33322fd55 100644 --- a/freqtrade/util/periodic_cache.py +++ b/freqtrade/util/periodic_cache.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from cachetools import TTLCache @@ -11,7 +11,7 @@ class PeriodicCache(TTLCache): def __init__(self, maxsize, ttl, getsizeof=None): def local_timer(): - ts = datetime.now(timezone.utc).timestamp() + ts = datetime.now(UTC).timestamp() offset = ts % ttl return ts - offset