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

View File

@@ -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

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"""
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:

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
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()}"

View File

@@ -1,6 +1,6 @@
from enum import Enum
from enum import StrEnum
class OrderTypeValues(str, Enum):
class OrderTypeValues(StrEnum):
limit = "limit"
market = "market"

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"""
LAST = "last"

View File

@@ -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)

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, ...)
can be "live", "dry-run", "backtest", "hyperopt".

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
"""
@@ -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()}"

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
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()}"

View File

@@ -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]
)

View File

@@ -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

View File

@@ -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"

View File

@@ -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.
"""

View File

@@ -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

View File

@@ -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

View File

@@ -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)