]>
Commit | Line | Data |
---|---|---|
269ec87c IB |
1 | import ccxt |
2 | ||
3 | max_digits = 18 | |
4 | current_assets = { | |
5 | "ETH": int(2.00000000 * 10**max_digits), | |
6 | "BTC": int(1.23000000 * 10**max_digits), | |
7 | "ZEC": int(2.00000000 * 10**max_digits), | |
8 | "SC" : int(2.000000000 * 10**max_digits), | |
9 | } | |
10 | ||
11 | repartition_pertenthousand = { | |
12 | "BTC": 2857, | |
13 | "ZEC": 3701, | |
14 | "DOGE": 1805, | |
15 | "DGB": 1015, | |
16 | "SC": 623, | |
17 | } | |
18 | ||
19 | market = ccxt.poloniex() | |
20 | ||
21 | def formatted_price(value): | |
22 | return round(value / 10**max_digits, 8) | |
23 | ||
24 | def get_ticker(c1, c2, market): | |
25 | try: | |
26 | return market.fetch_ticker("{}/{}".format(c1, c2)) | |
27 | except ccxt.ExchangeError: | |
28 | try: | |
29 | ticker = market.fetch_ticker("{}/{}".format(c2, c1)) | |
30 | return { | |
31 | "bid": float(1/ticker["ask"]), | |
32 | "ask": float(1/ticker["bid"]), | |
33 | } | |
34 | except ccxt.ExchangeError: | |
35 | return None | |
36 | ||
37 | def assets_value(assets, market, base_currency="BTC"): | |
38 | repartition_in_base_currency = {} | |
39 | for currency, asset_value in assets.items(): | |
40 | if currency == base_currency: | |
41 | repartition_in_base_currency[currency] = asset_value | |
42 | else: | |
43 | asset_ticker = get_ticker(currency, base_currency, market) | |
44 | if asset_ticker is None: | |
45 | raise Exception("This asset is not available in the chosen market") | |
46 | repartition_in_base_currency[currency] = int(asset_ticker["bid"] * asset_value) | |
47 | return repartition_in_base_currency | |
48 | ||
49 | def dispatch_assets(base_currency_value, repartition_pertenthousand, market, base_currency="BTC"): | |
50 | sum_pertenthousand = sum([v for k, v in repartition_pertenthousand.items()]) | |
51 | repartition_in_base_currency = {} | |
52 | for currency, ptt in repartition_pertenthousand.items(): | |
53 | repartition_in_base_currency[currency] = int(ptt * base_currency_value / sum_pertenthousand) | |
54 | return repartition_in_base_currency | |
55 | ||
56 | def give_orders(current_assets, repartition_pertenthousand, market, base_currency="BTC"): | |
57 | value_in_base = assets_value(current_assets, market, base_currency=base_currency) | |
58 | total_base_value = sum([ v for k, v in value_in_base.items()]) | |
59 | ||
60 | new_repartition = dispatch_assets(total_base_value, repartition_pertenthousand, market, base_currency=base_currency) | |
61 | mouvements = {} | |
62 | ||
63 | for key in set(value_in_base.keys()).union(set(new_repartition.keys())): | |
64 | mouvements[key] = value_in_base.get(key, 0) - new_repartition.get(key, 0) | |
65 | ||
66 | print("assets before repartition:") | |
67 | for currency, value in current_assets.items(): | |
68 | print("holding {} {}".format( | |
69 | formatted_price(value), | |
70 | currency)) | |
71 | print("------------") | |
72 | for currency, value in mouvements.items(): | |
73 | if currency == base_currency: | |
74 | continue | |
75 | asset_ticker = get_ticker(currency, base_currency, market) | |
76 | if value > 0: | |
77 | action = "sell" | |
78 | currency_price = int(value / asset_ticker["bid"]) | |
79 | else: | |
80 | action = "buy" | |
81 | currency_price = int(value / asset_ticker["ask"]) | |
82 | if value != 0: | |
83 | print("need to {} {} {}'s worth of {}, i.e. {} {}".format( | |
84 | action, | |
85 | formatted_price(abs(value)), | |
86 | base_currency, | |
87 | currency, | |
88 | formatted_price(abs(currency_price)), | |
89 | currency)) | |
90 | print("------------\nassets after repartition:") | |
91 | for currency, value in new_repartition.items(): | |
92 | print("holding {} {}".format(formatted_price(value), currency)) | |
93 | ||
94 | give_orders(current_assets, repartition_pertenthousand, market) |