]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
perf(qav3): compute trade natr only if needed
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 18 Mar 2025 22:43:58 +0000 (23:43 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Tue, 18 Mar 2025 22:43:58 +0000 (23:43 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
quickadapter/user_data/strategies/QuickAdapterV3.py

index aad6f40921e1f808271969b6614fb4f43a7adfd8..3cde9c3d432a58195ba51f8685c1421514bb15a0 100644 (file)
@@ -384,25 +384,25 @@ class QuickAdapterV3(IStrategy):
     def populate_exit_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
         return df
 
-    def build_trade_entries(
+    def get_trade_entry_natr(
         self, df: DataFrame, trade: Trade
     ) -> datetime.datetime | bool:
-        entry_date = timeframe_to_prev_date(self.timeframe, trade.open_date_utc)
-
-        entry_candle = df.loc[(df["date"] == entry_date)]
-        if entry_candle.empty:
-            return False
-        entry_candle = entry_candle.squeeze()
-
         entry_natr = trade.get_custom_data(key="entry_natr")
         if not entry_natr:
+            entry_date = timeframe_to_prev_date(self.timeframe, trade.open_date_utc)
+            entry_candle = df.loc[(df["date"] == entry_date)]
+            if entry_candle.empty:
+                return False
+            entry_candle = entry_candle.squeeze()
             entry_natr = entry_candle["natr_ratio_labeling_window"]
             trade.set_custom_data(key="entry_natr", value=entry_natr)
 
-        return entry_date
+        return entry_natr
 
     def get_trade_stoploss_distance(self, df: DataFrame, trade: Trade) -> float:
-        entry_natr = trade.get_custom_data(key="entry_natr")
+        entry_natr = self.get_trade_entry_natr(df, trade)
+        if not entry_natr:
+            return 0.0
         last_natr = df["natr_ratio_labeling_window"].iloc[-1]
         return (
             trade.open_rate * fmean([entry_natr, last_natr]) * self.stoploss_natr_ratio
@@ -426,9 +426,7 @@ class QuickAdapterV3(IStrategy):
         if df.empty:
             return None
 
-        entry_date = self.build_trade_entries(df, trade)
-        if not entry_date:
-            return None
+        entry_date = timeframe_to_prev_date(self.timeframe, trade.open_date_utc)
         stoploss_distance = self.get_trade_stoploss_distance(df, trade)
         if trade.is_short:
             lowest_price = df["low"].loc[entry_date:].min()
@@ -476,8 +474,6 @@ class QuickAdapterV3(IStrategy):
         ):
             return "maxima_detected_long"
 
-        if not self.build_trade_entries(df, trade):
-            return None
         take_profit_distance = (
             self.get_trade_stoploss_distance(df, trade) * self.reward_risk_ratio
         )