Fixed building of wrong reason texts

Removed unnecessary method set_unlock_at_as_stop_duration()
This commit is contained in:
simwai
2024-07-14 21:46:22 +02:00
parent f126120421
commit be894664ef
5 changed files with 51 additions and 52 deletions
@@ -18,16 +18,23 @@ class CooldownPeriod(IProtection):
""" """
LockReason to use LockReason to use
""" """
reason = f"Cooldown period for {self.stop_duration_str}." reason = "Cooldown period"
if self.unlock_at_str is not None: if self.unlock_at_str is not None:
reason += f" Unlocking trading at {self.unlock_at_str}." return f"{reason} until {self.unlock_at_str}."
return reason else:
return f"{reason}of {self.stop_duration_str}."
def short_desc(self) -> str: def short_desc(self) -> str:
""" """
Short method description - used for startup-messages Short method description - used for startup messages
""" """
return f"{self.name} - Cooldown period of {self.stop_duration_str}." result = f"{self.name} - Cooldown period "
if self.unlock_at_str is not None:
return f"{result} until {self.unlock_at_str}."
else:
return f"{result}of {self.stop_duration_str}."
def _cooldown_period(self, pair: str, date_now: datetime) -> Optional[ProtectionReturn]: def _cooldown_period(self, pair: str, date_now: datetime) -> Optional[ProtectionReturn]:
""" """
@@ -47,9 +54,10 @@ class CooldownPeriod(IProtection):
trade = sorted(trades, key=lambda t: t.close_date)[-1] # type: ignore trade = sorted(trades, key=lambda t: t.close_date)[-1] # type: ignore
self.log_once(f"Cooldown for {pair} for {self.stop_duration_str}.", logger.info) self.log_once(f"Cooldown for {pair} for {self.stop_duration_str}.", logger.info)
self.set_unlock_at_as_stop_duration() if self.unlock_at is not None:
until = self.calculate_unlock_at()
until = self.calculate_lock_end([trade], self._stop_duration) else:
until = self.calculate_lock_end([trade], self._stop_duration)
return ProtectionReturn( return ProtectionReturn(
lock=True, lock=True,
+11 -26
View File
@@ -36,19 +36,21 @@ class IProtection(LoggingMixin, ABC):
self.unlock_at: Optional[datetime] = None self.unlock_at: Optional[datetime] = None
tf_in_min = timeframe_to_minutes(config["timeframe"]) tf_in_min = timeframe_to_minutes(config["timeframe"])
if "stop_duration_candles" in protection_config: if "unlock_at" in protection_config:
self._stop_duration_candles = int(protection_config.get("stop_duration_candles", 1)) self.unlock_at = self.calculate_unlock_at()
self._stop_duration = tf_in_min * self._stop_duration_candles
else: else:
self._stop_duration = int(protection_config.get("stop_duration", 60)) if "stop_duration_candles" in protection_config:
self._stop_duration_candles = int(protection_config.get("stop_duration_candles", 1))
self._stop_duration = tf_in_min * self._stop_duration_candles
else:
self._stop_duration = int(protection_config.get("stop_duration", 60))
if "lookback_period_candles" in protection_config: if "lookback_period_candles" in protection_config:
self._lookback_period_candles = int(protection_config.get("lookback_period_candles", 1)) self._lookback_period_candles = int(protection_config.get("lookback_period_candles", 1))
self._lookback_period = tf_in_min * self._lookback_period_candles self._lookback_period = tf_in_min * self._lookback_period_candles
else: else:
self._lookback_period = int(protection_config.get("lookback_period", 60)) self._lookback_period = int(protection_config.get("lookback_period", 60))
self.set_unlock_at_as_stop_duration()
LoggingMixin.__init__(self, logger) LoggingMixin.__init__(self, logger)
@property @property
@@ -90,24 +92,10 @@ class IProtection(LoggingMixin, ABC):
return self.unlock_at.strftime("%H:%M") return self.unlock_at.strftime("%H:%M")
return None return None
def set_unlock_at_as_stop_duration(self) -> None: def calculate_unlock_at(self) -> datetime:
""" """
Calculates the stop_duration based on the unlock_at protection config value and sets it. Calculate and update the unlock time based on the unlock at config.
""" """
if "unlock_at" in self._protection_config:
self._stop_duration = self.calculate_unlock_at()
return None
logger.warning(
"Couldn't update the stop duration, because unlock_at is not set in the "
"protection config."
)
def calculate_unlock_at(self) -> int:
"""
Calculate and update the stop duration based on the unlock at config.
"""
now_time = datetime.now(timezone.utc) now_time = datetime.now(timezone.utc)
unlock_at = datetime.strptime( unlock_at = datetime.strptime(
str(self._protection_config.get("unlock_at")), "%H:%M" str(self._protection_config.get("unlock_at")), "%H:%M"
@@ -116,9 +104,7 @@ class IProtection(LoggingMixin, ABC):
if unlock_at.time() < now_time.time(): if unlock_at.time() < now_time.time():
unlock_at = unlock_at.replace(day=now_time.day + 1) unlock_at = unlock_at.replace(day=now_time.day + 1)
self.unlock_at = unlock_at.replace(tzinfo=timezone.utc) return unlock_at.replace(tzinfo=timezone.utc)
result = IProtection.calculate_timespan(now_time, self.unlock_at)
return result
@abstractmethod @abstractmethod
def short_desc(self) -> str: def short_desc(self) -> str:
@@ -156,7 +142,6 @@ class IProtection(LoggingMixin, ABC):
max_date = max_date.replace(tzinfo=timezone.utc) max_date = max_date.replace(tzinfo=timezone.utc)
until = max_date + timedelta(minutes=stop_minutes) until = max_date + timedelta(minutes=stop_minutes)
return until return until
@staticmethod @staticmethod
@@ -34,12 +34,11 @@ class LowProfitPairs(IProtection):
""" """
LockReason to use LockReason to use
""" """
reason = ( reason = f"{profit} < {self._required_profit} in {self.lookback_period_str}, locking"
f"{profit} < {self._required_profit} in {self.lookback_period_str}, "
f"locking for {self.stop_duration_str}."
)
if self.unlock_at_str is not None: if self.unlock_at_str is not None:
reason += f" Unlocking trading at {self.unlock_at_str}." reason += f" until {self.unlock_at_str}."
else:
reason += f" for {self.stop_duration_str}."
return reason return reason
def _low_profit( def _low_profit(
@@ -74,8 +73,10 @@ class LowProfitPairs(IProtection):
logger.info, logger.info,
) )
self.set_unlock_at_as_stop_duration() if self.unlock_at is not None:
until = self.calculate_lock_end(trades, self._stop_duration) until = self.calculate_unlock_at()
else:
until = self.calculate_lock_end(trades, self._stop_duration)
return ProtectionReturn( return ProtectionReturn(
lock=True, lock=True,
@@ -39,10 +39,12 @@ class MaxDrawdown(IProtection):
""" """
reason = ( reason = (
f"{drawdown} passed {self._max_allowed_drawdown} in {self.lookback_period_str}, " f"{drawdown} passed {self._max_allowed_drawdown} in {self.lookback_period_str}, "
f"locking for {self.stop_duration_str}." f"locking "
) )
if self.unlock_at_str is not None: if self.unlock_at_str is not None:
reason += f" Unlocking trading at {self.unlock_at_str}." reason += f" until {self.unlock_at_str}."
else:
reason += f" for {self.stop_duration_str}."
return reason return reason
def _max_drawdown(self, date_now: datetime) -> Optional[ProtectionReturn]: def _max_drawdown(self, date_now: datetime) -> Optional[ProtectionReturn]:
@@ -74,8 +76,10 @@ class MaxDrawdown(IProtection):
logger.info, logger.info,
) )
self.set_unlock_at_as_stop_duration() if self.unlock_at is not None:
until = self.calculate_lock_end(trades, self._stop_duration) until = self.calculate_unlock_at()
else:
until = self.calculate_lock_end(trades, self._stop_duration)
return ProtectionReturn( return ProtectionReturn(
lock=True, lock=True,
@@ -36,12 +36,11 @@ class StoplossGuard(IProtection):
""" """
LockReason to use LockReason to use
""" """
reason = ( reason = f"{self._trade_limit} stoplosses in {self._lookback_period} min, " f"locking "
f"{self._trade_limit} stoplosses in {self._lookback_period} min, "
f"locking for {self._stop_duration} min."
)
if self.unlock_at_str is not None: if self.unlock_at_str is not None:
reason += f" Unlocking trading at {self.unlock_at_str}." reason += f" until {self.unlock_at_str}."
else:
reason += f" for {self._stop_duration} min."
return reason return reason
def _stoploss_guard( def _stoploss_guard(
@@ -82,8 +81,10 @@ class StoplossGuard(IProtection):
logger.info, logger.info,
) )
self.set_unlock_at_as_stop_duration() if self.unlock_at is not None:
until = self.calculate_lock_end(trades, self._stop_duration) until = self.calculate_unlock_at()
else:
until = self.calculate_lock_end(trades, self._stop_duration)
return ProtectionReturn( return ProtectionReturn(
lock=True, lock=True,