https://github.com/sponsors/robcaulk
     """
 
-    version = "3.7.31"
+    version = "3.7.32"
 
     @cached_property
     def _optuna_config(self) -> dict:
         previous_closes = closes[previous_slice]
         previous_highs = highs[previous_slice]
         previous_lows = lows[previous_slice]
-        if len(next_closes) == 0 or len(previous_closes) == 0:
-            return False
+
+        local_extrema_ok = False
+        if direction == TrendDirection.DOWN:
+            if (
+                np.all(next_closes < highs[candidate_pivot_pos])
+                and np.all(previous_closes < highs[candidate_pivot_pos])
+                and np.max(next_highs) <= highs[candidate_pivot_pos]
+                and np.max(previous_highs) <= highs[candidate_pivot_pos]
+            ):
+                local_extrema_ok = True
+        elif direction == TrendDirection.UP:
+            if (
+                np.all(next_closes > lows[candidate_pivot_pos])
+                and np.all(previous_closes > lows[candidate_pivot_pos])
+                and np.min(next_lows) >= lows[candidate_pivot_pos]
+                and np.min(previous_lows) >= lows[candidate_pivot_pos]
+            ):
+                local_extrema_ok = True
 
         slope_ok = True
         if len(next_closes) >= 2:
             elif direction == TrendDirection.UP:
                 slope_ok = next_slope > 0
 
-        thresholds_ratio = 0.175
+        thresholds_ratio = 0.25
         significant_move_away_ok = False
         if direction == TrendDirection.DOWN:
             if np.any(
             ):
                 significant_move_away_ok = True
 
-        if direction == TrendDirection.DOWN:
-            return (
-                np.all(next_closes < highs[candidate_pivot_pos])
-                and np.all(previous_closes < highs[candidate_pivot_pos])
-                and np.max(next_highs) <= highs[candidate_pivot_pos]
-                and np.max(previous_highs) <= highs[candidate_pivot_pos]
-                and slope_ok
-                and significant_move_away_ok
-            )
-        elif direction == TrendDirection.UP:
-            return (
-                np.all(next_closes > lows[candidate_pivot_pos])
-                and np.all(previous_closes > lows[candidate_pivot_pos])
-                and np.min(next_lows) >= lows[candidate_pivot_pos]
-                and np.min(previous_lows) >= lows[candidate_pivot_pos]
-                and slope_ok
-                and significant_move_away_ok
-            )
-        return False
+        return local_extrema_ok and slope_ok and significant_move_away_ok
 
     start_pos = 0
     initial_high_pos = start_pos
         max_label_period_candles,
         step=candles_step,
     )
-    label_natr_ratio = trial.suggest_float("label_natr_ratio", 0.07, 0.2)
+    label_natr_ratio = trial.suggest_float("label_natr_ratio", 0.08, 0.25)
 
     df = df.iloc[
         -(
 
         previous_closes = closes[previous_slice]
         previous_highs = highs[previous_slice]
         previous_lows = lows[previous_slice]
-        if len(next_closes) == 0 or len(previous_closes) == 0:
-            return False
+
+        local_extrema_ok = False
+        if direction == TrendDirection.DOWN:
+            if (
+                np.all(next_closes < highs[candidate_pivot_pos])
+                and np.all(previous_closes < highs[candidate_pivot_pos])
+                and np.max(next_highs) <= highs[candidate_pivot_pos]
+                and np.max(previous_highs) <= highs[candidate_pivot_pos]
+            ):
+                local_extrema_ok = True
+        elif direction == TrendDirection.UP:
+            if (
+                np.all(next_closes > lows[candidate_pivot_pos])
+                and np.all(previous_closes > lows[candidate_pivot_pos])
+                and np.min(next_lows) >= lows[candidate_pivot_pos]
+                and np.min(previous_lows) >= lows[candidate_pivot_pos]
+            ):
+                local_extrema_ok = True
 
         slope_ok = True
         if len(next_closes) >= 2:
             elif direction == TrendDirection.UP:
                 slope_ok = next_slope > 0
 
-        thresholds_ratio = 0.175
+        thresholds_ratio = 0.25
         significant_move_away_ok = False
         if direction == TrendDirection.DOWN:
             if np.any(
             ):
                 significant_move_away_ok = True
 
-        if direction == TrendDirection.DOWN:
-            return (
-                np.all(next_closes < highs[candidate_pivot_pos])
-                and np.all(previous_closes < highs[candidate_pivot_pos])
-                and np.max(next_highs) <= highs[candidate_pivot_pos]
-                and np.max(previous_highs) <= highs[candidate_pivot_pos]
-                and slope_ok
-                and significant_move_away_ok
-            )
-        elif direction == TrendDirection.UP:
-            return (
-                np.all(next_closes > lows[candidate_pivot_pos])
-                and np.all(previous_closes > lows[candidate_pivot_pos])
-                and np.min(next_lows) >= lows[candidate_pivot_pos]
-                and np.min(previous_lows) >= lows[candidate_pivot_pos]
-                and slope_ok
-                and significant_move_away_ok
-            )
-        return False
+        return local_extrema_ok and slope_ok and significant_move_away_ok
 
     start_pos = 0
     initial_high_pos = start_pos