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")
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"],
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: