|
11 | 11 | from pandas import DataFrame |
12 | 12 | from pydantic import ValidationError |
13 | 13 |
|
| 14 | +from freqtrade.configuration import TimeRange |
14 | 15 | from freqtrade.constants import CUSTOM_TAG_MAX_LENGTH, Config, IntOrInf, ListPairsWithTimeframes |
15 | 16 | from freqtrade.data.converter import populate_dataframe_with_trades |
16 | 17 | from freqtrade.data.converter.converter import reduce_dataframe_footprint |
@@ -1767,9 +1768,31 @@ def _if_enabled_populate_trades(self, dataframe: DataFrame, metadata: dict) -> D |
1767 | 1768 | use_public_trades = self.config.get("exchange", {}).get("use_public_trades", False) |
1768 | 1769 | if use_public_trades: |
1769 | 1770 | 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) |
1771 | 1795 |
|
1772 | | - # TODO: slice trades to size of dataframe for faster backtesting |
1773 | 1796 | cached_grouped_trades: DataFrame | None = self._cached_grouped_trades_per_pair.get(pair) |
1774 | 1797 | dataframe, cached_grouped_trades = populate_dataframe_with_trades( |
1775 | 1798 | cached_grouped_trades, self.config, dataframe, trades |
|
0 commit comments