]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blobdiff - portfolio.py
Allow dispatch assets to receive liquidity
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / portfolio.py
index 17a17ba51e3c1672d4d174c1ba2f7872439bca4a..482d0da5d050fb466589f584ea617c61cd6e94df 100644 (file)
@@ -1,5 +1,5 @@
 import time
-from datetime import datetime
+from datetime import datetime, timedelta
 from decimal import Decimal as D, ROUND_DOWN
 # Put your poloniex api key in market.py
 from json import JSONDecodeError
@@ -14,12 +14,19 @@ class Portfolio:
     URL = "https://cryptoportfolio.io/wp-content/uploads/portfolio/json/cryptoportfolio.json"
     liquidities = {}
     data = None
+    last_date = None
 
     @classmethod
-    def repartition(cls, liquidity="medium"):
-        cls.parse_cryptoportfolio()
+    def wait_for_recent(cls, delta=4):
+        cls.repartition(refetch=True)
+        while cls.last_date is None or datetime.now() - cls.last_date > timedelta(delta):
+            time.sleep(30)
+            cls.repartition(refetch=True)
+
+    @classmethod
+    def repartition(cls, liquidity="medium", refetch=False):
+        cls.parse_cryptoportfolio(refetch=refetch)
         liquidities = cls.liquidities[liquidity]
-        cls.last_date = sorted(liquidities.keys())[-1]
         return liquidities[cls.last_date]
 
     @classmethod
@@ -34,8 +41,8 @@ class Portfolio:
             cls.data = None
 
     @classmethod
-    def parse_cryptoportfolio(cls):
-        if cls.data is None:
+    def parse_cryptoportfolio(cls, refetch=False):
+        if refetch or cls.data is None:
             cls.get_cryptoportfolio()
 
         def filter_weights(weight_hash):
@@ -57,7 +64,8 @@ class Portfolio:
             weights_hash = portfolio_hash["weights"]
             weights = {}
             for i in range(len(weights_hash["_row"])):
-                weights[weights_hash["_row"][i]] = dict(filter(
+                date = datetime.strptime(weights_hash["_row"][i], "%Y-%m-%d")
+                weights[date] = dict(filter(
                         filter_weights,
                         map(clean_weights(i), weights_hash.items())))
             return weights
@@ -69,6 +77,7 @@ class Portfolio:
                 "medium": medium_liquidity,
                 "high":   high_liquidity,
                 }
+        cls.last_date = max(max(medium_liquidity.keys()), max(high_liquidity.keys()))
 
 class Computation:
     computations = {
@@ -124,6 +133,8 @@ class Amount:
         return Amount(self.currency, abs(self.value))
 
     def __add__(self, other):
+        if other == 0:
+            return self
         if other.currency != self.currency and other.value * self.value != 0:
             raise Exception("Summing amounts must be done with same currencies")
         return Amount(self.currency, self.value + other.value)
@@ -141,6 +152,12 @@ class Amount:
             raise Exception("Summing amounts must be done with same currencies")
         return Amount(self.currency, self.value - other.value)
 
+    def __rsub__(self, other):
+        if other == 0:
+            return -self
+        else:
+            return -self.__sub__(other)
+
     def __mul__(self, value):
         if not isinstance(value, (int, float, D)):
             raise TypeError("Amount may only be multiplied by numbers")
@@ -328,6 +345,8 @@ class Trade:
             ticker = ticker["original"]
         rate = Computation.compute_value(ticker, self.order_action(inverted), compute_value=compute_value)
 
+        # FIXME: Dust amount should be removed from there if they werent
+        # honored in other sales
         delta_in_base = abs(self.value_from - self.value_to)
         # 9 BTC's worth of move (10 - 1 or 1 - 10 depending on case)