Merge pull request #12810 from freqtrade/update/pre-commit-hooks

Update pre-commit hooks
This commit is contained in:
Matthias
2026-02-10 19:56:09 +01:00
committed by GitHub
16 changed files with 45 additions and 68 deletions
+1 -1
View File
@@ -44,7 +44,7 @@ repos:
- repo: https://github.com/charliermarsh/ruff-pre-commit - repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: 'v0.14.14' rev: 'v0.15.0'
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum from enum import StrEnum
class CandleType(str, Enum): class CandleType(StrEnum):
"""Enum to distinguish candle types""" """Enum to distinguish candle types"""
SPOT = "spot" SPOT = "spot"
@@ -14,9 +14,6 @@ class CandleType(str, Enum):
FUNDING_RATE = "funding_rate" FUNDING_RATE = "funding_rate"
# BORROW_RATE = "borrow_rate" # * unimplemented # BORROW_RATE = "borrow_rate" # * unimplemented
def __str__(self):
return f"{self.name.lower()}"
@staticmethod @staticmethod
def from_string(value: str) -> "CandleType": def from_string(value: str) -> "CandleType":
if not value: if not value:
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum from enum import StrEnum
class MarginMode(str, Enum): class MarginMode(StrEnum):
""" """
Enum to distinguish between Enum to distinguish between
cross margin/futures margin_mode and cross margin/futures margin_mode and
@@ -11,6 +11,3 @@ class MarginMode(str, Enum):
CROSS = "cross" CROSS = "cross"
ISOLATED = "isolated" ISOLATED = "isolated"
NONE = "" NONE = ""
def __str__(self):
return f"{self.value.lower()}"
+2 -2
View File
@@ -1,6 +1,6 @@
from enum import Enum from enum import StrEnum
class OrderTypeValues(str, Enum): class OrderTypeValues(StrEnum):
limit = "limit" limit = "limit"
market = "market" market = "market"
+2 -2
View File
@@ -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""" """Enum to distinguish possible trigger prices for stoplosses"""
LAST = "last" LAST = "last"
+4 -9
View File
@@ -1,7 +1,7 @@
from enum import Enum from enum import StrEnum
class RPCMessageType(str, Enum): class RPCMessageType(StrEnum):
STATUS = "status" STATUS = "status"
WARNING = "warning" WARNING = "warning"
EXCEPTION = "exception" EXCEPTION = "exception"
@@ -25,21 +25,16 @@ class RPCMessageType(str, Enum):
NEW_CANDLE = "new_candle" NEW_CANDLE = "new_candle"
def __repr__(self): def __repr__(self):
return self.value # TODO: do we still need to overwrite __repr__? Impact needs to be looked at in detail
def __str__(self):
return self.value return self.value
# Enum for parsing requests from ws consumers # Enum for parsing requests from ws consumers
class RPCRequestType(str, Enum): class RPCRequestType(StrEnum):
SUBSCRIBE = "subscribe" SUBSCRIBE = "subscribe"
WHITELIST = "whitelist" WHITELIST = "whitelist"
ANALYZED_DF = "analyzed_df" ANALYZED_DF = "analyzed_df"
def __str__(self):
return self.value
NO_ECHO_MESSAGES = (RPCMessageType.ANALYZED_DF, RPCMessageType.WHITELIST, RPCMessageType.NEW_CANDLE) NO_ECHO_MESSAGES = (RPCMessageType.ANALYZED_DF, RPCMessageType.WHITELIST, RPCMessageType.NEW_CANDLE)
+2 -2
View File
@@ -1,7 +1,7 @@
from enum import Enum from enum import StrEnum
class RunMode(str, Enum): class RunMode(StrEnum):
""" """
Bot running mode (backtest, hyperopt, ...) Bot running mode (backtest, hyperopt, ...)
can be "live", "dry-run", "backtest", "hyperopt". can be "live", "dry-run", "backtest", "hyperopt".
+4 -13
View File
@@ -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 Enum to distinguish between enter and exit signals
""" """
@@ -11,11 +11,8 @@ class SignalType(Enum):
ENTER_SHORT = "enter_short" ENTER_SHORT = "enter_short"
EXIT_SHORT = "exit_short" EXIT_SHORT = "exit_short"
def __str__(self):
return f"{self.name.lower()}"
class SignalTagType(StrEnum):
class SignalTagType(Enum):
""" """
Enum for signal columns Enum for signal columns
""" """
@@ -23,13 +20,7 @@ class SignalTagType(Enum):
ENTER_TAG = "enter_tag" ENTER_TAG = "enter_tag"
EXIT_TAG = "exit_tag" EXIT_TAG = "exit_tag"
def __str__(self):
return f"{self.name.lower()}"
class SignalDirection(StrEnum):
class SignalDirection(str, Enum):
LONG = "long" LONG = "long"
SHORT = "short" SHORT = "short"
def __str__(self):
return f"{self.name.lower()}"
+2 -5
View File
@@ -1,7 +1,7 @@
from enum import Enum from enum import StrEnum
class TradingMode(str, Enum): class TradingMode(StrEnum):
""" """
Enum to distinguish between Enum to distinguish between
spot, margin, futures or any other trading method spot, margin, futures or any other trading method
@@ -10,6 +10,3 @@ class TradingMode(str, Enum):
SPOT = "spot" SPOT = "spot"
MARGIN = "margin" MARGIN = "margin"
FUTURES = "futures" FUTURES = "futures"
def __str__(self):
return f"{self.name.lower()}"
+1 -1
View File
@@ -207,7 +207,7 @@ class Exchange:
self._config.get("trading_mode", self._supported_trading_mode_margin_pairs[0][0]) self._config.get("trading_mode", self._supported_trading_mode_margin_pairs[0][0])
) )
self.margin_mode: MarginMode = MarginMode( self.margin_mode: MarginMode = MarginMode(
MarginMode(self._config.get("margin_mode")) self._config["margin_mode"]
if self._config.get("margin_mode") if self._config.get("margin_mode")
else self._supported_trading_mode_margin_pairs[0][1] else self._supported_trading_mode_margin_pairs[0][1]
) )
+6 -6
View File
@@ -210,12 +210,12 @@ def remove_entry_exit_signals(dataframe: pd.DataFrame):
:param dataframe: The DataFrame to remove signals from :param dataframe: The DataFrame to remove signals from
""" """
dataframe[SignalType.ENTER_LONG.value] = 0 dataframe[SignalType.ENTER_LONG] = 0
dataframe[SignalType.EXIT_LONG.value] = 0 dataframe[SignalType.EXIT_LONG] = 0
dataframe[SignalType.ENTER_SHORT.value] = 0 dataframe[SignalType.ENTER_SHORT] = 0
dataframe[SignalType.EXIT_SHORT.value] = 0 dataframe[SignalType.EXIT_SHORT] = 0
dataframe[SignalTagType.ENTER_TAG.value] = None dataframe[SignalTagType.ENTER_TAG] = None
dataframe[SignalTagType.EXIT_TAG.value] = None dataframe[SignalTagType.EXIT_TAG] = None
return dataframe return dataframe
+2 -2
View File
@@ -1,5 +1,5 @@
from datetime import UTC, datetime from datetime import UTC, datetime
from enum import Enum from enum import StrEnum
from typing import ClassVar, Literal from typing import ClassVar, Literal
from sqlalchemy import String from sqlalchemy import String
@@ -11,7 +11,7 @@ from freqtrade.persistence.base import ModelBase, SessionType
ValueTypes = str | datetime | float | int ValueTypes = str | datetime | float | int
class ValueTypesEnum(str, Enum): class ValueTypesEnum(StrEnum):
STRING = "str" STRING = "str"
DATETIME = "datetime" DATETIME = "datetime"
FLOAT = "float" FLOAT = "float"
+2 -2
View File
@@ -5,7 +5,7 @@ PairList Handler base class
import logging import logging
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from copy import deepcopy from copy import deepcopy
from enum import Enum from enum import StrEnum
from typing import Any, Literal, TypedDict from typing import Any, Literal, TypedDict
from freqtrade.constants import Config 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. Enum to indicate if a Pairlist Handler supports backtesting.
""" """
+11 -11
View File
@@ -1329,13 +1329,13 @@ class IStrategy(ABC, HyperStrategyMixin):
return False, False, None return False, False, None
if is_short: if is_short:
enter = latest.get(SignalType.ENTER_SHORT.value, 0) == 1 enter = latest.get(SignalType.ENTER_SHORT, 0) == 1
exit_ = latest.get(SignalType.EXIT_SHORT.value, 0) == 1 exit_ = latest.get(SignalType.EXIT_SHORT, 0) == 1
else: else:
enter = latest.get(SignalType.ENTER_LONG.value, 0) == 1 enter = latest.get(SignalType.ENTER_LONG, 0) == 1
exit_ = latest.get(SignalType.EXIT_LONG.value, 0) == 1 exit_ = latest.get(SignalType.EXIT_LONG, 0) == 1
exit_tag = latest.get(SignalTagType.EXIT_TAG.value, None) exit_tag = latest.get(SignalTagType.EXIT_TAG, None)
# Tags can be None, which does not resolve to False. # 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 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: if latest is None or latest_date is None:
return None, None return None, None
enter_long = latest.get(SignalType.ENTER_LONG.value, 0) == 1 enter_long = latest.get(SignalType.ENTER_LONG, 0) == 1
exit_long = latest.get(SignalType.EXIT_LONG.value, 0) == 1 exit_long = latest.get(SignalType.EXIT_LONG, 0) == 1
enter_short = latest.get(SignalType.ENTER_SHORT.value, 0) == 1 enter_short = latest.get(SignalType.ENTER_SHORT, 0) == 1
exit_short = latest.get(SignalType.EXIT_SHORT.value, 0) == 1 exit_short = latest.get(SignalType.EXIT_SHORT, 0) == 1
enter_signal: SignalDirection | None = None enter_signal: SignalDirection | None = None
enter_tag: str | None = None enter_tag: str | None = None
if enter_long == 1 and not any([exit_long, enter_short]): if enter_long == 1 and not any([exit_long, enter_short]):
enter_signal = SignalDirection.LONG enter_signal = SignalDirection.LONG
enter_tag = latest.get(SignalTagType.ENTER_TAG.value, None) enter_tag = latest.get(SignalTagType.ENTER_TAG, None)
if ( if (
self.config.get("trading_mode", TradingMode.SPOT) != TradingMode.SPOT self.config.get("trading_mode", TradingMode.SPOT) != TradingMode.SPOT
and self.can_short and self.can_short
@@ -1379,7 +1379,7 @@ class IStrategy(ABC, HyperStrategyMixin):
and not any([exit_short, enter_long]) and not any([exit_short, enter_long])
): ):
enter_signal = SignalDirection.SHORT 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 enter_tag = enter_tag if isinstance(enter_tag, str) and enter_tag != "nan" else None
+1 -1
View File
@@ -6,7 +6,7 @@
-r requirements-freqai-rl.txt -r requirements-freqai-rl.txt
-r docs/requirements-docs.txt -r docs/requirements-docs.txt
ruff==0.14.14 ruff==0.15.0
mypy==1.19.1 mypy==1.19.1
pre-commit==4.5.1 pre-commit==4.5.1
pytest==9.0.2 pytest==9.0.2
+1 -1
View File
@@ -6652,7 +6652,7 @@ def test_verify_candle_type_support(default_conf, mocker):
with pytest.raises( with pytest.raises(
OperationalException, 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) exchange.verify_candle_type_support(CandleType.PREMIUMINDEX)