X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=market.py;h=0d91f17e35c988086c69b5a5f6d816f403cc699d;hb=23f4616a85bef7e9acc57740f889a2a0346788af;hp=0cb3e67e5fc8bd1efd3542f4a06c6b0f08a46285;hpb=d24bb10c3cad1f144b76022481f46b4524873f4b;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git diff --git a/market.py b/market.py index 0cb3e67..0d91f17 100644 --- a/market.py +++ b/market.py @@ -1,7 +1,8 @@ -from ccxt import ExchangeError +from ccxt import ExchangeError, NotSupported import ccxt_wrapper as ccxt import time from store import * +from cachetools.func import ttl_cache class Market: debug = False @@ -42,19 +43,17 @@ class Market: needed_in_margin = {} moving_to_margin = {} - for currency in self.balances.all: - if self.balances.all[currency].margin_free != 0: - needed_in_margin[currency] = 0 - for trade in self.trades.all: - if trade.value_to.currency not in needed_in_margin: - needed_in_margin[trade.value_to.currency] = 0 + for currency, balance in self.balances.all.items(): + needed_in_margin[currency] = balance.margin_in_position - balance.margin_pending_gain + for trade in self.trades.pending: + needed_in_margin.setdefault(trade.base_currency, 0) if trade.trade_type == "short": - needed_in_margin[trade.value_to.currency] += abs(trade.value_to) + needed_in_margin[trade.base_currency] -= trade.delta for currency, needed in needed_in_margin.items(): - current_balance = self.balances.all[currency].margin_free + current_balance = self.balances.all[currency].margin_available moving_to_margin[currency] = (needed - current_balance) delta = moving_to_margin[currency].value - if self.debug: + if self.debug and delta != 0: self.report.log_debug_action("Moving {} from exchange to margin".format(moving_to_margin[currency])) continue if delta > 0: @@ -65,14 +64,18 @@ class Market: self.balances.fetch_balances() - fees_cache = {} + @ttl_cache(ttl=3600) def fetch_fees(self): - if self.ccxt.__class__ not in self.fees_cache: - self.fees_cache[self.ccxt.__class__] = self.ccxt.fetch_fees() - return self.fees_cache[self.ccxt.__class__] + return self.ccxt.fetch_fees() + + @ttl_cache(maxsize=20, ttl=5) + def get_tickers(self, refresh=False): + try: + return self.ccxt.fetch_tickers() + except NotSupported: + return None - ticker_cache = {} - ticker_cache_timestamp = time.time() + @ttl_cache(maxsize=20, ttl=5) def get_ticker(self, c1, c2, refresh=False): def invert(ticker): return { @@ -85,26 +88,25 @@ class Market: "inverted": False, "average": (ticker["bid"] + ticker["ask"] ) / 2, }) + return ticker - if time.time() - self.ticker_cache_timestamp > 5: - self.ticker_cache = {} - self.ticker_cache_timestamp = time.time() - elif not refresh: - if (c1, c2, self.ccxt.__class__) in self.ticker_cache: - return self.ticker_cache[(c1, c2, self.ccxt.__class__)] - if (c2, c1, self.ccxt.__class__) in self.ticker_cache: - return invert(self.ticker_cache[(c2, c1, self.ccxt.__class__)]) - - try: - self.ticker_cache[(c1, c2, self.ccxt.__class__)] = self.ccxt.fetch_ticker("{}/{}".format(c1, c2)) - augment_ticker(self.ticker_cache[(c1, c2, self.ccxt.__class__)]) - except ExchangeError: + tickers = self.get_tickers() + if tickers is None: try: - self.ticker_cache[(c2, c1, self.ccxt.__class__)] = self.ccxt.fetch_ticker("{}/{}".format(c2, c1)) - augment_ticker(self.ticker_cache[(c2, c1, self.ccxt.__class__)]) + ticker = augment_ticker(self.ccxt.fetch_ticker("{}/{}".format(c1, c2))) except ExchangeError: - self.ticker_cache[(c1, c2, self.ccxt.__class__)] = None - return self.get_ticker(c1, c2) + try: + ticker = invert(augment_ticker(self.ccxt.fetch_ticker("{}/{}".format(c2, c1)))) + except ExchangeError: + ticker = None + else: + if "{}/{}".format(c1, c2) in tickers: + ticker = augment_ticker(tickers["{}/{}".format(c1, c2)]) + elif "{}/{}".format(c2, c1) in tickers: + ticker = invert(augment_ticker(tickers["{}/{}".format(c2, c1)])) + else: + ticker = None + return ticker def follow_orders(self, sleep=None): if sleep is None: