From a930ddd0920818984ddd631bbcdf0a80d2f80b71 Mon Sep 17 00:00:00 2001 From: Irishery Date: Fri, 3 Dec 2021 00:52:37 +0200 Subject: [PATCH] RPS update --- src/cryptocom/exchange/api.py | 85 ++++++++++++++--------------------- tests/test_api.py | 1 - 2 files changed, 34 insertions(+), 52 deletions(-) diff --git a/src/cryptocom/exchange/api.py b/src/cryptocom/exchange/api.py index c66ad6e..e91971e 100644 --- a/src/cryptocom/exchange/api.py +++ b/src/cryptocom/exchange/api.py @@ -1,6 +1,5 @@ import os import json -import re import time import hmac import random @@ -16,6 +15,33 @@ import aiohttp from aiohttp.client_exceptions import ContentTypeError +RATE_LIMITS = { + # order methods + ( + 'private/create-order', + 'private/cancel-order', + 'private/cancel-all-orders', + 'private/margin/create-order', + 'private/margin/cancel-order', + 'private/margin/cancel-all-orders', + ): (14, 0.1), + + # order detail methods + ( + 'private/get-order-detail', + 'private/margin/get-order-detail', + ): (29, 0.1), + + # general trade methods + ( + 'private/get-trades', + 'private/margin/get-trades', + 'private/get-order-history', + 'private/margin/get-order-history' + ): (1, 1) +} + + class ApiError(Exception): pass @@ -35,51 +61,12 @@ class ApiProvider: self.timeout = timeout self.retries = retries self.last_request_path = '' - self.limits = { - # method: (req_limit, period) - 'private/create-order': (14, 0.1), - 'private/cancel-order': (14, 0.1), - 'private/cancel-all-orders': (14, 0.1), - 'private/margin/create-order': (14, 0.1), - 'private/margin/cancel-order': (14, 0.1), - 'private/margin/cancel-all-orders': (14, 0.1), - - 'private/get-order-detail': (29, 0.1), - 'private/margin/get-order-detail': (29, 0.1), - - 'private/get-trades': (1, 1), - 'private/margin/get-trades': (1, 1), - 'private/get-order-history': (1, 1), - 'private/margin/get-order-history': (1, 1) - } - - # lists for methods - aiolimiter metching - self.order_methods = [ - 'private/create-order', - 'private/cancel-order', - 'private/cancel-all-orders', - 'private/margin/create-order', - 'private/margin/cancel-order', - 'private/margin/cancel-all-orders', - ] - self.order_methods_limit = AsyncLimiter(14, 0.1) + self.rate_limiters = {} - self.detail_methods = [ - 'private/get-order-detail', - 'private/margin/get-order-detail', - ] - - self.detail_methods_limit = AsyncLimiter(29, 0.1) - - self.general_trade_methods = [ - 'private/get-trades', - 'private/margin/get-trades', - 'private/get-order-history', - 'private/margin/get-order-history' - ] - - self.general_trade_methods_limit = AsyncLimiter(1, 1) + for urls in RATE_LIMITS: + for url in urls: + self.rate_limiters[url] = AsyncLimiter(*RATE_LIMITS[urls]) # limits for not matched methods self.general_private_limit = AsyncLimiter(3, 0.1) @@ -127,13 +114,9 @@ class ApiProvider: return data def set_limit(self, path): - if path in self.order_methods: - return self.order_methods_limit - elif path in self.detail_methods: - return self.detail_methods_limit - elif path in self.general_trade_methods: - return self.general_trade_methods_limit - + if path in self.rate_limiters.keys(): + return self.rate_limiters[path] + else: if path.startswith('private'): return self.general_private_limit diff --git a/tests/test_api.py b/tests/test_api.py index e797411..be4e34f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,5 +1,4 @@ import asyncio -from asyncio.events import get_running_loop import os import time import pytest