from ccxt import *
import decimal
import time
+from retry.api import retry_call
+import re
def _cw_exchange_sum(self, *args):
return sum([arg for arg in args if isinstance(arg, (float, int, decimal.Decimal))])
Exchange.sum = _cw_exchange_sum
class poloniexE(poloniex):
+ RETRIABLE_CALLS = [
+ re.compile(r"^return"),
+ re.compile(r"^cancel"),
+ re.compile(r"^closeMarginPosition$"),
+ re.compile(r"^getMarginPosition$"),
+ ]
+
+ def request(self, path, api='public', method='GET', params={}, headers=None, body=None):
+ """
+ Wrapped to allow retry of non-posting requests"
+ """
+
+ origin_request = super(poloniexE, self).request
+ kwargs = {
+ "api": api,
+ "method": method,
+ "params": params,
+ "headers": headers,
+ "body": body
+ }
+
+ retriable = any(re.match(call, path) for call in self.RETRIABLE_CALLS)
+ if api == "public" or method == "GET" or retriable:
+ return retry_call(origin_request, fargs=[path], fkwargs=kwargs,
+ tries=10, delay=1, exceptions=(RequestTimeout,))
+ else:
+ return origin_request(path, **kwargs)
+
+ def __init__(self, *args, **kwargs):
+ super(poloniexE, self).__init__(*args, **kwargs)
+
+ # For requests logging
+ self.session.origin_request = self.session.request
+ self.session._parent = self
+
+ def request_wrap(self, *args, **kwargs):
+ r = self.origin_request(*args, **kwargs)
+ self._parent._market.report.log_http_request(args[0],
+ args[1], kwargs["data"], kwargs["headers"], r)
+ return r
+ self.session.request = request_wrap.__get__(self.session,
+ self.session.__class__)
+
@staticmethod
def nanoseconds():
return int(time.time() * 1000000000)