55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
"""
|
|
BaseFetcher — abstract interface for data source adapters.
|
|
|
|
Every fetcher (MT5, DXFeed, futures bridge, CSV import) implements this.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
import pandas as pd
|
|
|
|
|
|
class BaseFetcher(ABC):
|
|
"""
|
|
Abstract data fetcher interface.
|
|
|
|
Implementations must return DataFrames with:
|
|
- DatetimeIndex named 'time' (UTC)
|
|
- Lowercase column names: open, high, low, close, tick_volume, spread, real_volume
|
|
"""
|
|
|
|
name: str = "base" # Override in subclass
|
|
|
|
@abstractmethod
|
|
def fetch_bars(
|
|
self,
|
|
symbol: str,
|
|
timeframe: str,
|
|
date_from: datetime,
|
|
date_to: datetime,
|
|
) -> Optional[pd.DataFrame]:
|
|
"""
|
|
Fetch OHLCV bars for the given symbol/timeframe/date range.
|
|
Returns None on failure.
|
|
"""
|
|
...
|
|
|
|
@abstractmethod
|
|
def fetch_bars_n(
|
|
self,
|
|
symbol: str,
|
|
timeframe: str,
|
|
n_bars: int,
|
|
) -> Optional[pd.DataFrame]:
|
|
"""
|
|
Fetch the most recent N bars.
|
|
Returns None on failure.
|
|
"""
|
|
...
|
|
|
|
@abstractmethod
|
|
def is_available(self) -> bool:
|
|
"""Check if this data source is currently reachable."""
|
|
...
|