diff options
author | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-01-14 03:02:11 +0100 |
---|---|---|
committer | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-01-14 03:02:11 +0100 |
commit | 89b80539deeca58cf8d063a8c75706050be485ab (patch) | |
tree | 16915e91e3ab7685a809f341a45048dfdebbb0a3 | |
parent | 48bedc24dc34159fdf0ddaa5daaa055596c11d5c (diff) | |
download | Trader-89b80539deeca58cf8d063a8c75706050be485ab.tar.gz Trader-89b80539deeca58cf8d063a8c75706050be485ab.tar.zst Trader-89b80539deeca58cf8d063a8c75706050be485ab.zip |
Add order processing functions
-rw-r--r-- | script.py | 114 |
1 files changed, 89 insertions, 25 deletions
@@ -83,7 +83,7 @@ def dispatch_assets(base_currency_value, repartition_pertenthousand, market, bas | |||
83 | repartition_in_base_currency[currency] = int(ptt * base_currency_value / sum_pertenthousand) | 83 | repartition_in_base_currency[currency] = int(ptt * base_currency_value / sum_pertenthousand) |
84 | return repartition_in_base_currency | 84 | return repartition_in_base_currency |
85 | 85 | ||
86 | def give_orders(current_assets, repartition_pertenthousand, market, base_currency="BTC"): | 86 | def compute_moves(current_assets, repartition_pertenthousand, market, base_currency="BTC"): |
87 | value_in_base = assets_value(current_assets, market, base_currency=base_currency) | 87 | value_in_base = assets_value(current_assets, market, base_currency=base_currency) |
88 | total_base_value = sum([ v for k, v in value_in_base.items()]) | 88 | total_base_value = sum([ v for k, v in value_in_base.items()]) |
89 | 89 | ||
@@ -93,33 +93,97 @@ def give_orders(current_assets, repartition_pertenthousand, market, base_currenc | |||
93 | for key in set(value_in_base.keys()).union(set(new_repartition.keys())): | 93 | for key in set(value_in_base.keys()).union(set(new_repartition.keys())): |
94 | mouvements[key] = value_in_base.get(key, 0) - new_repartition.get(key, 0) | 94 | mouvements[key] = value_in_base.get(key, 0) - new_repartition.get(key, 0) |
95 | 95 | ||
96 | print("assets before repartition:") | 96 | return mouvements |
97 | for currency, value in current_assets.items(): | 97 | |
98 | print("holding {} {}".format( | 98 | def compute_order(currency, value, market, base_currency="BTC"): |
99 | formatted_price(value), | 99 | if currency == base_currency or value == 0: |
100 | currency)) | 100 | return [None, 0, False] |
101 | print("------------") | 101 | |
102 | for currency, value in mouvements.items(): | 102 | asset_ticker = get_ticker(currency, base_currency, market) |
103 | if currency == base_currency: | 103 | if asset_ticker["inverted"]: |
104 | continue | 104 | asset_ticker = get_ticker(base_currency, currency, market) |
105 | asset_ticker = get_ticker(currency, base_currency, market) | 105 | if value > 0: |
106 | rate = asset_ticker["askA"] | ||
107 | return ["buy", rate, True] | ||
108 | else: | ||
109 | rate = asset_ticker["bidA"] | ||
110 | return ["sell", rate, True] | ||
111 | else: | ||
106 | if value > 0: | 112 | if value > 0: |
107 | action = "sell" | 113 | rate = asset_ticker["bidA"] |
108 | currency_price = int(value / asset_ticker["bid"]) | 114 | return ["sell", rate, False] |
109 | else: | 115 | else: |
110 | action = "buy" | 116 | rate = asset_ticker["askA"] |
111 | currency_price = int(value / asset_ticker["ask"]) | 117 | return ["buy", rate, False] |
112 | if value != 0: | 118 | |
119 | def make_order(currency, value, market, base_currency="BTC"): | ||
120 | action, rate, inverted = compute_order(currency, value, market, base_currency=base_currency) | ||
121 | amount = formatted_price(abs(value)) | ||
122 | if not inverted: | ||
123 | symbol = "{}/{}".format(currency, base_currency) | ||
124 | else: | ||
125 | symbol = "{}/{}".format(base_currency, currency) | ||
126 | return market.create_order(symbol, 'limit', action, amount, price=rate) | ||
127 | |||
128 | def make_orders(current_assets, repartition_pertenthousand, market, base_currency="BTC"): | ||
129 | mouvements = compute_moves( | ||
130 | current_assets, | ||
131 | repartition_pertenthousand, | ||
132 | market, | ||
133 | base_currency=base_currency) | ||
134 | |||
135 | results = [] | ||
136 | for currency, value in sorted(mouvements.items(), key=lambda x: x[1]): | ||
137 | # FIXME: wait for sales to finish | ||
138 | results.append(make_order(currency, value, market, base_currency=base_currency)) | ||
139 | return results | ||
140 | |||
141 | def print_assets(assets, indent="", market=None, base_currency="BTC"): | ||
142 | if market is not None: | ||
143 | format_string = "{}{} {} ({} {})" | ||
144 | else: | ||
145 | format_string = "{}{} {}" | ||
146 | base_currency_price = 0 | ||
147 | |||
148 | for currency, value in assets.items(): | ||
149 | if market is not None: | ||
150 | asset_ticker = get_ticker(currency, base_currency, market) | ||
151 | base_currency_price = asset_ticker["bidA"] * value | ||
152 | print(format_string.format( | ||
153 | indent, | ||
154 | formatted_price(value), | ||
155 | currency, | ||
156 | formatted_price(base_currency_price), | ||
157 | base_currency)) | ||
158 | |||
159 | def print_orders(current_assets, repartition_pertenthousand, market, base_currency="BTC"): | ||
160 | mouvements = compute_moves( | ||
161 | current_assets, | ||
162 | repartition_pertenthousand, | ||
163 | market, | ||
164 | base_currency=base_currency) | ||
165 | |||
166 | for currency, value in mouvements.items(): | ||
167 | action, rate, inverted = compute_order( | ||
168 | currency, | ||
169 | value, | ||
170 | market, | ||
171 | base_currency=base_currency) | ||
172 | if action is not None: | ||
173 | currency_price = int(value / rate) | ||
174 | |||
175 | if not inverted: | ||
176 | c1, c2 = [base_currency, currency] | ||
177 | v1, v2 = [value, currency_price] | ||
178 | else: | ||
179 | c1, c2 = [currency, base_currency] | ||
180 | v1, v2 = [currency_price, value] | ||
181 | |||
113 | print("need to {} {} {}'s worth of {}, i.e. {} {}".format( | 182 | print("need to {} {} {}'s worth of {}, i.e. {} {}".format( |
114 | action, | 183 | action, |
115 | formatted_price(abs(value)), | 184 | formatted_price(abs(v1)), c1, |
116 | base_currency, | 185 | c2, |
117 | currency, | 186 | formatted_price(abs(v2)), c2)) |
118 | formatted_price(abs(currency_price)), | ||
119 | currency)) | ||
120 | print("------------\nassets after repartition:") | ||
121 | for currency, value in new_repartition.items(): | ||
122 | print("holding {} {}".format(formatted_price(value), currency)) | ||
123 | 187 | ||
124 | current_assets = fetch_balances(market) | 188 | current_assets = fetch_balances(market) |
125 | give_orders(current_assets, repartition_pertenthousand, market) | 189 | print_orders(current_assets, repartition_pertenthousand, market) |