From 4227451fb4dff85d9d80d86ae0d694caa925240d Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 13 Dec 2025 01:04:21 +0100 Subject: [PATCH] refactor: add pivot volumes calculation in zigzag function MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- .../freqaimodels/QuickAdapterRegressorV3.py | 1 + .../user_data/strategies/QuickAdapterV3.py | 1 + quickadapter/user_data/strategies/Utils.py | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index e58001a..9bba1e8 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -2296,6 +2296,7 @@ def label_objective( _, pivots_amplitudes, pivots_amplitude_threshold_ratios, + _, ) = zigzag( df, natr_period=label_period_candles, diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 6ce89a0..0dba967 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -928,6 +928,7 @@ class QuickAdapterV3(IStrategy): pivots_directions, pivots_amplitudes, pivots_amplitude_threshold_ratios, + _, ) = zigzag( dataframe, natr_period=label_period_candles, diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 4bcc5cd..1c13494 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -1095,6 +1095,7 @@ def zigzag( list[TrendDirection], list[float], list[float], + list[float], ]: n = len(df) if df.empty or n < natr_period: @@ -1104,6 +1105,7 @@ def zigzag( [], [], [], + [], ) natr_values = (ta.NATR(df, timeperiod=natr_period).bfill() / 100.0).to_numpy() @@ -1114,6 +1116,7 @@ def zigzag( log_closes = np.log(closes) highs = df.get("high").to_numpy() lows = df.get("low").to_numpy() + volumes = df.get("volume").to_numpy() state: TrendDirection = TrendDirection.NEUTRAL @@ -1122,6 +1125,7 @@ def zigzag( pivots_directions: list[TrendDirection] = [] pivots_amplitudes: list[float] = [] pivots_amplitude_threshold_ratios: list[float] = [] + pivots_volumes: list[float] = [] last_pivot_pos: int = -1 candidate_pivot_pos: int = -1 @@ -1197,6 +1201,21 @@ def zigzag( return amplitude, amplitude_threshold_ratio + def calculate_pivot_volume( + *, + previous_pos: int, + current_pos: int, + ) -> float: + if previous_pos < 0 or current_pos < 0: + return np.nan + if previous_pos >= n or current_pos >= n: + return np.nan + + start_pos = min(previous_pos, current_pos) + end_pos = max(previous_pos, current_pos) + 1 + volume = np.nansum(volumes[start_pos:end_pos]) + return volume + def add_pivot(pos: int, value: float, direction: TrendDirection): nonlocal last_pivot_pos if pivots_indices and indices[pos] == pivots_indices[-1]: @@ -1214,12 +1233,18 @@ def zigzag( current_value=value, ) ) + volume = calculate_pivot_volume( + previous_pos=last_pivot_pos, + current_pos=pos, + ) else: amplitude = np.nan amplitude_threshold_ratio = np.nan + volume = np.nan pivots_amplitudes.append(amplitude) pivots_amplitude_threshold_ratios.append(amplitude_threshold_ratio) + pivots_volumes.append(volume) last_pivot_pos = pos reset_candidate_pivot() @@ -1344,6 +1369,7 @@ def zigzag( [], [], [], + [], ) for i in range(last_pivot_pos + 1, n): @@ -1380,6 +1406,7 @@ def zigzag( pivots_directions, pivots_amplitudes, pivots_amplitude_threshold_ratios, + pivots_volumes, ) -- 2.43.0