]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): computation of volume-weighted ER
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 20 Dec 2025 23:44:44 +0000 (00:44 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sat, 20 Dec 2025 23:44:44 +0000 (00:44 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/user_data/freqaimodels/ReforceXY.py
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index b59f2dd2f3bd49e11408a28dc870d9f95eed0b11..183cb60a005f4131a8be52fb853fc98264916d6f 100644 (file)
@@ -1627,8 +1627,7 @@ class MyRLEnv(Base5ActionRLEnv):
                 "exit_potential_mode", ReforceXY._EXIT_POTENTIAL_MODES[0]
             )  # "canonical"
         )
-        _allowed_exit_modes = set(ReforceXY._EXIT_POTENTIAL_MODES)
-        if self._exit_potential_mode not in _allowed_exit_modes:
+        if self._exit_potential_mode not in set(ReforceXY._EXIT_POTENTIAL_MODES):
             logger.warning(
                 "Unknown exit_potential_mode %r; defaulting to %r. Valid modes: %s",
                 self._exit_potential_mode,
@@ -2055,10 +2054,9 @@ class MyRLEnv(Base5ActionRLEnv):
         bool
             True if configuration preserves theoretical PBRS invariance
         """
-        # "canonical"
         return self._exit_potential_mode == ReforceXY._EXIT_POTENTIAL_MODES[0] and not (
             self._entry_additive_enabled or self._exit_additive_enabled
-        )
+        )  # "canonical"
 
     @staticmethod
     def is_unsupported_pbrs_config(
index 75e7af03bc04905c1be99b8a9f4019ae9d3033d5..ac1039309514da172409b5f8172f0e152915d370 100644 (file)
@@ -72,7 +72,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
     https://github.com/sponsors/robcaulk
     """
 
-    version = "3.7.136"
+    version = "3.7.137"
 
     _TEST_SIZE: Final[float] = 0.1
 
index 4c2081e786d883f978d1ce13fb9323220dec9c8a..9e9e45fd6d2f494058e2595ecd11def42c10d06e 100644 (file)
@@ -107,7 +107,7 @@ class QuickAdapterV3(IStrategy):
     _TRADING_MODES: Final[tuple[TradingMode, ...]] = ("spot", "margin", "futures")
 
     def version(self) -> str:
-        return "3.3.186"
+        return "3.3.187"
 
     timeframe = "5m"
 
index 638e2e4a2fad05bc0c504c29770dd92f9d2dad29..6a5efa9c0709107cd75398a2a335685e13569c03 100644 (file)
@@ -1641,8 +1641,8 @@ def zigzag(
 
         closes_slice = closes[start_pos:end_pos]
         close_diffs = np.diff(closes_slice)
-        path_length = float(np.nansum(np.abs(close_diffs)))
-        net_move = float(abs(closes_slice[-1] - closes_slice[0]))
+        path_length = np.nansum(np.abs(close_diffs))
+        net_move = abs(closes_slice[-1] - closes_slice[0])
 
         if not (np.isfinite(path_length) and np.isfinite(net_move)):
             return np.nan
@@ -1666,25 +1666,23 @@ def zigzag(
         if (end_pos - start_pos) < 2:
             return np.nan
 
-        closes_slice = closes[start_pos:end_pos]
-        close_diffs = np.diff(closes_slice)
-        net_move = float(abs(closes_slice[-1] - closes_slice[0]))
-
         volumes_slice = volumes[start_pos + 1 : end_pos]
         total_volume = np.nansum(volumes_slice)
         if not np.isfinite(total_volume) or np.isclose(total_volume, 0.0):
             return np.nan
-
         volume_weights = volumes_slice / total_volume
 
-        vw_path_length = float(np.nansum(np.abs(close_diffs) * volume_weights))
+        closes_slice = closes[start_pos:end_pos]
+        vw_close_diffs = np.diff(closes_slice) * volume_weights
+        vw_path_length = float(np.nansum(np.abs(vw_close_diffs)))
+        vw_net_move = abs(np.nansum(vw_close_diffs))
 
-        if not (np.isfinite(vw_path_length) and np.isfinite(net_move)):
+        if not (np.isfinite(vw_path_length) and np.isfinite(vw_net_move)):
             return np.nan
         if np.isclose(vw_path_length, 0.0):
             return np.nan
 
-        return net_move / vw_path_length
+        return vw_net_move / vw_path_length
 
     def add_pivot(pos: int, value: float, direction: TrendDirection):
         nonlocal last_pivot_pos