+ def retrieve_order(self):
+ symbol = "{}/{}".format(self.amount.currency, self.base_currency)
+ amount = round(self.amount, self.market.ccxt.order_precision(symbol)).value
+ start_timestamp = self.start_date.timestamp() - 5
+
+ similar_open_orders = self.market.ccxt.fetch_orders(symbol=symbol, since=start_timestamp)
+ for order in similar_open_orders:
+ if (order["info"]["margin"] == 1 and self.account == "exchange") or\
+ (order["info"]["margin"] != 1 and self.account == "margin"):
+ i_m_tested = True # coverage bug ?!
+ continue
+ if order["info"]["side"] != self.action:
+ continue
+ amount_diff = round(
+ abs(D(order["info"]["startingAmount"]) - amount),
+ self.market.ccxt.order_precision(symbol))
+ rate_diff = round(
+ abs(D(order["info"]["rate"]) - self.rate),
+ self.market.ccxt.order_precision(symbol))
+ if amount_diff != 0 or rate_diff != 0:
+ continue
+ self.results.append({"id": order["id"]})
+ 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):
+ continue
+ if any(x["side"] != self.action for x in trades):
+ continue
+ if any(x["info"]["category"] == "exchange" and self.account == "margin" for x in trades) or\
+ any(x["info"]["category"] == "marginTrade" and self.account == "exchange" for x in trades):
+ continue
+ trade_sum = sum(D(x["info"]["amount"]) for x in trades)
+ amount_diff = round(abs(trade_sum - amount),
+ self.market.ccxt.order_precision(symbol))
+ if amount_diff != 0:
+ continue
+ if (self.action == "sell" and any(D(x["info"]["rate"]) < self.rate for x in trades)) or\
+ (self.action == "buy" and any(D(x["info"]["rate"]) > self.rate for x in trades)):
+ continue
+ self.results.append({"id": order_id})
+ return True
+
+ return False
+