from decimal import Decimal as D, ROUND_DOWN
from json import JSONDecodeError
from simplejson.errors import JSONDecodeError as SimpleJSONDecodeError
-from ccxt import ExchangeError, InsufficientFunds, ExchangeNotAvailable, InvalidOrder, OrderNotCached
+from ccxt import ExchangeError, InsufficientFunds, ExchangeNotAvailable, InvalidOrder, OrderNotCached, OrderNotFound
from retry import retry
import requests
return not (self.is_fullfiled or self.closed)
def close(self):
+ for order in self.orders:
+ order.cancel()
self.closed = True
@property
}
def __repr__(self):
- return "Trade({} -> {} in {}, {})".format(
+ if self.closed and not self.is_fullfiled:
+ closed = " ❌"
+ elif self.is_fullfiled:
+ closed = " ✔"
+ else:
+ closed = ""
+
+ return "Trade({} -> {} in {}, {}{})".format(
self.value_from,
self.value_to,
self.currency,
- self.action)
+ self.action,
+ closed)
def print_with_order(self, ind=""):
self.market.report.print_log("{}{}".format(ind, self))
self.market.report.log_debug_action("Fetching {}".format(self))
return
try:
- result = self.market.ccxt.fetch_order(self.id, symbol=self.amount.currency)
+ result = self.market.ccxt.fetch_order(self.id)
self.results.append(result)
self.status = result["status"]
# Time at which the order started
self.market.report.log_debug_action("Mark {} as cancelled".format(self))
self.status = "canceled"
return
- self.market.ccxt.cancel_order(self.id)
- self.fetch()
+ if self.open and self.id is not None:
+ try:
+ self.market.ccxt.cancel_order(self.id)
+ except OrderNotFound as e: # Closed inbetween
+ self.market.report.log_error("cancel_order", message="Already cancelled order", exception=e)
+ self.fetch()
class Mouvement:
def __init__(self, currency, base_currency, hash_):