From 9a82df87350f7b18504ebfb82ed6f2f9e366f0f2 Mon Sep 17 00:00:00 2001 From: Morty Space Date: Wed, 29 Jan 2020 17:05:46 +0200 Subject: [PATCH] Added rate-limit inside api-provider --- src/cryptocom/exchange/api.py | 14 +++++++++----- tests/test_account.py | 26 ++++++++++++-------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/cryptocom/exchange/api.py b/src/cryptocom/exchange/api.py index 8eb92c7..d586fe6 100644 --- a/src/cryptocom/exchange/api.py +++ b/src/cryptocom/exchange/api.py @@ -30,6 +30,9 @@ class ApiProvider: self.timeout = timeout self.retries = retries + # NOTE: do not change this, due to crypto.com rate-limit 10-per second + self.semaphore = asyncio.Semaphore(8) + if not auth_required: return @@ -92,11 +95,12 @@ class ApiProvider: for count in range(self.retries + 1): try: async with aiohttp.ClientSession(timeout=timeout) as session: - resp = await session.request( - method, urljoin(self.root_url, path), - params=params, data=data - ) - resp = await resp.json() + async with self.semaphore: + resp = await session.request( + method, urljoin(self.root_url, path), + params=params, data=data + ) + resp = await resp.json() except asyncio.TimeoutError: if count == self.retries: raise ApiError(f"Timeout error, retries: {self.retries}") diff --git a/tests/test_account.py b/tests/test_account.py index 132b658..4a43928 100644 --- a/tests/test_account.py +++ b/tests/test_account.py @@ -84,27 +84,25 @@ async def test_account_sell_limit( assert all_orders[0]['id'] == order_ids[-1] -async def make_trades(account, order_ids, sem): - async with sem: - # buy volume for 0.0001 cro - order_id = await account.buy_market(cro.Symbol.CROUSDT, 0.0001) - order = await account.get_order(order_id, cro.Symbol.CROUSDT) - assert order['status'] == cro.OrderStatus.FILLED - order_ids['buy'].append(order_id) +async def make_trades(account, order_ids): + # buy volume for 0.0001 cro + order_id = await account.buy_market(cro.Symbol.CROUSDT, 0.0001) + order = await account.get_order(order_id, cro.Symbol.CROUSDT) + assert order['status'] == cro.OrderStatus.FILLED + order_ids['buy'].append(order_id) - # sell volume for 0.002 usdt - order_id = await account.sell_market(cro.Symbol.CROUSDT, 0.002) - order = await account.get_order(order_id, cro.Symbol.CROUSDT) - assert order['status'] == cro.OrderStatus.FILLED - order_ids['sell'].append(order_id) + # sell volume for 0.002 usdt + order_id = await account.sell_market(cro.Symbol.CROUSDT, 0.002) + order = await account.get_order(order_id, cro.Symbol.CROUSDT) + assert order['status'] == cro.OrderStatus.FILLED + order_ids['sell'].append(order_id) @pytest.mark.asyncio async def test_account_market_orders(account: cro.Account): order_ids = {'buy': [], 'sell': []} - sem = asyncio.Semaphore(5) await asyncio.gather(*[ - make_trades(account, order_ids, sem) for _ in range(20) + make_trades(account, order_ids) for _ in range(20) ]) trades = await account.get_trades(cro.Symbol.CROUSDT, page_size=40)