aboutsummaryrefslogtreecommitdiff
path: root/helper.py
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-02 13:59:25 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-02 14:08:00 +0100
commit9db7d156833cd384baa64b6148b5c646bfcc41f8 (patch)
treed451957ff1d7f0473db6c15d1baa5a56e973832c /helper.py
parent7bd830a83b662874c145ea9548edfde79eadc68f (diff)
downloadTrader-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.py189
1 files changed, 148 insertions, 41 deletions
diff --git a/helper.py b/helper.py
index be480e2..f14fd58 100644
--- a/helper.py
+++ b/helper.py
@@ -127,10 +127,9 @@ def main_fetch_markets(pg_config, user):
127def main_process_market(user_market, actions, before=False, after=False): 127def 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
162class 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
163def process_sell_needed__1_sell(market, liquidity="medium", base_currency="BTC"): 298def 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
173def process_sell_needed__2_buy(market, liquidity="medium", base_currency="BTC"): 302def 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
184def process_sell_all__1_all_sell(market, base_currency="BTC", liquidity="medium"): 306def 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
194def process_sell_all__2_wait(market, liquidity="medium", base_currency="BTC"): 310def 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
199def process_sell_all__3_all_buy(market, base_currency="BTC", liquidity="medium"): 314def 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