X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git;a=blobdiff_plain;f=helper.py;h=f14fd580f967c2e64985235c14af1bd4d80873fb;hp=be480e28fdbb76df7ae0d91c9130bd2a2e82d379;hb=9db7d156833cd384baa64b6148b5c646bfcc41f8;hpb=7bd830a83b662874c145ea9548edfde79eadc68f diff --git a/helper.py b/helper.py index be480e2..f14fd58 100644 --- a/helper.py +++ b/helper.py @@ -127,10 +127,9 @@ def main_fetch_markets(pg_config, user): def main_process_market(user_market, actions, before=False, after=False): if len(actions or []) == 0: if before: - process_sell_all__1_all_sell(user_market) + Processor(user_market).process("sell_all", steps="before") if after: - process_sell_all__2_wait(user_market) - process_sell_all__3_all_buy(user_market) + Processor(user_market).process("sell_all", steps="after") else: for action in actions: if action in globals(): @@ -160,51 +159,159 @@ def print_balances(market, base_currency="BTC"): market.report.print_log("total:") market.report.print_log(sum(market.balances.in_currency(base_currency).values())) +class Processor: + scenarios = { + "sell_needed": [ + { + "name": "wait", + "number": 0, + "before": False, + "after": True, + "wait_for_recent": {}, + }, + { + "name": "sell", + "number": 1, + "before": False, + "after": True, + "fetch_balances": ["begin", "end"], + "prepare_trades": {}, + "prepare_orders": { "only": "dispose", "compute_value": "average" }, + "run_orders": {}, + "follow_orders": {}, + }, + { + "name": "buy", + "number": 2, + "before": False, + "after": True, + "fetch_balances": ["begin", "end"], + "prepare_trades": { "only": "acquire" }, + "prepare_orders": { "only": "acquire", "compute_value": "average" }, + "move_balances": {}, + "run_orders": {}, + "follow_orders": {}, + }, + ], + "sell_all": [ + { + "name": "all_sell", + "number": 1, + "before": True, + "after": False, + "fetch_balances": ["begin", "end"], + "prepare_trades": { "repartition": { "BTC": (1, "long") } }, + "prepare_orders": { "compute_value": "average" }, + "run_orders": {}, + "follow_orders": {}, + }, + { + "name": "wait", + "number": 2, + "before": False, + "after": True, + "wait_for_recent": {}, + }, + { + "name": "all_buy", + "number": 3, + "before": False, + "after": True, + "fetch_balances": ["begin", "end"], + "prepare_trades": {}, + "prepare_orders": { "compute_value": "average" }, + "move_balances": {}, + "run_orders": {}, + "follow_orders": {}, + }, + ] + } + + allowed_arguments = { + "wait_for_recent": ["delta"], + "prepare_trades": ["base_currency", "liquidity", "compute_value", "repartition", "only"], + "prepare_orders": ["only", "compute_value"], + "move_balances": [], + "run_orders": [], + "follow_orders": ["sleep"], + } + + def __init__(self, market): + self.market = market + + def select_steps(self, scenario, step): + if step == "all": + return scenario + elif step == "before" or step == "after": + return list(filter(lambda x: step in x and x[step], scenario)) + elif type(step) == int: + return [scenario[step-1]] + elif type(step) == str: + return list(filter(lambda x: x["name"] == step, scenario)) + else: + raise TypeError("Unknown step {}".format(step)) + + def process(self, scenario_name, steps="all", **kwargs): + scenario = self.scenarios[scenario_name] + selected_steps = [] + + if type(steps) == str or type(steps) == int: + selected_steps += self.select_steps(scenario, steps) + else: + for step in steps: + selected_steps += self.select_steps(scenario, step) + for step in selected_steps: + self.process_step(scenario_name, step, **kwargs) + + def process_step(self, scenario_name, step, **kwargs): + process_name = "process_{}__{}_{}".format(scenario_name, step["number"], step["name"]) + self.market.report.log_stage("{}_begin".format(process_name)) + if "begin" in step.get("fetch_balances", []): + self.market.balances.fetch_balances(tag="{}_begin".format(process_name)) + + for action in ["wait_for_recent", "prepare_trades", + "prepare_orders", "move_balances", "run_orders", + "follow_orders"]: + if action in step: + self.run_action(action, step[action], **kwargs) + + if "end" in step.get("fetch_balances", []): + self.market.balances.fetch_balances(tag="{}_end".format(process_name)) + self.market.report.log_stage("{}_end".format(process_name)) + + def run_action(self, action, default_args, **kwargs): + args = {k: v for k, v in {**default_args, **kwargs}.items() if k in self.allowed_arguments[action] } + + if action == "wait_for_recent": + portfolio.Portfolio.wait_for_recent(self.market, **args) + if action == "prepare_trades": + self.market.prepare_trades(**args) + if action == "prepare_orders": + self.market.trades.prepare_orders(**args) + if action == "move_balances": + self.market.move_balances(**args) + if action == "run_orders": + self.market.trades.run_orders(**args) + if action == "follow_orders": + self.market.follow_orders(**args) + def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"): - market.report.log_stage("process_sell_needed__1_sell_begin") - market.balances.fetch_balances(tag="process_sell_needed__1_sell_begin") - market.prepare_trades(liquidity=liquidity, base_currency=base_currency) - market.trades.prepare_orders(compute_value="average", only="dispose") - market.trades.run_orders() - market.follow_orders() - market.balances.fetch_balances(tag="process_sell_needed__1_sell_end") - market.report.log_stage("process_sell_needed__1_sell_end") + Processor(market).process("sell_needed", steps="sell", + liquidity=liquidity, base_currency=base_currency) def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"): - market.report.log_stage("process_sell_needed__2_buy_begin") - market.balances.fetch_balances(tag="process_sell_needed__2_buy_begin") - market.prepare_trades(base_currency=base_currency, liquidity=liquidity, only="acquire") - market.trades.prepare_orders(compute_value="average", only="acquire") - market.move_balances() - market.trades.run_orders() - market.follow_orders() - market.balances.fetch_balances(tag="process_sell_needed__2_buy_end") - market.report.log_stage("process_sell_needed__2_buy_end") + Processor(market).process("sell_needed", steps="buy", + liquidity=liquidity, base_currency=base_currency) def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"): - market.report.log_stage("process_sell_all__1_all_sell_begin") - market.balances.fetch_balances(tag="process_sell_all__1_all_sell_begin") - market.prepare_trades_to_sell_all(base_currency=base_currency) - market.trades.prepare_orders(compute_value="average") - market.trades.run_orders() - market.follow_orders() - market.balances.fetch_balances(tag="process_sell_all__1_all_sell_end") - market.report.log_stage("process_sell_all__1_all_sell_end") + Processor(market).process("sell_all", steps="all_sell", + liquidity=liquidity, base_currency=base_currency) def process_sell_all__2_wait(market, liquidity="medium", base_currency="BTC"): - market.report.log_stage("process_sell_all__2_wait_begin") - portfolio.Portfolio.wait_for_recent(market) - market.report.log_stage("process_sell_all__2_wait_end") + Processor(market).process("sell_all", steps="wait", + liquidity=liquidity, base_currency=base_currency) def process_sell_all__3_all_buy(market, base_currency="BTC", liquidity="medium"): - market.report.log_stage("process_sell_all__3_all_buy_begin") - market.balances.fetch_balances(tag="process_sell_all__3_all_buy_begin") - market.prepare_trades(liquidity=liquidity, base_currency=base_currency) - market.trades.prepare_orders(compute_value="average") - market.move_balances() - market.trades.run_orders() - market.follow_orders() - market.balances.fetch_balances(tag="process_sell_all__3_all_buy_end") - market.report.log_stage("process_sell_all__3_all_buy_end") - + Processor(market).process("sell_all", steps="all_buy", + liquidity=liquidity, base_currency=base_currency)