Skip to content

Commit 82903cc

Browse files
committed
feat: Filter trades based on timerange
1 parent 0233c38 commit 82903cc

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

freqtrade/strategy/interface.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from pandas import DataFrame
1212
from pydantic import ValidationError
1313

14+
from freqtrade.configuration import TimeRange
1415
from freqtrade.constants import CUSTOM_TAG_MAX_LENGTH, Config, IntOrInf, ListPairsWithTimeframes
1516
from freqtrade.data.converter import populate_dataframe_with_trades
1617
from freqtrade.data.converter.converter import reduce_dataframe_footprint
@@ -1767,9 +1768,31 @@ def _if_enabled_populate_trades(self, dataframe: DataFrame, metadata: dict) -> D
17671768
use_public_trades = self.config.get("exchange", {}).get("use_public_trades", False)
17681769
if use_public_trades:
17691770
pair = metadata["pair"]
1770-
trades = self.dp.trades(pair=pair, copy=False)
1771+
# Build timerange from dataframe date column
1772+
if not dataframe.empty:
1773+
start_ts = int(dataframe["date"].iloc[0].timestamp() * 1000)
1774+
end_ts = int(dataframe["date"].iloc[-1].timestamp() * 1000)
1775+
timerange = TimeRange("date", "date", startts=start_ts, stopts=end_ts)
1776+
else:
1777+
timerange = None
1778+
1779+
trades = self.dp.trades(pair=pair, copy=False, timerange=timerange)
1780+
1781+
# Apply additional filtering with buffer for faster backtesting
1782+
if not trades.empty and not dataframe.empty and "timestamp" in trades.columns:
1783+
# Add timeframe buffer to ensure complete candle coverage
1784+
timeframe_buffer = timeframe_to_seconds(self.config["timeframe"]) * 1000
1785+
1786+
# Create time bounds with buffer
1787+
time_start = start_ts - timeframe_buffer
1788+
time_end = end_ts + timeframe_buffer
1789+
1790+
# Filter trades within buffered timerange
1791+
trades_mask = (trades["timestamp"] >= time_start) & (
1792+
trades["timestamp"] <= time_end
1793+
)
1794+
trades = trades.loc[trades_mask].reset_index(drop=True)
17711795

1772-
# TODO: slice trades to size of dataframe for faster backtesting
17731796
cached_grouped_trades: DataFrame | None = self._cached_grouped_trades_per_pair.get(pair)
17741797
dataframe, cached_grouped_trades = populate_dataframe_with_trades(
17751798
cached_grouped_trades, self.config, dataframe, trades

0 commit comments

Comments
 (0)