from optuna.exceptions import ExperimentalWarning
from optuna.pruners import HyperbandPruner
from optuna.samplers import TPESampler
-from optuna.storages import BaseStorage, JournalStorage, RDBStorage
+from optuna.storages import (
+ BaseStorage,
+ JournalStorage,
+ RDBStorage,
+ RetryFailedTrialCallback,
+)
from optuna.storages.journal import JournalFileBackend
from optuna.study import Study, StudyDirection
from pandas import DataFrame, concat, merge
storage_backend = self.rl_config_optuna.get("storage", "sqlite")
if storage_backend == "sqlite":
storage = RDBStorage(
- url=f"sqlite:///{storage_dir}/{storage_filename}.sqlite"
+ url=f"sqlite:///{storage_dir}/{storage_filename}.sqlite",
+ heartbeat_interval=60,
+ failed_trial_callback=RetryFailedTrialCallback(max_retry=3),
)
elif storage_backend == "file":
storage = JournalStorage(
min_natr_ratio_percent: float = 0.00999,
max_natr_ratio_percent: float = 0.099,
lookback_period: int = 1,
- decay_ratio: float = 0.5,
+ decay_ratio: float = 0.6,
) -> bool:
"""
Confirm a reversal using a multi-candle lookback chain.
- A geometric decay is applied for each lookback step k:
min_natr_ratio_percent/max_natr_ratio_percent bounds are multiplied
by (decay_ratio ** k) and clamped to [0, 1] for the threshold computed on candle [-(k+1)].
- Default decay_ratio=0.5.
+ Default decay_ratio=0.6.
Set decay_ratio=1.0 to disable decay and keep the current behavior.
Fallbacks:
- If thresholds or closes are unavailable for any k, only the current threshold condition is enforced.
if not isinstance(close_k, (int, float)) or not np.isfinite(close_k):
return current_ok
+ decay_factor = decay_ratio**k
decayed_min_natr_ratio_percent = max(
- 0.0, min(1.0, min_natr_ratio_percent * (decay_ratio**k))
+ 0.0, min(1.0, min_natr_ratio_percent * decay_factor)
)
decayed_max_natr_ratio_percent = max(
decayed_min_natr_ratio_percent,
- min(1.0, max_natr_ratio_percent * (decay_ratio**k)),
+ min(1.0, max_natr_ratio_percent * decay_factor),
)
threshold_k = self.calculate_candle_threshold(