X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=store.py;h=d9038b7fa32d9adb46d5a57acc5d312268bc6a77;hb=17598517c544a3dda8b9f773dfeb669c886ea92b;hp=bebd127f14f482010f52eb73407484b214f96cce;hpb=be54a20157119438c6450b345e4a70d71964ec2e;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git diff --git a/store.py b/store.py index bebd127..d9038b7 100644 --- a/store.py +++ b/store.py @@ -2,6 +2,7 @@ import portfolio import simplejson as json from decimal import Decimal as D, ROUND_DOWN from datetime import date, datetime +import inspect __all__ = ["BalanceStore", "ReportStore", "TradeStore"] @@ -31,13 +32,24 @@ class ReportStore: def set_verbose(self, verbose_print): self.verbose_print = verbose_print - def log_stage(self, stage): + def log_stage(self, stage, **kwargs): + def as_json(element): + if callable(element): + return inspect.getsource(element).strip() + elif hasattr(element, "as_json"): + return element.as_json() + else: + return element + + args = { k: as_json(v) for k, v in kwargs.items() } + args_str = ["{}={}".format(k, v) for k, v in args.items()] self.print_log("-" * (len(stage) + 8)) - self.print_log("[Stage] {}".format(stage)) + self.print_log("[Stage] {} {}".format(stage, ", ".join(args_str))) self.add_log({ "type": "stage", "stage": stage, + "args": args, }) def log_balances(self, tag=None): @@ -55,6 +67,9 @@ class ReportStore: compute_value, type): values = {} rates = {} + if callable(compute_value): + compute_value = inspect.getsource(compute_value).strip() + for currency, amount in amounts.items(): values[currency] = amount.as_json()["value"] rates[currency] = amount.rate @@ -92,6 +107,8 @@ class ReportStore: }) def log_orders(self, orders, tick=None, only=None, compute_value=None): + if callable(compute_value): + compute_value = inspect.getsource(compute_value).strip() self.print_log("[Orders]") self.market.trades.print_all_with_order(ind="\t") self.add_log({ @@ -104,6 +121,8 @@ class ReportStore: def log_order(self, order, tick, finished=False, update=None, new_order=None, compute_value=None): + if callable(compute_value): + compute_value = inspect.getsource(compute_value).strip() if finished: self.print_log("[Order] Finished {}".format(order)) elif update == "waiting": @@ -201,8 +220,7 @@ class BalanceStore: amounts[currency] = ptt * amount / sum_ratio if trade_type == "short": amounts[currency] = - amounts[currency] - if currency not in self.all: - self.all[currency] = portfolio.Balance(currency, {}) + self.all.setdefault(currency, portfolio.Balance(currency, {})) self.market.report.log_dispatch(amount, amounts, liquidity, repartition) return amounts @@ -214,6 +232,10 @@ class TradeStore: self.market = market self.all = [] + @property + def pending(self): + return list(filter(lambda t: t.pending, self.all)) + def compute_trades(self, values_in_base, new_repartition, only=None): computed_trades = [] base_currency = sum(values_in_base.values()).currency @@ -248,11 +270,15 @@ class TradeStore: def prepare_orders(self, only=None, compute_value="default"): orders = [] - for trade in self.all: + for trade in self.pending: if only is None or trade.action == only: orders.append(trade.prepare_order(compute_value=compute_value)) self.market.report.log_orders(orders, only, compute_value) + def close_trades(self): + for trade in self.all: + trade.close() + def print_all_with_order(self, ind=""): for trade in self.all: trade.print_with_order(ind=ind)