X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FTrader.git;a=blobdiff_plain;f=store.py;fp=store.py;h=f987bb9c036b9d6b3bbf63878a43123168514323;hp=5533759a2f766159b6d098f77bffd7fa4eedd34f;hb=a4bb44d8bc27af7c57f439ffd9edca51c2f0afb4;hpb=3dc533684a76883c33c39c615080e5f0ae5126a0 diff --git a/store.py b/store.py index 5533759..f987bb9 100644 --- a/store.py +++ b/store.py @@ -499,13 +499,32 @@ class Portfolio: worker_started = False worker_notify = None callback = None + poll_started_at = None @classmethod - def start_worker(cls, poll=30): + def next_wait_time(cls): + now = datetime.datetime.now() + if cls.poll_started_at is None: + cls.poll_started_at = now + delta = now - cls.poll_started_at + + if delta < datetime.timedelta(minutes=30): + return 30 + elif delta < datetime.timedelta(hours=1): + return 60 + elif delta < datetime.timedelta(hours=4): + return 5*60 + elif delta < datetime.timedelta(days=1): + return 60*60 + else: + raise "Too long waiting" + + @classmethod + def start_worker(cls): import threading cls.worker = threading.Thread(name="portfolio", daemon=True, - target=cls.wait_for_notification, kwargs={"poll": poll}) + target=cls.wait_for_notification) cls.worker_notify = threading.Event() cls.callback = threading.Event() @@ -526,7 +545,7 @@ class Portfolio: return cls.worker == threading.current_thread() @classmethod - def wait_for_notification(cls, poll=30): + def wait_for_notification(cls): if not cls.is_worker_thread(): raise RuntimeError("This method needs to be ran with the worker") while cls.worker_started: @@ -536,7 +555,7 @@ class Portfolio: cls.report.print_log("[Worker] Fetching cryptoportfolio") cls.get_cryptoportfolio(refetch=True) cls.callback.set() - time.sleep(poll) + time.sleep(cls.next_wait_time()) @classmethod def stop_worker(cls): @@ -550,11 +569,11 @@ class Portfolio: cls.callback.wait() @classmethod - def wait_for_recent(cls, delta=4, poll=30): + def wait_for_recent(cls, delta=4): cls.get_cryptoportfolio() while cls.last_date.get() is None or datetime.datetime.now() - cls.last_date.get() > datetime.timedelta(delta): if cls.worker is None: - time.sleep(poll) + time.sleep(cls.next_wait_time()) cls.report.print_log("Attempt to fetch up-to-date cryptoportfolio") cls.get_cryptoportfolio(refetch=True) @@ -585,7 +604,7 @@ class Portfolio: cls.data.set(r.json(parse_int=D, parse_float=D)) cls.parse_cryptoportfolio() cls.store_cryptoportfolio() - except (JSONDecodeError, SimpleJSONDecodeError): + except (AssertionError, JSONDecodeError, SimpleJSONDecodeError): cls.data.set(None) cls.last_date.set(None) cls.liquidities.set({}) @@ -648,6 +667,8 @@ class Portfolio: high_liquidity = parse_weights(cls.data.get("portfolio_1")) medium_liquidity = parse_weights(cls.data.get("portfolio_2")) + assert len(high_liquidity) > 0 + assert len(medium_liquidity) > 0 cls.liquidities.set({ "medium": medium_liquidity, "high": high_liquidity,