diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 373493a6e..9b1bdee9c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: - repo: https://github.com/charliermarsh/ruff-pre-commit # Ruff version. - rev: 'v0.14.14' + rev: 'v0.15.0' hooks: - id: ruff - id: ruff-format diff --git a/freqtrade/enums/candletype.py b/freqtrade/enums/candletype.py index eb7ae50b8..dddabdb70 100644 --- a/freqtrade/enums/candletype.py +++ b/freqtrade/enums/candletype.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class CandleType(str, Enum): +class CandleType(StrEnum): """Enum to distinguish candle types""" SPOT = "spot" @@ -14,9 +14,6 @@ class CandleType(str, Enum): FUNDING_RATE = "funding_rate" # BORROW_RATE = "borrow_rate" # * unimplemented - def __str__(self): - return f"{self.name.lower()}" - @staticmethod def from_string(value: str) -> "CandleType": if not value: diff --git a/freqtrade/enums/marginmode.py b/freqtrade/enums/marginmode.py index f1a4a3a17..69e99b2ea 100644 --- a/freqtrade/enums/marginmode.py +++ b/freqtrade/enums/marginmode.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class MarginMode(str, Enum): +class MarginMode(StrEnum): """ Enum to distinguish between cross margin/futures margin_mode and @@ -11,6 +11,3 @@ class MarginMode(str, Enum): CROSS = "cross" ISOLATED = "isolated" NONE = "" - - def __str__(self): - return f"{self.value.lower()}" diff --git a/freqtrade/enums/ordertypevalue.py b/freqtrade/enums/ordertypevalue.py index 3a253166d..9727887a6 100644 --- a/freqtrade/enums/ordertypevalue.py +++ b/freqtrade/enums/ordertypevalue.py @@ -1,6 +1,6 @@ -from enum import Enum +from enum import StrEnum -class OrderTypeValues(str, Enum): +class OrderTypeValues(StrEnum): limit = "limit" market = "market" diff --git a/freqtrade/enums/pricetype.py b/freqtrade/enums/pricetype.py index f2e3bef23..456c9daad 100644 --- a/freqtrade/enums/pricetype.py +++ b/freqtrade/enums/pricetype.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class PriceType(str, Enum): +class PriceType(StrEnum): """Enum to distinguish possible trigger prices for stoplosses""" LAST = "last" diff --git a/freqtrade/enums/rpcmessagetype.py b/freqtrade/enums/rpcmessagetype.py index 6fdd788e8..bf7019322 100644 --- a/freqtrade/enums/rpcmessagetype.py +++ b/freqtrade/enums/rpcmessagetype.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class RPCMessageType(str, Enum): +class RPCMessageType(StrEnum): STATUS = "status" WARNING = "warning" EXCEPTION = "exception" @@ -25,21 +25,16 @@ class RPCMessageType(str, Enum): NEW_CANDLE = "new_candle" def __repr__(self): - return self.value - - def __str__(self): + # TODO: do we still need to overwrite __repr__? Impact needs to be looked at in detail return self.value # Enum for parsing requests from ws consumers -class RPCRequestType(str, Enum): +class RPCRequestType(StrEnum): SUBSCRIBE = "subscribe" WHITELIST = "whitelist" ANALYZED_DF = "analyzed_df" - def __str__(self): - return self.value - NO_ECHO_MESSAGES = (RPCMessageType.ANALYZED_DF, RPCMessageType.WHITELIST, RPCMessageType.NEW_CANDLE) diff --git a/freqtrade/enums/runmode.py b/freqtrade/enums/runmode.py index f3316629a..ee0f97fb2 100644 --- a/freqtrade/enums/runmode.py +++ b/freqtrade/enums/runmode.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class RunMode(str, Enum): +class RunMode(StrEnum): """ Bot running mode (backtest, hyperopt, ...) can be "live", "dry-run", "backtest", "hyperopt". diff --git a/freqtrade/enums/signaltype.py b/freqtrade/enums/signaltype.py index 267a37ab3..082b9a88a 100644 --- a/freqtrade/enums/signaltype.py +++ b/freqtrade/enums/signaltype.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class SignalType(Enum): +class SignalType(StrEnum): """ Enum to distinguish between enter and exit signals """ @@ -11,11 +11,8 @@ class SignalType(Enum): ENTER_SHORT = "enter_short" EXIT_SHORT = "exit_short" - def __str__(self): - return f"{self.name.lower()}" - -class SignalTagType(Enum): +class SignalTagType(StrEnum): """ Enum for signal columns """ @@ -23,13 +20,7 @@ class SignalTagType(Enum): ENTER_TAG = "enter_tag" EXIT_TAG = "exit_tag" - def __str__(self): - return f"{self.name.lower()}" - -class SignalDirection(str, Enum): +class SignalDirection(StrEnum): LONG = "long" SHORT = "short" - - def __str__(self): - return f"{self.name.lower()}" diff --git a/freqtrade/enums/tradingmode.py b/freqtrade/enums/tradingmode.py index a681d60f9..7f025b033 100644 --- a/freqtrade/enums/tradingmode.py +++ b/freqtrade/enums/tradingmode.py @@ -1,7 +1,7 @@ -from enum import Enum +from enum import StrEnum -class TradingMode(str, Enum): +class TradingMode(StrEnum): """ Enum to distinguish between spot, margin, futures or any other trading method @@ -10,6 +10,3 @@ class TradingMode(str, Enum): SPOT = "spot" MARGIN = "margin" FUTURES = "futures" - - def __str__(self): - return f"{self.name.lower()}" diff --git a/freqtrade/exchange/exchange.py b/freqtrade/exchange/exchange.py index 4ed4a8d20..22b123ea8 100644 --- a/freqtrade/exchange/exchange.py +++ b/freqtrade/exchange/exchange.py @@ -207,7 +207,7 @@ class Exchange: self._config.get("trading_mode", self._supported_trading_mode_margin_pairs[0][0]) ) self.margin_mode: MarginMode = MarginMode( - MarginMode(self._config.get("margin_mode")) + self._config["margin_mode"] if self._config.get("margin_mode") else self._supported_trading_mode_margin_pairs[0][1] ) diff --git a/freqtrade/misc.py b/freqtrade/misc.py index e9dba5856..c1fdbc537 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -210,12 +210,12 @@ def remove_entry_exit_signals(dataframe: pd.DataFrame): :param dataframe: The DataFrame to remove signals from """ - dataframe[SignalType.ENTER_LONG.value] = 0 - dataframe[SignalType.EXIT_LONG.value] = 0 - dataframe[SignalType.ENTER_SHORT.value] = 0 - dataframe[SignalType.EXIT_SHORT.value] = 0 - dataframe[SignalTagType.ENTER_TAG.value] = None - dataframe[SignalTagType.EXIT_TAG.value] = None + dataframe[SignalType.ENTER_LONG] = 0 + dataframe[SignalType.EXIT_LONG] = 0 + dataframe[SignalType.ENTER_SHORT] = 0 + dataframe[SignalType.EXIT_SHORT] = 0 + dataframe[SignalTagType.ENTER_TAG] = None + dataframe[SignalTagType.EXIT_TAG] = None return dataframe diff --git a/freqtrade/persistence/key_value_store.py b/freqtrade/persistence/key_value_store.py index 0d5a97fa1..310e82b4b 100644 --- a/freqtrade/persistence/key_value_store.py +++ b/freqtrade/persistence/key_value_store.py @@ -1,5 +1,5 @@ from datetime import UTC, datetime -from enum import Enum +from enum import StrEnum from typing import ClassVar, Literal from sqlalchemy import String @@ -11,7 +11,7 @@ from freqtrade.persistence.base import ModelBase, SessionType ValueTypes = str | datetime | float | int -class ValueTypesEnum(str, Enum): +class ValueTypesEnum(StrEnum): STRING = "str" DATETIME = "datetime" FLOAT = "float" diff --git a/freqtrade/plugins/pairlist/IPairList.py b/freqtrade/plugins/pairlist/IPairList.py index 9cb5d7744..aa5f2c166 100644 --- a/freqtrade/plugins/pairlist/IPairList.py +++ b/freqtrade/plugins/pairlist/IPairList.py @@ -5,7 +5,7 @@ PairList Handler base class import logging from abc import ABC, abstractmethod from copy import deepcopy -from enum import Enum +from enum import StrEnum from typing import Any, Literal, TypedDict from freqtrade.constants import Config @@ -58,7 +58,7 @@ PairlistParameter = ( ) -class SupportsBacktesting(str, Enum): +class SupportsBacktesting(StrEnum): """ Enum to indicate if a Pairlist Handler supports backtesting. """ diff --git a/freqtrade/strategy/interface.py b/freqtrade/strategy/interface.py index 935f9dfdd..322f58f4f 100644 --- a/freqtrade/strategy/interface.py +++ b/freqtrade/strategy/interface.py @@ -1329,13 +1329,13 @@ class IStrategy(ABC, HyperStrategyMixin): return False, False, None if is_short: - enter = latest.get(SignalType.ENTER_SHORT.value, 0) == 1 - exit_ = latest.get(SignalType.EXIT_SHORT.value, 0) == 1 + enter = latest.get(SignalType.ENTER_SHORT, 0) == 1 + exit_ = latest.get(SignalType.EXIT_SHORT, 0) == 1 else: - enter = latest.get(SignalType.ENTER_LONG.value, 0) == 1 - exit_ = latest.get(SignalType.EXIT_LONG.value, 0) == 1 - exit_tag = latest.get(SignalTagType.EXIT_TAG.value, None) + enter = latest.get(SignalType.ENTER_LONG, 0) == 1 + exit_ = latest.get(SignalType.EXIT_LONG, 0) == 1 + exit_tag = latest.get(SignalTagType.EXIT_TAG, None) # Tags can be None, which does not resolve to False. exit_tag = exit_tag if isinstance(exit_tag, str) and exit_tag != "nan" else None @@ -1362,16 +1362,16 @@ class IStrategy(ABC, HyperStrategyMixin): if latest is None or latest_date is None: return None, None - enter_long = latest.get(SignalType.ENTER_LONG.value, 0) == 1 - exit_long = latest.get(SignalType.EXIT_LONG.value, 0) == 1 - enter_short = latest.get(SignalType.ENTER_SHORT.value, 0) == 1 - exit_short = latest.get(SignalType.EXIT_SHORT.value, 0) == 1 + enter_long = latest.get(SignalType.ENTER_LONG, 0) == 1 + exit_long = latest.get(SignalType.EXIT_LONG, 0) == 1 + enter_short = latest.get(SignalType.ENTER_SHORT, 0) == 1 + exit_short = latest.get(SignalType.EXIT_SHORT, 0) == 1 enter_signal: SignalDirection | None = None enter_tag: str | None = None if enter_long == 1 and not any([exit_long, enter_short]): enter_signal = SignalDirection.LONG - enter_tag = latest.get(SignalTagType.ENTER_TAG.value, None) + enter_tag = latest.get(SignalTagType.ENTER_TAG, None) if ( self.config.get("trading_mode", TradingMode.SPOT) != TradingMode.SPOT and self.can_short @@ -1379,7 +1379,7 @@ class IStrategy(ABC, HyperStrategyMixin): and not any([exit_short, enter_long]) ): enter_signal = SignalDirection.SHORT - enter_tag = latest.get(SignalTagType.ENTER_TAG.value, None) + enter_tag = latest.get(SignalTagType.ENTER_TAG, None) enter_tag = enter_tag if isinstance(enter_tag, str) and enter_tag != "nan" else None diff --git a/requirements-dev.txt b/requirements-dev.txt index 6be379720..0bf62751c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,7 +6,7 @@ -r requirements-freqai-rl.txt -r docs/requirements-docs.txt -ruff==0.14.14 +ruff==0.15.0 mypy==1.19.1 pre-commit==4.5.1 pytest==9.0.2 diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index a8fbf36af..dabbca655 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -6652,7 +6652,7 @@ def test_verify_candle_type_support(default_conf, mocker): with pytest.raises( OperationalException, - match=r"Exchange .* does not support fetching premiumindex candles\.", + match=r"Exchange .* does not support fetching premiumIndex candles\.", ): exchange.verify_candle_type_support(CandleType.PREMIUMINDEX)