From 550de0821dab58c80a143393095fcfa4da259f1d Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 21 Dec 2025 00:44:44 +0100 Subject: [PATCH] fix(qav3): computation of volume-weighted ER MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- ReforceXY/user_data/freqaimodels/ReforceXY.py | 6 ++---- .../freqaimodels/QuickAdapterRegressorV3.py | 2 +- .../user_data/strategies/QuickAdapterV3.py | 2 +- quickadapter/user_data/strategies/Utils.py | 18 ++++++++---------- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/ReforceXY/user_data/freqaimodels/ReforceXY.py b/ReforceXY/user_data/freqaimodels/ReforceXY.py index b59f2dd..183cb60 100644 --- a/ReforceXY/user_data/freqaimodels/ReforceXY.py +++ b/ReforceXY/user_data/freqaimodels/ReforceXY.py @@ -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( diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 75e7af0..ac10393 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -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 diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 4c2081e..9e9e45f 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -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" diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 638e2e4..6a5efa9 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -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 -- 2.53.0