diff options
author | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-03-02 13:59:25 +0100 |
---|---|---|
committer | Ismaël Bouya <ismael.bouya@normalesup.org> | 2018-03-02 14:08:00 +0100 |
commit | 9db7d156833cd384baa64b6148b5c646bfcc41f8 (patch) | |
tree | d451957ff1d7f0473db6c15d1baa5a56e973832c /helper.py | |
parent | 7bd830a83b662874c145ea9548edfde79eadc68f (diff) | |
download | Trader-9db7d156833cd384baa64b6148b5c646bfcc41f8.tar.gz Trader-9db7d156833cd384baa64b6148b5c646bfcc41f8.tar.zst Trader-9db7d156833cd384baa64b6148b5c646bfcc41f8.zip |
Add processors
Fixes https://git.immae.eu/mantisbt/view.php?id=45
Diffstat (limited to 'helper.py')
-rw-r--r-- | helper.py | 189 |
1 files changed, 148 insertions, 41 deletions
@@ -127,10 +127,9 @@ def main_fetch_markets(pg_config, user): | |||
127 | def main_process_market(user_market, actions, before=False, after=False): | 127 | def main_process_market(user_market, actions, before=False, after=False): |
128 | if len(actions or []) == 0: | 128 | if len(actions or []) == 0: |
129 | if before: | 129 | if before: |
130 | process_sell_all__1_all_sell(user_market) | 130 | Processor(user_market).process("sell_all", steps="before") |
131 | if after: | 131 | if after: |
132 | process_sell_all__2_wait(user_market) | 132 | Processor(user_market).process("sell_all", steps="after") |
133 | process_sell_all__3_all_buy(user_market) | ||
134 | else: | 133 | else: |
135 | for action in actions: | 134 | for action in actions: |
136 | if action in globals(): | 135 | if action in globals(): |
@@ -160,51 +159,159 @@ def print_balances(market, base_currency="BTC"): | |||
160 | market.report.print_log("total:") | 159 | market.report.print_log("total:") |
161 | market.report.print_log(sum(market.balances.in_currency(base_currency).values())) | 160 | market.report.print_log(sum(market.balances.in_currency(base_currency).values())) |
162 | 161 | ||
162 | class Processor: | ||
163 | scenarios = { | ||
164 | "sell_needed": [ | ||
165 | { | ||
166 | "name": "wait", | ||
167 | "number": 0, | ||
168 | "before": False, | ||
169 | "after": True, | ||
170 | "wait_for_recent": {}, | ||
171 | }, | ||
172 | { | ||
173 | "name": "sell", | ||
174 | "number": 1, | ||
175 | "before": False, | ||
176 | "after": True, | ||
177 | "fetch_balances": ["begin", "end"], | ||
178 | "prepare_trades": {}, | ||
179 | "prepare_orders": { "only": "dispose", "compute_value": "average" }, | ||
180 | "run_orders": {}, | ||
181 | "follow_orders": {}, | ||
182 | }, | ||
183 | { | ||
184 | "name": "buy", | ||
185 | "number": 2, | ||
186 | "before": False, | ||
187 | "after": True, | ||
188 | "fetch_balances": ["begin", "end"], | ||
189 | "prepare_trades": { "only": "acquire" }, | ||
190 | "prepare_orders": { "only": "acquire", "compute_value": "average" }, | ||
191 | "move_balances": {}, | ||
192 | "run_orders": {}, | ||
193 | "follow_orders": {}, | ||
194 | }, | ||
195 | ], | ||
196 | "sell_all": [ | ||
197 | { | ||
198 | "name": "all_sell", | ||
199 | "number": 1, | ||
200 | "before": True, | ||
201 | "after": False, | ||
202 | "fetch_balances": ["begin", "end"], | ||
203 | "prepare_trades": { "repartition": { "BTC": (1, "long") } }, | ||
204 | "prepare_orders": { "compute_value": "average" }, | ||
205 | "run_orders": {}, | ||
206 | "follow_orders": {}, | ||
207 | }, | ||
208 | { | ||
209 | "name": "wait", | ||
210 | "number": 2, | ||
211 | "before": False, | ||
212 | "after": True, | ||
213 | "wait_for_recent": {}, | ||
214 | }, | ||
215 | { | ||
216 | "name": "all_buy", | ||
217 | "number": 3, | ||
218 | "before": False, | ||
219 | "after": True, | ||
220 | "fetch_balances": ["begin", "end"], | ||
221 | "prepare_trades": {}, | ||
222 | "prepare_orders": { "compute_value": "average" }, | ||
223 | "move_balances": {}, | ||
224 | "run_orders": {}, | ||
225 | "follow_orders": {}, | ||
226 | }, | ||
227 | ] | ||
228 | } | ||
229 | |||
230 | allowed_arguments = { | ||
231 | "wait_for_recent": ["delta"], | ||
232 | "prepare_trades": ["base_currency", "liquidity", "compute_value", "repartition", "only"], | ||
233 | "prepare_orders": ["only", "compute_value"], | ||
234 | "move_balances": [], | ||
235 | "run_orders": [], | ||
236 | "follow_orders": ["sleep"], | ||
237 | } | ||
238 | |||
239 | def __init__(self, market): | ||
240 | self.market = market | ||
241 | |||
242 | def select_steps(self, scenario, step): | ||
243 | if step == "all": | ||
244 | return scenario | ||
245 | elif step == "before" or step == "after": | ||
246 | return list(filter(lambda x: step in x and x[step], scenario)) | ||
247 | elif type(step) == int: | ||
248 | return [scenario[step-1]] | ||
249 | elif type(step) == str: | ||
250 | return list(filter(lambda x: x["name"] == step, scenario)) | ||
251 | else: | ||
252 | raise TypeError("Unknown step {}".format(step)) | ||
253 | |||
254 | def process(self, scenario_name, steps="all", **kwargs): | ||
255 | scenario = self.scenarios[scenario_name] | ||
256 | selected_steps = [] | ||
257 | |||
258 | if type(steps) == str or type(steps) == int: | ||
259 | selected_steps += self.select_steps(scenario, steps) | ||
260 | else: | ||
261 | for step in steps: | ||
262 | selected_steps += self.select_steps(scenario, step) | ||
263 | for step in selected_steps: | ||
264 | self.process_step(scenario_name, step, **kwargs) | ||
265 | |||
266 | def process_step(self, scenario_name, step, **kwargs): | ||
267 | process_name = "process_{}__{}_{}".format(scenario_name, step["number"], step["name"]) | ||
268 | self.market.report.log_stage("{}_begin".format(process_name)) | ||
269 | if "begin" in step.get("fetch_balances", []): | ||
270 | self.market.balances.fetch_balances(tag="{}_begin".format(process_name)) | ||
271 | |||
272 | for action in ["wait_for_recent", "prepare_trades", | ||
273 | "prepare_orders", "move_balances", "run_orders", | ||
274 | "follow_orders"]: | ||
275 | if action in step: | ||
276 | self.run_action(action, step[action], **kwargs) | ||
277 | |||
278 | if "end" in step.get("fetch_balances", []): | ||
279 | self.market.balances.fetch_balances(tag="{}_end".format(process_name)) | ||
280 | self.market.report.log_stage("{}_end".format(process_name)) | ||
281 | |||
282 | def run_action(self, action, default_args, **kwargs): | ||
283 | args = {k: v for k, v in {**default_args, **kwargs}.items() if k in self.allowed_arguments[action] } | ||
284 | |||
285 | if action == "wait_for_recent": | ||
286 | portfolio.Portfolio.wait_for_recent(self.market, **args) | ||
287 | if action == "prepare_trades": | ||
288 | self.market.prepare_trades(**args) | ||
289 | if action == "prepare_orders": | ||
290 | self.market.trades.prepare_orders(**args) | ||
291 | if action == "move_balances": | ||
292 | self.market.move_balances(**args) | ||
293 | if action == "run_orders": | ||
294 | self.market.trades.run_orders(**args) | ||
295 | if action == "follow_orders": | ||
296 | self.market.follow_orders(**args) | ||
297 | |||
163 | def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"): | 298 | def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"): |
164 | market.report.log_stage("process_sell_needed__1_sell_begin") | 299 | Processor(market).process("sell_needed", steps="sell", |
165 | market.balances.fetch_balances(tag="process_sell_needed__1_sell_begin") | 300 | liquidity=liquidity, base_currency=base_currency) |
166 | market.prepare_trades(liquidity=liquidity, base_currency=base_currency) | ||
167 | market.trades.prepare_orders(compute_value="average", only="dispose") | ||
168 | market.trades.run_orders() | ||
169 | market.follow_orders() | ||
170 | market.balances.fetch_balances(tag="process_sell_needed__1_sell_end") | ||
171 | market.report.log_stage("process_sell_needed__1_sell_end") | ||
172 | 301 | ||
173 | def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"): | 302 | def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"): |
174 | market.report.log_stage("process_sell_needed__2_buy_begin") | 303 | Processor(market).process("sell_needed", steps="buy", |
175 | market.balances.fetch_balances(tag="process_sell_needed__2_buy_begin") | 304 | liquidity=liquidity, base_currency=base_currency) |
176 | market.prepare_trades(base_currency=base_currency, liquidity=liquidity, only="acquire") | ||
177 | market.trades.prepare_orders(compute_value="average", only="acquire") | ||
178 | market.move_balances() | ||
179 | market.trades.run_orders() | ||
180 | market.follow_orders() | ||
181 | market.balances.fetch_balances(tag="process_sell_needed__2_buy_end") | ||
182 | market.report.log_stage("process_sell_needed__2_buy_end") | ||
183 | 305 | ||
184 | def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"): | 306 | def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"): |
185 | market.report.log_stage("process_sell_all__1_all_sell_begin") | 307 | Processor(market).process("sell_all", steps="all_sell", |
186 | market.balances.fetch_balances(tag="process_sell_all__1_all_sell_begin") | 308 | liquidity=liquidity, base_currency=base_currency) |
187 | market.prepare_trades_to_sell_all(base_currency=base_currency) | ||
188 | market.trades.prepare_orders(compute_value="average") | ||
189 | market.trades.run_orders() | ||
190 | market.follow_orders() | ||
191 | market.balances.fetch_balances(tag="process_sell_all__1_all_sell_end") | ||
192 | market.report.log_stage("process_sell_all__1_all_sell_end") | ||
193 | 309 | ||
194 | def process_sell_all__2_wait(market, liquidity="medium", base_currency="BTC"): | 310 | def process_sell_all__2_wait(market, liquidity="medium", base_currency="BTC"): |
195 | market.report.log_stage("process_sell_all__2_wait_begin") | 311 | Processor(market).process("sell_all", steps="wait", |
196 | portfolio.Portfolio.wait_for_recent(market) | 312 | liquidity=liquidity, base_currency=base_currency) |
197 | market.report.log_stage("process_sell_all__2_wait_end") | ||
198 | 313 | ||
199 | def process_sell_all__3_all_buy(market, base_currency="BTC", liquidity="medium"): | 314 | def process_sell_all__3_all_buy(market, base_currency="BTC", liquidity="medium"): |
200 | market.report.log_stage("process_sell_all__3_all_buy_begin") | 315 | Processor(market).process("sell_all", steps="all_buy", |
201 | market.balances.fetch_balances(tag="process_sell_all__3_all_buy_begin") | 316 | liquidity=liquidity, base_currency=base_currency) |
202 | market.prepare_trades(liquidity=liquidity, base_currency=base_currency) | ||
203 | market.trades.prepare_orders(compute_value="average") | ||
204 | market.move_balances() | ||
205 | market.trades.run_orders() | ||
206 | market.follow_orders() | ||
207 | market.balances.fetch_balances(tag="process_sell_all__3_all_buy_end") | ||
208 | market.report.log_stage("process_sell_all__3_all_buy_end") | ||
209 | |||
210 | 317 | ||