- @classmethod
- def currencies(cls):
- return cls.known_balances.keys()
-
- @classmethod
- def _fill_balances(cls, hash_):
- for key in hash_:
- if key in ["info", "free", "used", "total"]:
- continue
- if hash_[key]["total"] != 0 or key in cls.known_balances:
- cls.known_balances[key] = cls.from_hash(key, hash_[key])
-
- @classmethod
- def fetch_balances(cls, market):
- cls._fill_balances(market.fetch_balance())
- return cls.known_balances
- # FIXME:Separate balances per trade type and in position
- # Need to check how balances in position are represented
-
-
- @classmethod
- def dispatch_assets(cls, amount, repartition=None):
- if repartition is None:
- repartition = Portfolio.repartition()
- sum_ratio = sum([v[0] for k, v in repartition.items()])
- amounts = {}
- for currency, (ptt, trade_type) in repartition.items():
- amounts[currency] = ptt * amount / sum_ratio
- if currency not in cls.known_balances:
- cls.known_balances[currency] = cls(currency, 0, 0, 0)
- return amounts
-
- @classmethod
- def dispatch_trade_types(cls, repartition=None):
- if repartition is None:
- repartition = Portfolio.repartition()
- trade_types = {}
- for currency, (ptt, trade_type) in repartition.items():
- trade_types[currency] = trade_type
- return trade_types
- # FIXME: once we know the repartition and sold everything, we can move
- # the necessary part to the margin account
-
- @classmethod
- def prepare_trades(cls, market, base_currency="BTC", compute_value="average"):
- cls.fetch_balances(market)
- values_in_base = cls.in_currency(base_currency, market, compute_value=compute_value)
- total_base_value = sum(values_in_base.values())
- new_repartition = cls.dispatch_assets(total_base_value)
- trade_types = cls.dispatch_trade_types()
- # Recompute it in case we have new currencies
- values_in_base = cls.in_currency(base_currency, market, compute_value=compute_value)
- Trade.compute_trades(values_in_base, new_repartition, trade_types, market=market)
-
- @classmethod
- def update_trades(cls, market, base_currency="BTC", compute_value="average", only=None):
- cls.fetch_balances(market)
- values_in_base = cls.in_currency(base_currency, market, compute_value=compute_value)
- total_base_value = sum(values_in_base.values())
- new_repartition = cls.dispatch_assets(total_base_value)
- trade_types = cls.dispatch_trade_types()
- Trade.compute_trades(values_in_base, new_repartition, trade_types, only=only, market=market)