From: Jérôme Benoit Date: Wed, 5 Mar 2025 17:32:01 +0000 (+0100) Subject: fix(qav3): ensure trade exit condition handle prediction outliers X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=31af3d2a02adfc2cbf5319c1f34c8dccdecaf2ba;p=freqai-strategies.git fix(qav3): ensure trade exit condition handle prediction outliers Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index c2727f7..3a81851 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -410,7 +410,7 @@ class LightGBMRegressorQuickAdapterV35(BaseRegressionModel): test_weights, self.data_split_parameters.get("test_size", TEST_SIZE), self.freqai_info.get("fit_live_predictions_candles", 100), - self.__optuna_config.get("candles_step", 100), + self.__optuna_config.get("candles_step", 10), model_training_parameters, ), n_trials=self.__optuna_config.get("n_trials", N_TRIALS), @@ -585,7 +585,7 @@ def period_objective( ) y_pred = model.predict(X_test) - min_label_period_candles: int = max(fit_live_predictions_candles // 200, 10) + min_label_period_candles: int = 10 max_label_period_candles: int = max( fit_live_predictions_candles // 6, min_label_period_candles ) diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index e70f0ca..9957a2c 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -411,7 +411,7 @@ class XGBoostRegressorQuickAdapterV35(BaseRegressionModel): test_weights, self.data_split_parameters.get("test_size", TEST_SIZE), self.freqai_info.get("fit_live_predictions_candles", 100), - self.__optuna_config.get("candles_step", 100), + self.__optuna_config.get("candles_step", 10), model_training_parameters, ), n_trials=self.__optuna_config.get("n_trials", N_TRIALS), @@ -589,7 +589,7 @@ def period_objective( ) y_pred = model.predict(X_test) - min_label_period_candles: int = max(fit_live_predictions_candles // 200, 10) + min_label_period_candles: int = 10 max_label_period_candles: int = max( fit_live_predictions_candles // 6, min_label_period_candles ) diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 17b0328..fcde1d0 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -1,14 +1,12 @@ import logging from functools import reduce import datetime -from datetime import timedelta import talib.abstract as ta from pandas import DataFrame, Series from technical import qtpylib from typing import Optional from freqtrade.strategy.interface import IStrategy from technical.pivots_points import pivots_points -from freqtrade.exchange import timeframe_to_prev_date from freqtrade.persistence import Trade from scipy.signal import argrelmin, argrelmax import numpy as np @@ -322,29 +320,21 @@ class QuickAdapterV3(IStrategy): ) last_candle = dataframe.iloc[-1].squeeze() - trade_date = timeframe_to_prev_date( - self.timeframe, - (trade.open_date_utc - timedelta(minutes=int(self.timeframe[:-1]))), - ) - trade_candle = dataframe.loc[(dataframe["date"] == trade_date)] - if trade_candle.empty: - return None - trade_candle = trade_candle.squeeze() - - entry_tag = trade.enter_tag - if last_candle["DI_catch"] == 0: return "outlier_detected" + enter_tag = trade.enter_tag if ( - last_candle[EXTREMA_COLUMN] < last_candle["minima_threshold"] - and entry_tag == "short" + enter_tag == "short" + and last_candle["do_predict"] == 1 + and last_candle[EXTREMA_COLUMN] < last_candle["minima_threshold"] ): return "minima_detected_short" if ( - last_candle[EXTREMA_COLUMN] > last_candle["maxima_threshold"] - and entry_tag == "long" + enter_tag == "long" + and last_candle["do_predict"] == 1 + and last_candle[EXTREMA_COLUMN] > last_candle["maxima_threshold"] ): return "maxima_detected_long"