Skip to content

Commit

Permalink
Move prices events manager calls to symbol data
Browse files Browse the repository at this point in the history
  • Loading branch information
Herklos committed May 27, 2020
1 parent cd565cb commit 1ad0510
Show file tree
Hide file tree
Showing 9 changed files with 38 additions and 31 deletions.
2 changes: 0 additions & 2 deletions octobot_trading/data_manager/prices_manager.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,12 @@
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library.
from octobot_trading.data_manager.price_events_manager cimport PriceEventsManager
from octobot_trading.util.initializable cimport Initializable


cdef class PricesManager(Initializable):
cdef object logger
cdef object exchange_manager
cdef PriceEventsManager price_events_manager

cdef public object valid_price_received_event

Expand Down
4 changes: 1 addition & 3 deletions octobot_trading/data_manager/prices_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,12 @@
class PricesManager(Initializable):
MARK_PRICE_VALIDITY = 5 * MINUTE_TO_SECONDS

def __init__(self, exchange_manager, price_events_manager):
def __init__(self, exchange_manager):
super().__init__()
self.logger = get_logger(self.__class__.__name__)
self.mark_price = 0
self.mark_price_set_time = 0
self.exchange_manager = exchange_manager
self.price_events_manager = price_events_manager

# warning: should only be created in the async loop thread
self.valid_price_received_event = Event()
Expand All @@ -40,7 +39,6 @@ async def initialize_impl(self):
def set_mark_price(self, mark_price):
self.mark_price = mark_price
self.mark_price_set_time = self.exchange_manager.exchange.get_exchange_current_time()
self.price_events_manager.handle_price(self.mark_price, self.mark_price_set_time)
self.valid_price_received_event.set()

async def get_mark_price(self, timeout=MARK_PRICE_VALIDITY):
Expand Down
3 changes: 0 additions & 3 deletions octobot_trading/data_manager/recent_trades_manager.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,11 @@
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library.
from octobot_trading.data_manager.price_events_manager cimport PriceEventsManager
from octobot_trading.util.initializable cimport Initializable

cdef class RecentTradesManager(Initializable):
cdef object logger

cdef public PriceEventsManager price_events_manager

cdef public object recent_trades
cdef public object liquidations

Expand Down
6 changes: 1 addition & 5 deletions octobot_trading/data_manager/recent_trades_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,19 @@ class RecentTradesManager(Initializable):
MAX_RECENT_TRADES_COUNT = 100
MAX_LIQUIDATIONS_COUNT = 20

def __init__(self, price_events_manager):
def __init__(self):
super().__init__()
self.logger = get_logger(self.__class__.__name__)
self.price_events_manager = price_events_manager
self.recent_trades = deque(maxlen=self.MAX_RECENT_TRADES_COUNT)
self.liquidations = deque(maxlen=self.MAX_LIQUIDATIONS_COUNT)
self._reset_recent_trades()

async def initialize_impl(self):
self.price_events_manager.reset()
self._reset_recent_trades()

def set_all_recent_trades(self, recent_trades):
if recent_trades:
self.recent_trades = recent_trades
self.price_events_manager.handle_recent_trades(self.recent_trades)
return self.recent_trades

def add_new_trades(self, recent_trades):
Expand All @@ -49,7 +46,6 @@ def add_new_trades(self, recent_trades):
for trade in recent_trades
if trade not in self.recent_trades]
self.recent_trades.extend(new_recent_trades)
self.price_events_manager.handle_recent_trades(new_recent_trades)
return new_recent_trades

def add_new_liquidations(self, liquidations):
Expand Down
12 changes: 8 additions & 4 deletions octobot_trading/exchanges/data/exchange_symbol_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ def __init__(self, exchange_manager, symbol):

self.price_events_manager = PriceEventsManager()
self.order_book_manager = OrderBookManager()
self.prices_manager = PricesManager(self.exchange_manager, self.price_events_manager)
self.recent_trades_manager = RecentTradesManager(self.price_events_manager)
self.prices_manager = PricesManager(self.exchange_manager)
self.recent_trades_manager = RecentTradesManager()
self.ticker_manager = TickerManager()
self.funding_manager = FundingManager() if self.exchange_manager.is_margin else None

