aboutsummaryrefslogtreecommitdiff
path: root/store.py
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-08 02:04:50 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2018-03-08 11:35:15 +0100
commitada1b5f109ebaa6f3adb7cd87b007c6db891811c (patch)
tree7b4b40d2c08f21793da62b1708c649ec72fe5bae /store.py
parenta18ce2f16973155c81f983643aba675f62dea7af (diff)
downloadTrader-ada1b5f109ebaa6f3adb7cd87b007c6db891811c.tar.gz
Trader-ada1b5f109ebaa6f3adb7cd87b007c6db891811c.tar.zst
Trader-ada1b5f109ebaa6f3adb7cd87b007c6db891811c.zip
Move Portfolio to store and cleanup methods
Make report stored in portfolio class instead of market
Diffstat (limited to 'store.py')
-rw-r--r--store.py85
1 files changed, 82 insertions, 3 deletions
diff --git a/store.py b/store.py
index d25dd35..78dfe2d 100644
--- a/store.py
+++ b/store.py
@@ -1,10 +1,14 @@
1import time
2import requests
1import portfolio 3import portfolio
2import simplejson as json 4import simplejson as json
3from decimal import Decimal as D, ROUND_DOWN 5from decimal import Decimal as D, ROUND_DOWN
4from datetime import date, datetime 6from datetime import date, datetime, timedelta
5import inspect 7import inspect
8from json import JSONDecodeError
9from simplejson.errors import JSONDecodeError as SimpleJSONDecodeError
6 10
7__all__ = ["BalanceStore", "ReportStore", "TradeStore"] 11__all__ = ["Portfolio", "BalanceStore", "ReportStore", "TradeStore"]
8 12
9class ReportStore: 13class ReportStore:
10 def __init__(self, market, verbose_print=True): 14 def __init__(self, market, verbose_print=True):
@@ -213,7 +217,7 @@ class BalanceStore:
213 217
214 def dispatch_assets(self, amount, liquidity="medium", repartition=None): 218 def dispatch_assets(self, amount, liquidity="medium", repartition=None):
215 if repartition is None: 219 if repartition is None:
216 repartition = portfolio.Portfolio.repartition(self.market, liquidity=liquidity) 220 repartition = Portfolio.repartition(liquidity=liquidity)
217 sum_ratio = sum([v[0] for k, v in repartition.items()]) 221 sum_ratio = sum([v[0] for k, v in repartition.items()])
218 amounts = {} 222 amounts = {}
219 for currency, (ptt, trade_type) in repartition.items(): 223 for currency, (ptt, trade_type) in repartition.items():
@@ -301,4 +305,79 @@ class TradeStore:
301 for order in self.all_orders(state="open"): 305 for order in self.all_orders(state="open"):
302 order.get_status() 306 order.get_status()
303 307
308class Portfolio:
309 URL = "https://cryptoportfolio.io/wp-content/uploads/portfolio/json/cryptoportfolio.json"
310 liquidities = {}
311 data = None
312 last_date = None
313 report = ReportStore(None)
314
315 @classmethod
316 def wait_for_recent(cls, delta=4):
317 cls.get_cryptoportfolio()
318 while cls.last_date is None or datetime.now() - cls.last_date > timedelta(delta):
319 time.sleep(30)
320 cls.report.print_log("Attempt to fetch up-to-date cryptoportfolio")
321 cls.get_cryptoportfolio(refetch=True)
322
323 @classmethod
324 def repartition(cls, liquidity="medium"):
325 cls.get_cryptoportfolio()
326 liquidities = cls.liquidities[liquidity]
327 return liquidities[cls.last_date]
328
329 @classmethod
330 def get_cryptoportfolio(cls, refetch=False):
331 if cls.data is not None and not refetch:
332 return
333 try:
334 r = requests.get(cls.URL)
335 cls.report.log_http_request(r.request.method,
336 r.request.url, r.request.body, r.request.headers, r)
337 except Exception as e:
338 cls.report.log_error("get_cryptoportfolio", exception=e)
339 return
340 try:
341 cls.data = r.json(parse_int=D, parse_float=D)
342 cls.parse_cryptoportfolio()
343 except (JSONDecodeError, SimpleJSONDecodeError):
344 cls.data = None
345 cls.liquidities = {}
346
347 @classmethod
348 def parse_cryptoportfolio(cls):
349 def filter_weights(weight_hash):
350 if weight_hash[1][0] == 0:
351 return False
352 if weight_hash[0] == "_row":
353 return False
354 return True
355
356 def clean_weights(i):
357 def clean_weights_(h):
358 if h[0].endswith("s"):
359 return [h[0][0:-1], (h[1][i], "short")]
360 else:
361 return [h[0], (h[1][i], "long")]
362 return clean_weights_
363
364 def parse_weights(portfolio_hash):
365 weights_hash = portfolio_hash["weights"]
366 weights = {}
367 for i in range(len(weights_hash["_row"])):
368 date = datetime.strptime(weights_hash["_row"][i], "%Y-%m-%d")
369 weights[date] = dict(filter(
370 filter_weights,
371 map(clean_weights(i), weights_hash.items())))
372 return weights
373
374 high_liquidity = parse_weights(cls.data["portfolio_1"])
375 medium_liquidity = parse_weights(cls.data["portfolio_2"])
376
377 cls.liquidities = {
378 "medium": medium_liquidity,
379 "high": high_liquidity,
380 }
381 cls.last_date = max(max(medium_liquidity.keys()), max(high_liquidity.keys()))
382
304 383