]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blob - helper.py
Retry running order when available balance is insufficient
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / helper.py
1 from datetime import datetime
2 import argparse
3 import configparser
4 import psycopg2
5 import os
6 import sys
7
8 import portfolio
9
10 def main_parse_args(argv):
11 parser = argparse.ArgumentParser(
12 description="Run the trade bot")
13
14 parser.add_argument("-c", "--config",
15 default="config.ini",
16 required=False,
17 help="Config file to load (default: config.ini)")
18 parser.add_argument("--before",
19 default=False, action='store_const', const=True,
20 help="Run the steps before the cryptoportfolio update")
21 parser.add_argument("--after",
22 default=False, action='store_const', const=True,
23 help="Run the steps after the cryptoportfolio update")
24 parser.add_argument("--debug",
25 default=False, action='store_const', const=True,
26 help="Run in debug mode")
27 parser.add_argument("--user",
28 default=None, required=False, help="Only run for that user")
29 parser.add_argument("--action",
30 default=None, required=False,
31 help="Do a different action than trading")
32
33 args = parser.parse_args(argv)
34
35 if not os.path.exists(args.config):
36 print("no config file found, exiting")
37 sys.exit(1)
38
39 return args
40
41 def main_parse_config(config_file):
42 config = configparser.ConfigParser()
43 config.read(config_file)
44
45 if "postgresql" not in config:
46 print("no configuration for postgresql in config file")
47 sys.exit(1)
48
49 if "app" in config and "report_path" in config["app"]:
50 report_path = config["app"]["report_path"]
51
52 if not os.path.exists(report_path):
53 os.makedirs(report_path)
54 else:
55 report_path = None
56
57 return [config["postgresql"], report_path]
58
59 def main_fetch_markets(pg_config, user):
60 connection = psycopg2.connect(**pg_config)
61 cursor = connection.cursor()
62
63 if user is None:
64 cursor.execute("SELECT config,user_id FROM market_configs")
65 else:
66 cursor.execute("SELECT config,user_id FROM market_configs WHERE user_id = %s", user)
67
68 for row in cursor:
69 yield row
70
71 def main_process_market(user_market, action, before=False, after=False):
72 if action is None:
73 if before:
74 process_sell_all__1_all_sell(user_market)
75 if after:
76 portfolio.Portfolio.wait_for_recent(user_market)
77 process_sell_all__2_all_buy(user_market)
78 elif action == "print_balances":
79 print_balances(user_market)
80 elif action == "print_orders":
81 print_orders(user_market)
82 else:
83 raise NotImplementedError("Unknown action {}".format(action))
84
85 def main_store_report(report_path, user_id, user_market):
86 try:
87 if report_path is not None:
88 report_file = "{}/{}_{}.json".format(report_path, datetime.now().isoformat(), user_id)
89 with open(report_file, "w") as f:
90 f.write(user_market.report.to_json())
91 except Exception as e:
92 print("impossible to store report file: {}; {}".format(e.__class__.__name__, e))
93
94 def print_orders(market, base_currency="BTC"):
95 market.report.log_stage("print_orders")
96 market.balances.fetch_balances(tag="print_orders")
97 market.prepare_trades(base_currency=base_currency, compute_value="average")
98 market.trades.prepare_orders(compute_value="average")
99
100 def print_balances(market, base_currency="BTC"):
101 market.report.log_stage("print_balances")
102 market.balances.fetch_balances()
103 if base_currency is not None:
104 market.report.print_log("total:")
105 market.report.print_log(sum(market.balances.in_currency(base_currency).values()))
106
107 def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"):
108 market.report.log_stage("process_sell_needed__1_sell_begin")
109 market.balances.fetch_balances(tag="process_sell_needed__1_sell_begin")
110 market.prepare_trades(liquidity=liquidity, base_currency=base_currency)
111 market.trades.prepare_orders(compute_value="average", only="dispose")
112 market.trades.run_orders()
113 market.follow_orders()
114 market.balances.fetch_balances(tag="process_sell_needed__1_sell_end")
115 market.report.log_stage("process_sell_needed__1_sell_end")
116
117 def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"):
118 market.report.log_stage("process_sell_needed__2_buy_begin")
119 market.balances.fetch_balances(tag="process_sell_needed__2_buy_begin")
120 market.update_trades(base_currency=base_currency, liquidity=liquidity, only="acquire")
121 market.trades.prepare_orders(compute_value="average", only="acquire")
122 market.move_balances()
123 market.trades.run_orders()
124 market.follow_orders()
125 market.balances.fetch_balances(tag="process_sell_needed__2_buy_end")
126 market.report.log_stage("process_sell_needed__2_buy_end")
127
128 def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"):
129 market.report.log_stage("process_sell_all__1_all_sell_begin")
130 market.balances.fetch_balances(tag="process_sell_all__1_all_sell_begin")
131 market.prepare_trades_to_sell_all(base_currency=base_currency)
132 market.trades.prepare_orders(compute_value="average")
133 market.trades.run_orders()
134 market.follow_orders()
135 market.balances.fetch_balances(tag="process_sell_all__1_all_sell_end")
136 market.report.log_stage("process_sell_all__1_all_sell_end")
137
138 def process_sell_all__2_all_buy(market, base_currency="BTC", liquidity="medium"):
139 market.report.log_stage("process_sell_all__2_all_buy_begin")
140 market.balances.fetch_balances(tag="process_sell_all__2_all_buy_begin")
141 market.prepare_trades(liquidity=liquidity, base_currency=base_currency)
142 market.trades.prepare_orders(compute_value="average")
143 market.move_balances()
144 market.trades.run_orders()
145 market.follow_orders()
146 market.balances.fetch_balances(tag="process_sell_all__2_all_buy_end")
147 market.report.log_stage("process_sell_all__2_all_buy_end")
148
149