]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git/blobdiff - portfolio.py
Don’t close dust remaining orders before end of trade.
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Trader.git] / portfolio.py
index 535aaa843c22789dacc50d9eaf3a2371e6766297..c064249af992bcd46a9f5e41f47cd3c1c5fff724 100644 (file)
@@ -1,4 +1,4 @@
-from datetime import datetime
+import datetime
 from retry import retry
 from decimal import Decimal as D, ROUND_DOWN
 from ccxt import ExchangeError, InsufficientFunds, ExchangeNotAvailable, InvalidOrder, OrderNotCached, OrderNotFound, RequestTimeout, InvalidNonce
@@ -311,13 +311,15 @@ class Trade:
         if self.action is None:
             return None
         ticker = self.market.get_ticker(self.currency, self.base_currency)
+        if ticker is None:
+            self.market.report.log_error("prepare_order",
+                    message="Unknown ticker {}/{}".format(self.currency, self.base_currency))
+            return None
         self.inverted = ticker["inverted"]
         if self.inverted:
             ticker = ticker["original"]
         rate = Computation.compute_value(ticker, self.order_action(), compute_value=compute_value)
 
-        # FIXME: Dust amount should be removed from there if they werent
-        # honored in other sales
         delta_in_base = abs(self.delta)
         # 9 BTC's worth of move (10 - 1 or 1 - 10 depending on case)
 
@@ -492,7 +494,7 @@ class Order:
             self.market.report.log_debug_action(action)
             self.results.append({"debug": True, "id": -1})
         else:
-            self.start_date = datetime.now()
+            self.start_date = datetime.datetime.now()
             try:
                 self.results.append(self.market.ccxt.create_order(symbol, 'limit', self.action, amount, price=self.rate, account=self.account))
             except InvalidOrder:
@@ -576,12 +578,12 @@ class Order:
         self.fetch_mouvements()
 
         self.mark_disappeared_order()
-
+        self.mark_dust_amount_remaining_order()
         self.mark_finished_order()
-        # FIXME: consider open order with dust remaining as closed
 
-    def dust_amount_remaining(self):
-        return self.remaining_amount() < Amount(self.amount.currency, D("0.001"))
+    def mark_dust_amount_remaining_order(self):
+        if self.market.ccxt.is_dust_trade(self.remaining_amount().value, self.rate):
+            self.status = "closed_dust_remaining"
 
     def remaining_amount(self):
         return self.amount - self.filled_amount()
@@ -646,7 +648,6 @@ class Order:
             return True
 
         similar_trades = self.market.ccxt.fetch_my_trades(symbol=symbol, since=start_timestamp)
-        # FIXME: use set instead of sorted(list(...))
         for order_id in sorted(list(map(lambda x: x["order"], similar_trades))):
             trades = list(filter(lambda x: x["order"] == order_id, similar_trades))
             if any(x["timestamp"] < start_timestamp for x in trades):
@@ -677,7 +678,7 @@ class Mouvement:
         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')
+            self.date = datetime.datetime.strptime(hash_.get("date", ""), '%Y-%m-%d %H:%M:%S')
         except ValueError:
             self.date = None
         self.rate = D(hash_.get("rate", 0))