Skip to content

Commit 0233c38

Browse files
committed
feat: Only load trades needed for specified timerange
1 parent 87b0a6d commit 0233c38

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

freqtrade/data/dataprovider.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,12 @@ def ohlcv(
498498
return DataFrame()
499499

500500
def trades(
501-
self, pair: str, timeframe: str | None = None, copy: bool = True, candle_type: str = ""
501+
self,
502+
pair: str,
503+
timeframe: str | None = None,
504+
copy: bool = True,
505+
candle_type: str = "",
506+
timerange: TimeRange | None = None,
502507
) -> DataFrame:
503508
"""
504509
Get candle (TRADES) data for the given pair as DataFrame
@@ -526,7 +531,7 @@ def trades(
526531
self._config["datadir"], data_format=self._config["dataformat_trades"]
527532
)
528533
trades_df = data_handler.trades_load(
529-
pair, self._config.get("trading_mode", TradingMode.SPOT)
534+
pair, self._config.get("trading_mode", TradingMode.SPOT), timerange=timerange
530535
)
531536
return trades_df
532537

freqtrade/data/history/datahandlers/featherdatahandler.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22

33
from pandas import DataFrame, read_feather, to_datetime
4+
from pyarrow import dataset
45

56
from freqtrade.configuration import TimeRange
67
from freqtrade.constants import DEFAULT_DATAFRAME_COLUMNS, DEFAULT_TRADES_COLUMNS
@@ -116,17 +117,34 @@ def _trades_load(
116117
) -> DataFrame:
117118
"""
118119
Load a pair from file, either .json.gz or .json
119-
# TODO: respect timerange ...
120120
:param pair: Load trades for this pair
121121
:param trading_mode: Trading mode to use (used to determine the filename)
122-
:param timerange: Timerange to load trades for - currently not implemented
122+
:param timerange: Timerange to load trades for - filters data to this range if provided
123123
:return: Dataframe containing trades
124124
"""
125125
filename = self._pair_trades_filename(self._datadir, pair, trading_mode)
126126
if not filename.exists():
127127
return DataFrame(columns=DEFAULT_TRADES_COLUMNS)
128128

129-
tradesdata = read_feather(filename)
129+
# Load trades data with optional timerange filtering
130+
if timerange is None:
131+
# No timerange filter - load entire file
132+
logger.debug(f"Loading entire trades file for {pair}")
133+
tradesdata = read_feather(filename)
134+
else:
135+
# Use Arrow dataset with predicate pushdown for efficient filtering
136+
try:
137+
dataset_reader = dataset.dataset(filename, format="feather")
138+
time_filter = (dataset.field("timestamp") >= timerange.startts) & (
139+
dataset.field("timestamp") <= timerange.stopts
140+
)
141+
tradesdata = dataset_reader.to_table(filter=time_filter).to_pandas()
142+
logger.debug(f"Loaded {len(tradesdata)} trades for {pair}")
143+
144+
except (ImportError, AttributeError, ValueError) as e:
145+
# Fallback: load entire file
146+
logger.debug(f"Unable to use Arrow filtering, loading entire trades file: {e}")
147+
tradesdata = read_feather(filename)
130148

131149
return tradesdata
132150

0 commit comments

Comments
 (0)