From: Jérôme Benoit Date: Fri, 26 Dec 2025 16:05:32 +0000 (+0100) Subject: refactor(quickadapter): add price target tunables constant. X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=90cddb0115d8df42af5e61897bed85cbfc43ff59;p=freqai-strategies.git refactor(quickadapter): add price target tunables constant. Signed-off-by: Jérôme Benoit --- diff --git a/README.md b/README.md index 765926d..ae3662d 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ docker compose up -d --build | _Leverage_ | | | | | leverage | `proposed_leverage` | float [1.0, max_leverage] | Leverage. Fallback to `proposed_leverage` for the pair. | | _Exit pricing_ | | | | -| exit_pricing.trade_price_target | `moving_average` | enum {`moving_average`,`interpolation`,`weighted_interpolation`} | Trade NATR computation method. | +| exit_pricing.trade_price_target | `moving_average` | enum {`moving_average`,`quantile_interpolation`,`weighted_average`} | Trade NATR computation method. | | exit_pricing.thresholds_calibration.decline_quantile | 0.75 | float (0,1) | PnL decline quantile threshold. | | _Reversal confirmation_ | | | | | reversal_confirmation.lookback_period | 0 | int >= 0 | Prior confirming candles; 0 = none. | diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 376ae51..b086144 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -40,6 +40,7 @@ from Utils import ( SMOOTHING_METHODS, SMOOTHING_MODES, STANDARDIZATION_TYPES, + TRADE_PRICE_TARGETS, WEIGHT_STRATEGIES, alligator, bottom_change_percent, @@ -1278,7 +1279,7 @@ class QuickAdapterV3(IStrategy): isna(trade_duration) or trade_duration <= 0 ) - def get_trade_weighted_interpolation_natr( + def get_trade_weighted_average_natr( self, df: DataFrame, trade: Trade ) -> Optional[float]: label_natr = df.get("natr_label_period_candles") @@ -1333,7 +1334,7 @@ class QuickAdapterV3(IStrategy): weights=np.array([entry_weight, current_weight, median_weight]), ) - def get_trade_interpolation_natr( + def get_trade_quantile_interpolation_natr( self, df: DataFrame, trade: Trade ) -> Optional[float]: label_natr = df.get("natr_label_period_candles") @@ -1395,21 +1396,27 @@ class QuickAdapterV3(IStrategy): self, df: DataFrame, trade: Trade, trade_duration_candles: int ) -> Optional[float]: trade_price_target = self.config.get("exit_pricing", {}).get( - "trade_price_target", "moving_average" + "trade_price_target", + TRADE_PRICE_TARGETS[0], # "moving_average" ) trade_price_target_methods: dict[str, Callable[[], Optional[float]]] = { - "moving_average": lambda: self.get_trade_moving_average_natr( + # 0 - "moving_average" + TRADE_PRICE_TARGETS[0]: lambda: self.get_trade_moving_average_natr( df, trade.pair, trade_duration_candles ), - "interpolation": lambda: self.get_trade_interpolation_natr(df, trade), - "weighted_interpolation": lambda: self.get_trade_weighted_interpolation_natr( + # 1 - "quantile_interpolation" + TRADE_PRICE_TARGETS[1]: lambda: self.get_trade_quantile_interpolation_natr( + df, trade + ), + # 2 - "weighted_average" + TRADE_PRICE_TARGETS[2]: lambda: self.get_trade_weighted_average_natr( df, trade ), } trade_price_target_fn = trade_price_target_methods.get(trade_price_target) if trade_price_target_fn is None: raise ValueError( - f"Invalid trade_price_target: {trade_price_target}. Available: {', '.join(sorted(trade_price_target_methods.keys()))}" + f"Invalid trade_price_target: {trade_price_target}. Available: {', '.join(sorted(TRADE_PRICE_TARGETS))}" ) return trade_price_target_fn() @@ -1463,6 +1470,10 @@ class QuickAdapterV3(IStrategy): def get_take_profit_distance( self, df: DataFrame, trade: Trade, natr_ratio_percent: float ) -> Optional[float]: + if not (0.0 <= natr_ratio_percent <= 1.0): + raise ValueError( + f"natr_ratio_percent must be in [0, 1], got {natr_ratio_percent}" + ) trade_duration_candles = self.get_trade_duration_candles(df, trade) if not QuickAdapterV3.is_trade_duration_valid(trade_duration_candles): return None diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 5b9e8b5..8e194f9 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -119,6 +119,15 @@ SMOOTHING_MODES: Final[tuple[SmoothingMode, ...]] = ( "interp", ) +TradePriceTarget = Literal[ + "moving_average", "quantile_interpolation", "weighted_average" +] +TRADE_PRICE_TARGETS: Final[tuple[TradePriceTarget, ...]] = ( + "moving_average", + "quantile_interpolation", + "weighted_average", +) + DEFAULTS_EXTREMA_SMOOTHING: Final[dict[str, Any]] = { "method": SMOOTHING_METHODS[0], # "gaussian"