Expand Down Expand Up @@ -69,14 +69,18 @@ async def handle_candles_update(self, time_frame, new_symbol_candles_data, repla

def handle_recent_trade_update(self, recent_trades, replace_all=False):
if replace_all:
return self.recent_trades_manager.set_all_recent_trades(recent_trades)
return self.recent_trades_manager.add_new_trades(recent_trades)
recent_trades_added = self.recent_trades_manager.set_all_recent_trades(recent_trades)
else:
recent_trades_added = self.recent_trades_manager.add_new_trades(recent_trades)
self.price_events_manager.handle_recent_trades(recent_trades_added)
return recent_trades_added

def handle_liquidations(self, liquidations):
self.recent_trades_manager.add_new_liquidations(liquidations)

def handle_mark_price_update(self, mark_price):
self.prices_manager.set_mark_price(mark_price)
self.price_events_manager.handle_price(mark_price, self.exchange_manager.exchange.get_exchange_current_time())

def handle_order_book_update(self, asks, bids):
self.order_book_manager.handle_new_books(asks, bids)
Expand Down
8 changes: 4 additions & 4 deletions tests/data_manager/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ def price_events_manager(event_loop):


@pytest.fixture()
def prices_manager(event_loop, backtesting_exchange_manager, price_events_manager):
return PricesManager(backtesting_exchange_manager, price_events_manager)
def prices_manager(event_loop, backtesting_exchange_manager):
return PricesManager(backtesting_exchange_manager)


@pytest.fixture()
def recent_trades_manager(event_loop, price_events_manager):
return RecentTradesManager(price_events_manager)
def recent_trades_manager(event_loop):
return RecentTradesManager()
28 changes: 22 additions & 6 deletions tests/data_manager/test_price_events_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,12 @@ async def test_handle_recent_trades(price_events_manager):
with pytest.raises(AssertionError):
price_event_1_set.assert_called_once()
price_events_manager.handle_recent_trades(
[random_recent_trade(price=random_price(max_value=random_price_1 - 1)),
random_recent_trade(price=random_price(max_value=random_price_1 - 1)),
random_recent_trade(price=random_price(max_value=random_price_1 - 1))])
[random_recent_trade(price=random_price(max_value=random_price_1 - 1),
timestamp=random_timestamp(max_value=random_timestamp_1 - 1)),
random_recent_trade(price=random_price(max_value=random_price_1 - 1),
timestamp=random_timestamp(max_value=random_timestamp_1 - 1)),
random_recent_trade(price=random_price(max_value=random_price_1 - 1),
timestamp=random_timestamp(max_value=random_timestamp_1 - 1))])
with pytest.raises(AssertionError):
price_event_1_set.assert_called_once()
price_events_manager.handle_recent_trades(
Expand All @@ -71,7 +74,7 @@ async def test_handle_recent_trades_multiple_events(price_events_manager):
random_price_1 = random_price()
random_price_2 = random_price(min_value=random_price_1)
random_timestamp_1 = random_timestamp(max_value=1000)
random_timestamp_2 = random_timestamp(min_value=random_timestamp_1, max_value=5000)
random_timestamp_2 = random_timestamp(min_value=random_timestamp_1 + 2, max_value=5000)
price_event_1 = price_events_manager.add_event(random_price_1, random_timestamp_1, True)
price_event_2 = price_events_manager.add_event(random_price_2, random_timestamp_2, True)
with patch.object(price_event_1, 'set', new=AsyncMock()) as price_event_1_set, \
Expand All @@ -87,8 +90,8 @@ async def test_handle_recent_trades_multiple_events(price_events_manager):
price_events_manager.handle_recent_trades(
[random_recent_trade(price=random_price(max_value=random_price_1 - 1),
timestamp=random_timestamp(max_value=random_timestamp_1 - 1)),
random_recent_trade(price=random_price_2,
timestamp=random_timestamp(max_value=random_timestamp_1 - 1))])
random_recent_trade(price=random_price_2 - 1,
timestamp=random_timestamp(max_value=random_timestamp_2))])
price_event_1_set.assert_called_once()
with pytest.raises(AssertionError):
price_event_2_set.assert_called_once()
Expand All @@ -110,6 +113,19 @@ async def test_handle_recent_trades_multiple_events(price_events_manager):
price_event_1_set.assert_called_once()
price_event_2_set.assert_called_once()

price_event_1 = price_events_manager.add_event(random_price_1, random_timestamp_1, True)
price_event_2 = price_events_manager.add_event(random_price_2, random_timestamp_2, True)
with patch.object(price_event_1, 'set', new=AsyncMock()) as price_event_1_set, \
patch.object(price_event_2, 'set', new=AsyncMock()) as price_event_2_set:
price_events_manager.handle_recent_trades(
[random_recent_trade(price=random_price(max_value=random_price_1 - 1),
timestamp=random_timestamp(max_value=random_timestamp_1 - 1)),
random_recent_trade(price=random_price_2,
timestamp=random_timestamp(max_value=random_timestamp_2 - 1))])
price_event_1_set.assert_called_once()
with pytest.raises(AssertionError):
price_event_2_set.assert_called_once()


async def test_handle_price(price_events_manager):
random_price_1 = random_price()
Expand Down
2 changes: 0 additions & 2 deletions tests/data_manager/test_recent_trades_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ async def test_initialize(recent_trades_manager):
recent_trades_manager.recent_trades[0]
with pytest.raises(IndexError):
recent_trades_manager.liquidations[0]
assert recent_trades_manager.price_events_manager


async def test_set_all_recent_trades(recent_trades_manager):
Expand Down Expand Up @@ -126,4 +125,3 @@ async def test_reset_recent_trades(recent_trades_manager):
recent_trades_manager.recent_trades[0]
with pytest.raises(IndexError):
recent_trades_manager.liquidations[0]
assert recent_trades_manager.price_events_manager
4 changes: 2 additions & 2 deletions tests/util/random_numbers.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ def random_kline() -> list:
def random_recent_trade(price=None, timestamp=None) -> dict:
return {
ECOC.PRICE.value: price if price is not None else random_price(),
ECOC.AMOUNT.value: timestamp if timestamp is not None else random_quantity(),
ECOC.AMOUNT.value: random_quantity(),
ECOC.COST.value: random_quantity(),
ECOC.TIMESTAMP.value: random_timestamp()
ECOC.TIMESTAMP.value: timestamp if timestamp is not None else random_quantity(),
}


Expand Down

0 comments on commit 1ad0510

Please sign in to comment.