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
4 changes: 2 additions & 2 deletions pytrade/broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

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


Expand Down Expand Up @@ -35,7 +35,7 @@ def process_orders(self):

def subscribe(
self,
instrument: Instrument,
instrument: FxInstrument,
granularity: Granularity,
callback: Callable[[Candlestick], None],
):
Expand Down
4 changes: 2 additions & 2 deletions pytrade/interfaces/broker.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import abc
from typing import Callable

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


Expand Down Expand Up @@ -38,7 +38,7 @@ def order(self, order: OrderRequest):
@abc.abstractmethod
def subscribe(
self,
instrument: Instrument,
instrument: FxInstrument,
granularity: Granularity,
callback: Callable[[Candlestick], None],
):
Expand Down
8 changes: 4 additions & 4 deletions pytrade/interfaces/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from multimethod import multimethod

from pytrade.models.instruments import Candlestick, Granularity, Instrument
from pytrade.models.instruments import Candlestick, FxInstrument, Granularity
from pytrade.models.order import MarketOrderRequest


Expand All @@ -29,20 +29,20 @@ def order(self, order: MarketOrderRequest):

@abc.abstractmethod
def get_candles(
self, instrument: Instrument, granularity: Granularity, count: int
self, instrument: FxInstrument, granularity: Granularity, count: int
) -> list[Candlestick]:
raise NotImplementedError()

@abc.abstractmethod
def get_candle(
self, instrument: Instrument, granularity: Granularity
self, instrument: FxInstrument, granularity: Granularity
) -> Candlestick:
raise NotImplementedError()

@abc.abstractmethod
def subscribe(
self,
instrument: Instrument,
instrument: FxInstrument,
granularity: Granularity,
callback: Callable[[Candlestick], None],
):
Expand Down
20 changes: 11 additions & 9 deletions pytrade/models/instruments.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Granularity(Enum):
M15 = "M15"
H1 = "H1"
H4 = "H4"
D1 = "D1"


MINUTES_MAP = {
Expand All @@ -24,10 +25,11 @@ class Granularity(Enum):
Granularity.M15: 15,
Granularity.H1: 60,
Granularity.H4: 240,
Granularity.D1: 1440,
}


class Instrument(Enum):
class FxInstrument(Enum):
AUDJPY = "AUD/JPY"
AUDNZD = "AUD/NZD"
AUDUSD = "AUD/USD"
Expand All @@ -50,12 +52,12 @@ class Instrument(Enum):
USDZAR = "USD/ZAR"


instrument_lookup = {m.value: m for m in Instrument}
instrument_lookup = {m.value: m for m in FxInstrument}


class CandleSubscription:

def __init__(self, instrument: Instrument, granularity: Granularity):
def __init__(self, instrument: FxInstrument, granularity: Granularity):
self._instrument = instrument
self._granularity = granularity

Expand All @@ -64,7 +66,7 @@ def granularity(self) -> Granularity:
return self._granularity

@property
def instrument(self) -> Instrument:
def instrument(self) -> FxInstrument:
return self._instrument

def __hash__(self):
Expand Down Expand Up @@ -96,7 +98,7 @@ class Candlestick:

def __init__(
self,
instrument: Instrument,
instrument: FxInstrument,
granularity: Granularity,
open: float,
high: float,
Expand Down Expand Up @@ -125,7 +127,7 @@ def to_dict(self):

class TickData:

instrument: Instrument
instrument: FxInstrument
timestamp: datetime
bid: float
ask: float
Expand Down Expand Up @@ -161,7 +163,7 @@ def __init__(
"Dataframe does not have a datetime index and does not have a 'Timestamp' column"
)
self._max_size: Optional[int] = max_size
self.__instrument: Optional[Instrument] = None
self.__instrument: Optional[FxInstrument] = None
self.__granularity: Optional[Granularity] = None
self.__update_event = Event()

Expand Down Expand Up @@ -216,7 +218,7 @@ def update(self, candlestick: Candlestick):
class CandleData:

def __init__(self, max_size=1000):
self._data: dict[tuple[Instrument, Granularity], InstrumentCandles] = {}
self._data: dict[tuple[FxInstrument, Granularity], InstrumentCandles] = {}
self._max_size = max_size

def __new__(cls, *args, **kwargs):
Expand All @@ -225,7 +227,7 @@ def __new__(cls, *args, **kwargs):
# Need to handle case where instantiatied and different max size is provided
return cls.instance

def get(self, instrument: Instrument, granularity: Granularity):
def get(self, instrument: FxInstrument, granularity: Granularity):
key = (instrument, granularity)
instrument_candles: InstrumentCandles = self._data.get(
(instrument, granularity), InstrumentCandles(max_size=self._max_size)
Expand Down
14 changes: 7 additions & 7 deletions pytrade/models/order.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from enum import Enum
from typing import Optional

from pytrade.models.instruments import Instrument
from pytrade.models.instruments import FxInstrument
from pytrade.models.trade import Trade


Expand Down Expand Up @@ -185,7 +185,7 @@ class OrderRequest(dict):

def __init__(
self,
instrument: Instrument,
instrument: FxInstrument,
units: int,
time_in_force: TimeInForce,
take_profit_on_fill: Optional[float] = None,
Expand All @@ -201,15 +201,15 @@ def __init__(
# stop_loss_on_fill=stop_loss_on_fill,
# trailing_stop_loss_on_fill=trailing_stop_loss_on_fill
# )
self._instrument: Instrument = instrument
self._instrument: FxInstrument = instrument
self._units: int = units
self._time_in_force: Optional[TimeInForce] = time_in_force
self._take_profit_on_fill: Optional[float] = take_profit_on_fill
self._stop_loss_on_fill: Optional[float] = stop_loss_on_fill
self._trailing_stop_loss_on_fill: Optional[float] = trailing_stop_loss_on_fill

@property
def instrument(self) -> Instrument:
def instrument(self) -> FxInstrument:
return self._instrument

@property
Expand Down Expand Up @@ -241,7 +241,7 @@ class MarketOrderRequest(OrderRequest):

def __init__(
self,
instrument: Instrument,
instrument: FxInstrument,
units: int,
time_in_force: TimeInForce = TimeInForce.FILL_OR_KILL,
take_profit_on_fill: Optional[float] = None,
Expand Down Expand Up @@ -272,7 +272,7 @@ class LimitOrderRequest(OrderRequest):

def __init__(
self,
instrument: Instrument,
instrument: FxInstrument,
units: int,
price: float,
time_in_force: TimeInForce,
Expand All @@ -295,7 +295,7 @@ class StopOrderRequest(OrderRequest):

def __init__(
self,
instrument: Instrument,
instrument: FxInstrument,
units: int,
price: float,
time_in_force: TimeInForce,
Expand Down
4 changes: 2 additions & 2 deletions pytrade/strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
CandleData,
Candlestick,
CandleSubscription,
FxInstrument,
Granularity,
Instrument,
InstrumentCandles,
)

Expand Down Expand Up @@ -74,7 +74,7 @@ async def next(self) -> None:
self._pending_updates = self._required_updates.copy()

def get_data(
self, instrument: Instrument, granularity: Granularity
self, instrument: FxInstrument, granularity: Granularity
) -> InstrumentCandles:
return self._data_context.get(instrument, granularity)

Expand Down
10 changes: 6 additions & 4 deletions tests/unit/test_broker.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from unittest.mock import Mock

from pytrade.broker import FxBroker
from pytrade.models.instruments import Instrument
from pytrade.models.instruments import FxInstrument
from pytrade.models.order import OrderRequest, TimeInForce


Expand All @@ -11,7 +11,7 @@ def test_buy_order():

assert len(broker._pending_orders) == 0

broker.order(OrderRequest(Instrument.GBPUSD, 10, TimeInForce.GOOD_TILL_CANCELLED))
broker.order(OrderRequest(FxInstrument.GBPUSD, 10, TimeInForce.GOOD_TILL_CANCELLED))

assert len(broker._pending_orders) == 1

Expand All @@ -22,7 +22,9 @@ def test_sell_order():

assert len(broker._pending_orders) == 0

broker.order(OrderRequest(Instrument.GBPUSD, -10, TimeInForce.GOOD_TILL_CANCELLED))
broker.order(
OrderRequest(FxInstrument.GBPUSD, -10, TimeInForce.GOOD_TILL_CANCELLED)
)

assert len(broker._pending_orders) == 1

Expand All @@ -31,7 +33,7 @@ def test_process_orders():
client = Mock()
broker = FxBroker(client)

broker.order(OrderRequest(Instrument.GBPUSD, 10, TimeInForce.GOOD_TILL_CANCELLED))
broker.order(OrderRequest(FxInstrument.GBPUSD, 10, TimeInForce.GOOD_TILL_CANCELLED))

assert len(broker._pending_orders) == 1

Expand Down
18 changes: 9 additions & 9 deletions tests/unit/test_indicator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
from pytrade.models.instruments import (
MINUTES_MAP,
Candlestick,
FxInstrument,
Granularity,
Instrument,
InstrumentCandles,
)


def get_candles(
count: int, instrument: Instrument, granularity: Granularity, end_time: datetime
count: int, instrument: FxInstrument, granularity: Granularity, end_time: datetime
) -> list[Candlestick]:
_delta = MINUTES_MAP[granularity]
return [
Expand Down Expand Up @@ -65,7 +65,7 @@ def test_update():
test_series = pd.Series([0, 1, 0, 0, 1])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = BoolIndicator(data)
for idx, candle in enumerate(candles):
Expand All @@ -82,7 +82,7 @@ def test_primitive_equality():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = SquareIndicator(data)
for idx, candle in enumerate(candles):
Expand All @@ -99,7 +99,7 @@ def test_primitive_greater():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = StaticIndicator(data)
for idx, candle in enumerate(candles):
Expand All @@ -116,7 +116,7 @@ def test_primitive_less():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = StaticIndicator(data)
for idx, candle in enumerate(candles):
Expand All @@ -133,7 +133,7 @@ def test_indicator_equality():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = StaticIndicator(data)
indicator2 = StaticIndicator(data)
Expand All @@ -153,7 +153,7 @@ def test_indicator_greater():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = StaticIndicator(data)
indicator2 = SubtractIndicator(data)
Expand All @@ -173,7 +173,7 @@ def test_indicator_less():
test_series = pd.Series([0, 1, 2, 3, 4])
data = InstrumentCandles()
candles = get_candles(
len(test_series), Instrument.EURUSD, Granularity.M1, datetime.now()
len(test_series), FxInstrument.EURUSD, Granularity.M1, datetime.now()
)
indicator = StaticIndicator(data)
indicator2 = AddIndicator(data)
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/test_instrument_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
INDEX,
MINUTES_MAP,
Candlestick,
FxInstrument,
Granularity,
Instrument,
InstrumentCandles,
)

Expand All @@ -21,7 +21,7 @@ def get_candles(count: int, granularity: Granularity):
_delta = MINUTES_MAP[granularity]
return [
Candlestick(
Instrument.EURUSD,
FxInstrument.EURUSD,
granularity,
random.uniform(0, 10),
random.uniform(0, 10),
Expand Down Expand Up @@ -121,7 +121,7 @@ def test_update_wrong_instrument():
history = InstrumentCandles(max_size=10)
first_candle = dummy_candles[0]
second_candle = dummy_candles[1]
second_candle.instrument = Instrument.GBPUSD
second_candle.instrument = FxInstrument.GBPUSD

assert first_candle.instrument != second_candle.instrument

Expand Down
Loading
Loading