/test/integration/test_binance_order_book_tracker.py

https://github.com/CoinAlpha/hummingbot · Python · 119 lines · 96 code · 14 blank · 9 comment · 9 complexity · 172b2227a81b7a12ffb5497245ac3485 MD5 · raw file

  1. #!/usr/bin/env python
  2. import math
  3. from os.path import join, realpath
  4. import sys; sys.path.insert(0, realpath(join(__file__, "../../../")))
  5. from hummingbot.core.event.event_logger import EventLogger
  6. from hummingbot.core.event.events import OrderBookEvent, OrderBookTradeEvent, TradeType
  7. from hummingbot.connector.exchange.binance.binance_order_book_tracker import BinanceOrderBookTracker
  8. from hummingbot.connector.exchange.binance.binance_api_order_book_data_source import BinanceAPIOrderBookDataSource
  9. import asyncio
  10. import logging
  11. from typing import (
  12. Dict,
  13. Optional,
  14. List,
  15. )
  16. import unittest
  17. from hummingbot.core.data_type.order_book import OrderBook
  18. from hummingbot.core.utils.async_utils import (
  19. safe_ensure_future,
  20. safe_gather,
  21. )
  22. class BinanceOrderBookTrackerUnitTest(unittest.TestCase):
  23. order_book_tracker: Optional[BinanceOrderBookTracker] = None
  24. events: List[OrderBookEvent] = [
  25. OrderBookEvent.TradeEvent
  26. ]
  27. trading_pairs: List[str] = [
  28. "BTCUSDT",
  29. "XRPUSDT"
  30. ]
  31. @classmethod
  32. def setUpClass(cls):
  33. cls.ev_loop: asyncio.BaseEventLoop = asyncio.get_event_loop()
  34. cls.order_book_tracker: BinanceOrderBookTracker = BinanceOrderBookTracker(
  35. trading_pairs=cls.trading_pairs)
  36. cls.order_book_tracker_task: asyncio.Task = safe_ensure_future(cls.order_book_tracker.start())
  37. cls.ev_loop.run_until_complete(cls.wait_til_tracker_ready())
  38. @classmethod
  39. async def wait_til_tracker_ready(cls):
  40. while True:
  41. if len(cls.order_book_tracker.order_books) > 0:
  42. print("Initialized real-time order books.")
  43. return
  44. await asyncio.sleep(1)
  45. async def run_parallel_async(self, *tasks):
  46. future: asyncio.Future = safe_ensure_future(safe_gather(*tasks))
  47. while not future.done():
  48. await asyncio.sleep(1.0)
  49. return future.result()
  50. def run_parallel(self, *tasks):
  51. return self.ev_loop.run_until_complete(self.run_parallel_async(*tasks))
  52. def setUp(self):
  53. self.event_logger = EventLogger()
  54. for event_tag in self.events:
  55. for trading_pair, order_book in self.order_book_tracker.order_books.items():
  56. order_book.add_listener(event_tag, self.event_logger)
  57. def test_order_book_trade_event_emission(self):
  58. """
  59. Test if order book tracker is able to retrieve order book trade message from exchange and
  60. emit order book trade events after correctly parsing the trade messages
  61. """
  62. self.run_parallel(self.event_logger.wait_for(OrderBookTradeEvent))
  63. for ob_trade_event in self.event_logger.event_log:
  64. print(f"ob_trade_event: {ob_trade_event}")
  65. self.assertTrue(type(ob_trade_event) == OrderBookTradeEvent)
  66. self.assertTrue(ob_trade_event.trading_pair in self.trading_pairs)
  67. self.assertTrue(type(ob_trade_event.timestamp) == float)
  68. self.assertTrue(type(ob_trade_event.amount) == float)
  69. self.assertTrue(type(ob_trade_event.price) == float)
  70. self.assertTrue(type(ob_trade_event.type) == TradeType)
  71. self.assertTrue(math.ceil(math.log10(ob_trade_event.timestamp)) == 10)
  72. self.assertTrue(ob_trade_event.amount > 0)
  73. self.assertTrue(ob_trade_event.price > 0)
  74. def test_tracker_integrity(self):
  75. # Wait 5 seconds to process some diffs.
  76. self.ev_loop.run_until_complete(asyncio.sleep(10.0))
  77. order_books: Dict[str, OrderBook] = self.order_book_tracker.order_books
  78. btcusdt_book: OrderBook = order_books["BTCUSDT"]
  79. xrpusdt_book: OrderBook = order_books["XRPUSDT"]
  80. # print(btcusdt_book.snapshot)
  81. # print("xrpusdt")
  82. # print(xrpusdt_book.snapshot)
  83. self.assertGreaterEqual(btcusdt_book.get_price_for_volume(True, 10).result_price,
  84. btcusdt_book.get_price(True))
  85. self.assertLessEqual(btcusdt_book.get_price_for_volume(False, 10).result_price,
  86. btcusdt_book.get_price(False))
  87. self.assertGreaterEqual(xrpusdt_book.get_price_for_volume(True, 10000).result_price,
  88. xrpusdt_book.get_price(True))
  89. self.assertLessEqual(xrpusdt_book.get_price_for_volume(False, 10000).result_price,
  90. xrpusdt_book.get_price(False))
  91. for order_book in self.order_book_tracker.order_books.values():
  92. print(order_book.last_trade_price)
  93. self.assertFalse(math.isnan(order_book.last_trade_price))
  94. def test_api_get_last_traded_prices(self):
  95. prices = self.ev_loop.run_until_complete(
  96. BinanceAPIOrderBookDataSource.get_last_traded_prices(["BTCUSDT", "LTCBTC"]))
  97. for key, value in prices.items():
  98. print(f"{key} last_trade_price: {value}")
  99. self.assertGreater(prices["BTCUSDT"], 1000)
  100. self.assertLess(prices["LTCBTC"], 1)
  101. def main():
  102. logging.basicConfig(level=logging.INFO)
  103. unittest.main()
  104. if __name__ == "__main__":
  105. main()