]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): use max_open_trades tunable to size opened positions
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 27 Feb 2025 08:36:11 +0000 (09:36 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 27 Feb 2025 08:36:11 +0000 (09:36 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/freqaimodels/LightGBMRegressorQuickAdapterV35.py
quickadapter/user_data/freqaimodels/XGBoostRegressorQuickAdapterV35.py
quickadapter/user_data/strategies/QuickAdapterV3.py

index 91015a464fa1227ac6e9d01d5c602a196a8e166d..bac2115c93c01dddba5c757505d46d98f0b2f62b 100644 (file)
@@ -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,
index 5e798fdeb55af004f3c0a0fad7a1f15d7a1d6c45..e85e333a1a5e46890a11e223536d15f22d15e16c 100644 (file)
@@ -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,
index c0a92538e12e4613287ba47e16274afa1dd02bfe..0e1b903520bc30c425c453f538bbb77d9572175b 100644 (file)
@@ -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:
     """