From: Jérôme Benoit Date: Thu, 27 Feb 2025 08:36:11 +0000 (+0100) Subject: fix(qav3): use max_open_trades tunable to size opened positions X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=3d4a977ac8432142fd5bd5de8736d39ab0d8ecbf;p=freqai-strategies.git fix(qav3): use max_open_trades tunable to size opened positions Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py index 91015a4..bac2115 100644 --- a/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py @@ -601,8 +601,8 @@ def period_objective( ) y_pred = model.predict(X_test) - min_label_period_candles = int(fit_live_predictions_candles / 20) - max_label_period_candles = int(fit_live_predictions_candles / 4) + min_label_period_candles: int = fit_live_predictions_candles // 20 + max_label_period_candles: int = fit_live_predictions_candles // 4 label_period_candles = trial.suggest_int( "label_period_candles", min_label_period_candles, diff --git a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py index 5e798fd..e85e333 100644 --- a/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py +++ b/quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py @@ -605,8 +605,8 @@ def period_objective( ) y_pred = model.predict(X_test) - min_label_period_candles = int(fit_live_predictions_candles / 20) - max_label_period_candles = int(fit_live_predictions_candles / 4) + min_label_period_candles: int = fit_live_predictions_candles // 20 + max_label_period_candles: int = fit_live_predictions_candles // 4 label_period_candles = trial.suggest_int( "label_period_candles", min_label_period_candles, diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index c0a9253..0e1b903 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -363,24 +363,22 @@ class QuickAdapterV3(IStrategy): side: str, **kwargs, ) -> bool: - open_trades = Trade.get_trades(trade_filter=Trade.is_open.is_(True)) - - max_per_side_open_trades = self.freqai_info.get("max_per_side_open_trades", 5) - num_shorts, num_longs = 0, 0 - for trade in open_trades: - if "short" in trade.enter_tag: - num_shorts += 1 - elif "long" in trade.enter_tag: - num_longs += 1 - - if (side == "long" and num_longs >= max_per_side_open_trades) or ( - side == "short" and num_shorts >= max_per_side_open_trades - ): - return False + max_open_trades_per_side = self.max_open_trades_per_side() + if max_open_trades_per_side >= 0: + open_trades = Trade.get_trades(trade_filter=Trade.is_open.is_(True)) + num_shorts, num_longs = 0, 0 + for trade in open_trades: + if "short" in trade.enter_tag: + num_shorts += 1 + elif "long" in trade.enter_tag: + num_longs += 1 + if (side == "long" and num_longs >= max_open_trades_per_side) or ( + side == "short" and num_shorts >= max_open_trades_per_side + ): + return False df, _ = self.dp.get_analyzed_dataframe(pair, self.timeframe) last_candle = df.iloc[-1].squeeze() - if (side == "long" and rate > last_candle["close"] * (1 + 0.0025)) or ( side == "short" and rate < last_candle["close"] * (1 - 0.0025) ): @@ -388,6 +386,18 @@ class QuickAdapterV3(IStrategy): return True + def max_open_trades_per_side(self) -> int: + max_open_trades = self.config.get("max_open_trades") + if max_open_trades < 0: + return -1 + elif max_open_trades == 0 or max_open_trades == 1: + return max_open_trades + elif max_open_trades >= 2: + if self.can_short: + return max_open_trades // 2 + else: + return max_open_trades + def top_percent_change(dataframe: DataFrame, length: int) -> float: """