import portfolio
__all__ = ["BalanceStore", "TradeStore"]
class BalanceStore:
all = {}
@classmethod
def currencies(cls):
return cls.all.keys()
@classmethod
def in_currency(cls, other_currency, market, compute_value="average", type="total"):
amounts = {}
for currency, balance in cls.all.items():
other_currency_amount = getattr(balance, type)\
.in_currency(other_currency, market, compute_value=compute_value)
amounts[currency] = other_currency_amount
return amounts
@classmethod
def fetch_balances(cls, market):
all_balances = market.fetch_all_balances()
for currency, balance in all_balances.items():
if balance["exchange_total"] != 0 or balance["margin_total"] != 0 or \
currency in cls.all:
cls.all[currency] = portfolio.Balance(currency, balance)
@classmethod
def dispatch_assets(cls, amount, repartition=None):
if repartition is None:
repartition = portfolio.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 trade_type == "short":
amounts[currency] = - amounts[currency]
if currency not in BalanceStore.all:
cls.all[currency] = portfolio.Balance(currency, {})
return amounts
class TradeStore:
all = []
debug = False
@classmethod
def compute_trades(cls, values_in_base, new_repartition, only=None, market=None, debug=False):
cls.debug = cls.debug or debug
base_currency = sum(values_in_base.values()).currency
for currency in BalanceStore.currencies():
if currency == base_currency:
continue
value_from = values_in_base.get(currency, portfolio.Amount(base_currency, 0))
value_to = new_repartition.get(currency, portfolio.Amount(base_currency, 0))
if value_from.value * value_to.value < 0:
cls.add_trade_if_matching(
value_from, portfolio.Amount(base_currency, 0),
currency, only=only, market=market)
cls.add_trade_if_matching(
portfolio.Amount(base_currency, 0), value_to,
currency, only=only, market=market)
else:
cls.add_trade_if_matching(value_from, value_to,
currency, only=only, market=market)
@classmethod
def add_trade_if_matching(cls, value_from, value_to, currency,
only=None, market=None):
trade = portfolio.Trade(value_from, value_to, currency,
market=market)
if only is None or trade.action == only:
cls.all.append(trade)
return True
return False
@classmethod
def prepare_orders(cls, only=None, compute_value="default"):
for trade in cls.all:
if only is None or trade.action == only:
trade.prepare_order(compute_value=compute_value)
@classmethod
def print_all_with_order(cls):
for trade in cls.all:
trade.print_with_order()
@classmethod
def run_orders(cls):
for order in cls.all_orders(state="pending"):
order.run()
@classmethod
def all_orders(cls, state=None):
all_orders = sum(map(lambda v: v.orders, cls.all), [])
if state is None:
return all_orders
else:
return list(filter(lambda o: o.status == state, all_orders))
@classmethod
def update_all_orders_status(cls):
for order in cls.all_orders(state="open"):
order.get_status()