feat: add trades helper functions
trades_get_available data and trades_data_min_max
This commit is contained in:
@@ -12,7 +12,7 @@ from datetime import datetime, timezone
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Optional, Tuple, Type
|
from typing import List, Optional, Tuple, Type
|
||||||
|
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame, to_datetime
|
||||||
|
|
||||||
from freqtrade import misc
|
from freqtrade import misc
|
||||||
from freqtrade.configuration import TimeRange
|
from freqtrade.configuration import TimeRange
|
||||||
@@ -32,6 +32,7 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class IDataHandler(ABC):
|
class IDataHandler(ABC):
|
||||||
_OHLCV_REGEX = r"^([a-zA-Z_\d-]+)\-(\d+[a-zA-Z]{1,2})\-?([a-zA-Z_]*)?(?=\.)"
|
_OHLCV_REGEX = r"^([a-zA-Z_\d-]+)\-(\d+[a-zA-Z]{1,2})\-?([a-zA-Z_]*)?(?=\.)"
|
||||||
|
_TRADES_REGEX = r"^([a-zA-Z_\d-]+)\-(trades)?(?=\.)"
|
||||||
|
|
||||||
def __init__(self, datadir: Path) -> None:
|
def __init__(self, datadir: Path) -> None:
|
||||||
self._datadir = datadir
|
self._datadir = datadir
|
||||||
@@ -166,6 +167,50 @@ class IDataHandler(ABC):
|
|||||||
:param candle_type: Any of the enum CandleType (must match trading mode!)
|
:param candle_type: Any of the enum CandleType (must match trading mode!)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def trades_get_available_data(cls, datadir: Path, trading_mode: TradingMode) -> List[str]:
|
||||||
|
"""
|
||||||
|
Returns a list of all pairs with ohlcv data available in this datadir
|
||||||
|
:param datadir: Directory to search for ohlcv files
|
||||||
|
:param trading_mode: trading-mode to be used
|
||||||
|
:return: List of Tuples of (pair, timeframe, CandleType)
|
||||||
|
"""
|
||||||
|
if trading_mode == TradingMode.FUTURES:
|
||||||
|
datadir = datadir.joinpath("futures")
|
||||||
|
_tmp = [
|
||||||
|
re.search(cls._TRADES_REGEX, p.name)
|
||||||
|
for p in datadir.glob(f"*.{cls._get_file_extension()}")
|
||||||
|
]
|
||||||
|
return [
|
||||||
|
cls.rebuild_pair_from_filename(match[1])
|
||||||
|
for match in _tmp
|
||||||
|
if match and len(match.groups()) > 1
|
||||||
|
]
|
||||||
|
|
||||||
|
def trades_data_min_max(
|
||||||
|
self,
|
||||||
|
pair: str,
|
||||||
|
trading_mode: TradingMode,
|
||||||
|
) -> Tuple[datetime, datetime, int]:
|
||||||
|
"""
|
||||||
|
Returns the min and max timestamp for the given pair's trades data.
|
||||||
|
:param pair: Pair to get min/max for
|
||||||
|
:param trading_mode: Trading mode to use (used to determine the filename)
|
||||||
|
:return: (min, max, len)
|
||||||
|
"""
|
||||||
|
df = self._trades_load(pair, trading_mode)
|
||||||
|
if df.empty:
|
||||||
|
return (
|
||||||
|
datetime.fromtimestamp(0, tz=timezone.utc),
|
||||||
|
datetime.fromtimestamp(0, tz=timezone.utc),
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
to_datetime(df.iloc[0]["timestamp"], unit="ms", utc=True).to_pydatetime(),
|
||||||
|
to_datetime(df.iloc[-1]["timestamp"], unit="ms", utc=True).to_pydatetime(),
|
||||||
|
len(df),
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def trades_get_pairs(cls, datadir: Path) -> List[str]:
|
def trades_get_pairs(cls, datadir: Path) -> List[str]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user