]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf(qav3): tune reversal confirmation
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 23 Aug 2025 14:09:49 +0000 (16:09 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 23 Aug 2025 14:09:49 +0000 (16:09 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/user_data/freqaimodels/ReforceXY.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index 24a6558e4e4b16e9b8ab8a80f273a1e591f3a123..b2160fd91de85d17dcf763ffe6fcdc5053197969 100644 (file)
@@ -29,7 +29,12 @@ from optuna import Trial, TrialPruned, create_study
 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
@@ -494,7 +499,9 @@ class ReforceXY(BaseReinforcementLearningModel):
         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(
index 7170f9b87db3e770914cdf980d8d4bfb501e0f55..c172b79f0c08228a274d7cbf4c2c839052ed493e 100644 (file)
@@ -1125,7 +1125,7 @@ class QuickAdapterV3(IStrategy):
         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.
@@ -1137,7 +1137,7 @@ class QuickAdapterV3(IStrategy):
         - 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.
@@ -1187,12 +1187,13 @@ class QuickAdapterV3(IStrategy):
             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(