Added rate-limit inside api-provider

api-breakage
Morty Space 6 years ago
parent 35993c0e9e
commit 9a82df8735
  1. 14
      src/cryptocom/exchange/api.py
  2. 26
      tests/test_account.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}")

@ -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)

Loading…
Cancel
Save