Merge pull request #12810 from freqtrade/update/pre-commit-hooks
Update pre-commit hooks
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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()}"
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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".
|
||||||
|
|||||||
@@ -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()}"
|
|
||||||
|
|||||||
@@ -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()}"
|
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user