X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=portfolio.py;h=6d51989e2ae39d55f9f54f86291a6b4820e96782;hb=c2644ba8db6e3890458af6a244aa3217e2ac4797;hp=5211dd80fb1ffe47d82f9254e43afe8d07961001;hpb=deb8924cc60f0d64575657399f4fe112ff1cfb31;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git diff --git a/portfolio.py b/portfolio.py index 5211dd8..6d51989 100644 --- a/portfolio.py +++ b/portfolio.py @@ -80,25 +80,34 @@ class Portfolio: class Amount: MAX_DIGITS = 18 - def __init__(self, currency, value, linked_to=None, ticker=None): + def __init__(self, currency, value, linked_to=None, ticker=None, rate=None): self.currency = currency self.value = D(value) self.linked_to = linked_to self.ticker = ticker + self.rate = rate self.ticker_cache = {} self.ticker_cache_timestamp = time.time() - def in_currency(self, other_currency, market, action=None, compute_value="average"): + def in_currency(self, other_currency, market, rate=None, action=None, compute_value="average"): if other_currency == self.currency: return self + if rate is not None: + return Amount( + other_currency, + self.value * rate, + linked_to=self, + rate=rate) asset_ticker = Trade.get_ticker(self.currency, other_currency, market) if asset_ticker is not None: + rate = Trade.compute_value(asset_ticker, action, compute_value=compute_value) return Amount( other_currency, - self.value * Trade.compute_value(asset_ticker, action, compute_value=compute_value), + self.value * rate, linked_to=self, - ticker=asset_ticker) + ticker=asset_ticker, + rate=rate) else: raise Exception("This asset is not available in the chosen market") @@ -226,15 +235,8 @@ class Balance: return "Balance({} [{}/{}/{}])".format(self.currency, str(self.free), str(self.used), str(self.total)) class Computation: - def average_inverse(ticker, action): - if ticker["inverted"]: - return 1/ticker["original"]["average"] - else: - return ticker["average"] - computations = { "default": lambda x, y: x[y], - "average_inverse": average_inverse, "average": lambda x, y: x["average"], "bid": lambda x, y: x["bid"], "ask": lambda x, y: x["ask"], @@ -341,9 +343,7 @@ class Trade: if not inverted: value_from = self.value_from.linked_to - # The ticker will most probably be inverted, but we want the average - # of the initial value - value_to = self.value_to.in_currency(self.currency, self.market, compute_value="average_inverse") + value_to = self.value_to.in_currency(self.currency, self.market, rate=1/self.value_from.rate) delta = abs(value_to - value_from) currency = self.base_currency else: