Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"python.defaultInterpreterPath": "./.venv/bin/python",
"python.testing.pytestArgs": [
"--ignore=lib"
"tests"
],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
Expand Down
430 changes: 0 additions & 430 deletions clean

This file was deleted.

4 changes: 2 additions & 2 deletions pytradebacktest/broker.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Callable

from pytrade.interfaces.broker import IBroker
from pytrade.models.instruments import Candlestick, Granularity, Instrument
from pytrade.models.instruments import Candlestick, FxInstrument, Granularity
from pytrade.models.order import OrderRequest

from pytradebacktest.data import MarketData
Expand Down Expand Up @@ -29,7 +29,7 @@ def order(self, order: OrderRequest):

def subscribe(
self,
instrument: Instrument,
instrument: FxInstrument,
granularity: Granularity,
callback: Callable[[Candlestick], None],
):
Expand Down
26 changes: 17 additions & 9 deletions pytradebacktest/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from pandas import Timedelta, Timestamp
from pytrade.models.instruments import (
CandleData,
FxInstrument,
Granularity,
Instrument,
InstrumentCandles,
)

Expand All @@ -16,22 +16,24 @@

class DataSource:

def __init__(self, instrument: Instrument, granularity: Granularity):
def __init__(self, instrument: FxInstrument | str, granularity: Granularity):
self.instrument = instrument
self.granularity = granularity


class CsvDataSource(DataSource):

def __init__(self, path: str, instrument: Instrument, granularity: Granularity):
def __init__(
self, path: str, instrument: FxInstrument | str, granularity: Granularity
):
super().__init__(instrument, granularity)
self.path = path


class MarketDataLoader:

@abstractmethod
def load(self) -> dict[Tuple[Instrument, Granularity], pd.DataFrame]:
def load(self) -> dict[Tuple[FxInstrument | str, Granularity], pd.DataFrame]:
raise NotImplementedError


Expand All @@ -40,7 +42,7 @@ class CsvMarketDataLoader(MarketDataLoader):
def __init__(self, sources: list[CsvDataSource]):
self.sources = sources

def load(self) -> dict[Tuple[Instrument, Granularity], pd.DataFrame]:
def load(self) -> dict[Tuple[FxInstrument | str, Granularity], pd.DataFrame]:
_sources = dict()

for source in self.sources:
Expand All @@ -57,7 +59,6 @@ class MarketData:

def __init__(self, loader: MarketDataLoader):
self._sources = loader.load()
# self._candle_events: dict[Tuple[Instrument, Granularity], CandlestickEvent] = {}
self._init_timeframe()

@property
Expand All @@ -68,6 +69,10 @@ def universe(self):
def index(self):
return self._index

def __len__(self):
span = self._end_index - self._start_index
return int(span / self._granularity)

def _init_timeframe(self):
_start = None
_granularity = None
Expand Down Expand Up @@ -107,6 +112,7 @@ def _init_timeframe(self):
raise RuntimeError("Unable to determine end time for market data.")

self._index: Timestamp = _start - _granularity
self._start_index = _start
self._granularity: Timedelta = _granularity
self._end_index: Timestamp = _end

Expand All @@ -119,7 +125,7 @@ def next(self):
class BacktestInstrumentCandles(InstrumentCandles):

def __init__(
self, data: pd.DataFrame, instrument: Instrument, granularity: Granularity
self, data: pd.DataFrame, instrument: FxInstrument, granularity: Granularity
):
super().__init__(data, max_size=-1)
self._index = self._data.index[0]
Expand Down Expand Up @@ -148,7 +154,9 @@ class BacktestCandleData(CandleData):

def __init__(self):
self._max_size = -1
self._data: dict[tuple[Instrument, Granularity], BacktestInstrumentCandles] = {}
self._data: dict[
tuple[FxInstrument, Granularity], BacktestInstrumentCandles
] = {}
self._index = None

def __new__(cls, *args, **kwargs):
Expand All @@ -168,7 +176,7 @@ def index(self, value: pd.Timestamp):
candles.index = self._index

def populate(
self, df: pd.DataFrame, instrument: Instrument, granularity: Granularity
self, df: pd.DataFrame, instrument: FxInstrument, granularity: Granularity
):
key = (instrument, granularity)
instrument_candles: BacktestInstrumentCandles = self._data.get(
Expand Down
Loading
Loading