]>
Commit | Line | Data |
---|---|---|
f86ee140 IB |
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") | |
516a2517 IB |
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") | |
f86ee140 IB |
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 | ||
516a2517 | 59 | def main_fetch_markets(pg_config, user): |
f86ee140 IB |
60 | connection = psycopg2.connect(**pg_config) |
61 | cursor = connection.cursor() | |
62 | ||
516a2517 IB |
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) | |
f86ee140 IB |
67 | |
68 | for row in cursor: | |
69 | yield row | |
70 | ||
516a2517 IB |
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)) | |
f86ee140 IB |
84 | |
85 | def main_store_report(report_path, user_id, user_market): | |
6ca5a1ec | 86 | try: |
f86ee140 IB |
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)) | |
6ca5a1ec IB |
93 | |
94 | def print_orders(market, base_currency="BTC"): | |
f86ee140 IB |
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") | |
6ca5a1ec | 99 | |
97922ff1 | 100 | def print_balances(market, base_currency="BTC"): |
f86ee140 | 101 | market.balances.fetch_balances() |
97922ff1 | 102 | if base_currency is not None: |
f86ee140 IB |
103 | market.report.print_log("total:") |
104 | market.report.print_log(sum(market.balances.in_currency(base_currency).values())) | |
105 | ||
106 | def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"): | |
107 | market.report.log_stage("process_sell_needed__1_sell_begin") | |
108 | market.balances.fetch_balances(tag="process_sell_needed__1_sell_begin") | |
109 | market.prepare_trades(liquidity=liquidity, base_currency=base_currency) | |
110 | market.trades.prepare_orders(compute_value="average", only="dispose") | |
111 | market.trades.run_orders() | |
112 | market.follow_orders() | |
113 | market.balances.fetch_balances(tag="process_sell_needed__1_sell_end") | |
114 | market.report.log_stage("process_sell_needed__1_sell_end") | |
115 | ||
116 | def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"): | |
117 | market.report.log_stage("process_sell_needed__2_buy_begin") | |
118 | market.balances.fetch_balances(tag="process_sell_needed__2_buy_begin") | |
119 | market.update_trades(base_currency=base_currency, liquidity=liquidity, only="acquire") | |
120 | market.trades.prepare_orders(compute_value="average", only="acquire") | |
121 | market.move_balances() | |
122 | market.trades.run_orders() | |
123 | market.follow_orders() | |
124 | market.balances.fetch_balances(tag="process_sell_needed__2_buy_end") | |
125 | market.report.log_stage("process_sell_needed__2_buy_end") | |
126 | ||
127 | def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"): | |
128 | market.report.log_stage("process_sell_all__1_all_sell_begin") | |
129 | market.balances.fetch_balances(tag="process_sell_all__1_all_sell_begin") | |
130 | market.prepare_trades_to_sell_all(base_currency=base_currency) | |
131 | market.trades.prepare_orders(compute_value="average") | |
132 | market.trades.run_orders() | |
133 | market.follow_orders() | |
134 | market.balances.fetch_balances(tag="process_sell_all__1_all_sell_end") | |
135 | market.report.log_stage("process_sell_all__1_all_sell_end") | |
136 | ||
137 | def process_sell_all__2_all_buy(market, base_currency="BTC", liquidity="medium"): | |
138 | market.report.log_stage("process_sell_all__2_all_buy_begin") | |
139 | market.balances.fetch_balances(tag="process_sell_all__2_all_buy_begin") | |
140 | market.prepare_trades(liquidity=liquidity, base_currency=base_currency) | |
141 | market.trades.prepare_orders(compute_value="average") | |
142 | market.move_balances() | |
143 | market.trades.run_orders() | |
144 | market.follow_orders() | |
145 | market.balances.fetch_balances(tag="process_sell_all__2_all_buy_end") | |
146 | market.report.log_stage("process_sell_all__2_all_buy_end") | |
6ca5a1ec IB |
147 | |
148 |