]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blobdiff - portfolio.py
Add missing amount operations
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / portfolio.py
index e98689ee4c2599fc63f77b6236057e9df0b2519e..21a98342f15fa03ba7753be2a69579bda16cd7c9 100644 (file)
@@ -3,6 +3,7 @@ from datetime import datetime
 from decimal import Decimal as D, ROUND_DOWN
 # Put your poloniex api key in market.py
 from json import JSONDecodeError
+from ccxt import ExchangeError, ExchangeNotAvailable
 import requests
 import helper as h
 from store import *
@@ -123,6 +124,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)
@@ -140,6 +143,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")
@@ -463,6 +472,11 @@ class Order:
         else:
             try:
                 self.results.append(self.market.create_order(symbol, 'limit', self.action, amount, price=self.rate, account=self.account))
+            except ExchangeNotAvailable:
+                # Impossible to honor the order (dust amount)
+                self.status = "closed"
+                self.mark_finished_order()
+                return
             except Exception as e:
                 self.status = "error"
                 print("error when running market.create_order('{}', 'limit', '{}', {}, price={}, account={})".format(
@@ -526,7 +540,10 @@ class Order:
         return filled_amount
 
     def fetch_mouvements(self):
-        mouvements = self.market.privatePostReturnOrderTrades({"orderNumber": self.id})
+        try:
+            mouvements = self.market.privatePostReturnOrderTrades({"orderNumber": self.id})
+        except ExchangeError:
+            mouvements = []
         self.mouvements = []
 
         for mouvement_hash in mouvements:
@@ -544,14 +561,17 @@ class Mouvement:
     def __init__(self, currency, base_currency, hash_):
         self.currency = currency
         self.base_currency = base_currency
-        self.id = hash_["id"]
-        self.action = hash_["type"]
-        self.fee_rate = D(hash_["fee"])
-        self.date = datetime.strptime(hash_["date"], '%Y-%m-%d %H:%M:%S')
-        self.rate = D(hash_["rate"])
-        self.total = Amount(currency, hash_["amount"])
+        self.id = hash_.get("tradeID")
+        self.action = hash_.get("type")
+        self.fee_rate = D(hash_.get("fee", -1))
+        try:
+            self.date = datetime.strptime(hash_.get("date", ""), '%Y-%m-%d %H:%M:%S')
+        except ValueError:
+            self.date = None
+        self.rate = D(hash_.get("rate", 0))
+        self.total = Amount(currency, hash_.get("amount", 0))
         # rate * total = total_in_base
-        self.total_in_base = Amount(base_currency, hash_["total"])
+        self.total_in_base = Amount(base_currency, hash_.get("total", 0))
 
 if __name__ == '__main__': # pragma: no cover
     from market import market