/test/connector/exchange/crypto_com/test_crypto_com_order_book_tracker.py

https://github.com/CoinAlpha/hummingbot · Python · 107 lines · 86 code · 14 blank · 7 comment · 10 complexity · 4de920a05fff0c39d18d45827f992957 MD5 · raw file

  1. #!/usr/bin/env python
  2. from os.path import join, realpath
  3. import sys; sys.path.insert(0, realpath(join(__file__, "../../../../../")))
  4. import math
  5. import time
  6. import asyncio
  7. import logging
  8. import unittest
  9. from typing import Dict, Optional, List
  10. from hummingbot.core.event.event_logger import EventLogger
  11. from hummingbot.core.event.events import OrderBookEvent, OrderBookTradeEvent, TradeType
  12. from hummingbot.connector.exchange.crypto_com.crypto_com_order_book_tracker import CryptoComOrderBookTracker
  13. from hummingbot.connector.exchange.crypto_com.crypto_com_api_order_book_data_source import CryptoComAPIOrderBookDataSource
  14. from hummingbot.core.data_type.order_book import OrderBook
  15. class CryptoComOrderBookTrackerUnitTest(unittest.TestCase):
  16. order_book_tracker: Optional[CryptoComOrderBookTracker] = None
  17. events: List[OrderBookEvent] = [
  18. OrderBookEvent.TradeEvent
  19. ]
  20. trading_pairs: List[str] = [
  21. "BTC-USDT",
  22. "ETH-USDT",
  23. ]
  24. @classmethod
  25. def setUpClass(cls):
  26. cls.ev_loop: asyncio.BaseEventLoop = asyncio.get_event_loop()
  27. cls.order_book_tracker: CryptoComOrderBookTracker = CryptoComOrderBookTracker(cls.trading_pairs)
  28. cls.order_book_tracker.start()
  29. cls.ev_loop.run_until_complete(cls.wait_til_tracker_ready())
  30. @classmethod
  31. async def wait_til_tracker_ready(cls):
  32. while True:
  33. if len(cls.order_book_tracker.order_books) > 0:
  34. print("Initialized real-time order books.")
  35. return
  36. await asyncio.sleep(1)
  37. async def run_parallel_async(self, *tasks, timeout=None):
  38. future: asyncio.Future = asyncio.ensure_future(asyncio.gather(*tasks))
  39. timer = 0
  40. while not future.done():
  41. if timeout and timer > timeout:
  42. raise Exception("Timeout running parallel async tasks in tests")
  43. timer += 1
  44. now = time.time()
  45. _next_iteration = now // 1.0 + 1 # noqa: F841
  46. await asyncio.sleep(1.0)
  47. return future.result()
  48. def run_parallel(self, *tasks):
  49. return self.ev_loop.run_until_complete(self.run_parallel_async(*tasks))
  50. def setUp(self):
  51. self.event_logger = EventLogger()
  52. for event_tag in self.events:
  53. for trading_pair, order_book in self.order_book_tracker.order_books.items():
  54. order_book.add_listener(event_tag, self.event_logger)
  55. def test_order_book_trade_event_emission(self):
  56. """
  57. Tests if the order book tracker is able to retrieve order book trade message from exchange and emit order book
  58. trade events after correctly parsing the trade messages
  59. """
  60. self.run_parallel(self.event_logger.wait_for(OrderBookTradeEvent))
  61. for ob_trade_event in self.event_logger.event_log:
  62. self.assertTrue(type(ob_trade_event) == OrderBookTradeEvent)
  63. self.assertTrue(ob_trade_event.trading_pair in self.trading_pairs)
  64. self.assertTrue(type(ob_trade_event.timestamp) in [float, int])
  65. self.assertTrue(type(ob_trade_event.amount) == float)
  66. self.assertTrue(type(ob_trade_event.price) == float)
  67. self.assertTrue(type(ob_trade_event.type) == TradeType)
  68. # datetime is in seconds
  69. self.assertTrue(math.ceil(math.log10(ob_trade_event.timestamp)) == 10)
  70. self.assertTrue(ob_trade_event.amount > 0)
  71. self.assertTrue(ob_trade_event.price > 0)
  72. def test_tracker_integrity(self):
  73. # Wait 5 seconds to process some diffs.
  74. self.ev_loop.run_until_complete(asyncio.sleep(10.0))
  75. order_books: Dict[str, OrderBook] = self.order_book_tracker.order_books
  76. eth_usdt: OrderBook = order_books["ETH-USDT"]
  77. self.assertIsNot(eth_usdt.last_diff_uid, 0)
  78. self.assertGreaterEqual(eth_usdt.get_price_for_volume(True, 10).result_price,
  79. eth_usdt.get_price(True))
  80. self.assertLessEqual(eth_usdt.get_price_for_volume(False, 10).result_price,
  81. eth_usdt.get_price(False))
  82. def test_api_get_last_traded_prices(self):
  83. prices = self.ev_loop.run_until_complete(
  84. CryptoComAPIOrderBookDataSource.get_last_traded_prices(["BTC-USDT", "LTC-BTC"]))
  85. for key, value in prices.items():
  86. print(f"{key} last_trade_price: {value}")
  87. self.assertGreater(prices["BTC-USDT"], 1000)
  88. self.assertLess(prices["LTC-BTC"], 1)
  89. def main():
  90. logging.basicConfig(level=logging.INFO)
  91. unittest.main()
  92. if __name__ == "__main__":
  93. main()