]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blame - helper.py
Retry running order when available balance is insufficient
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / helper.py
CommitLineData
f86ee140
IB
1from datetime import datetime
2import argparse
3import configparser
4import psycopg2
5import os
6import sys
7
8import portfolio
9
10def 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
41def 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 59def 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
71def 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
85def 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
94def 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 100def print_balances(market, base_currency="BTC"):
f70bb858 101 market.report.log_stage("print_balances")
f86ee140 102 market.balances.fetch_balances()
97922ff1 103 if base_currency is not None:
f86ee140
IB
104 market.report.print_log("total:")
105 market.report.print_log(sum(market.balances.in_currency(base_currency).values()))
106
107def 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
117def 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
128def 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
138def 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")
6ca5a1ec
IB
148
149