From: Jérôme Benoit Date: Tue, 18 Mar 2025 22:43:58 +0000 (+0100) Subject: perf(qav3): compute trade natr only if needed X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=411fa6541e5b26f19fe71000372d78147c4a3c52;p=freqai-strategies.git perf(qav3): compute trade natr only if needed Signed-off-by: Jérôme Benoit --- diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index aad6f40..3cde9c3 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -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 )