From 3a4ce2311e6cfbbe31bcce1b8d515ea9344d072a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Wed, 27 Aug 2025 15:56:15 -0300 Subject: [PATCH] safety order batch send mostly done --- exchange_wrapper.py | 34 ++++++++++++++++++++++++++++++++++ trader.py | 26 +++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/exchange_wrapper.py b/exchange_wrapper.py index 62db603..22fb3b9 100755 --- a/exchange_wrapper.py +++ b/exchange_wrapper.py @@ -864,6 +864,40 @@ class Broker: return "the lowest price limit for sell orders is" in str(error_object).lower() + def new_limit_orders(self, orders: list) -> list: + sent_orders = [] + #Send the orders + tries = self.retries + while tries>=0: + try: + sent_orders = self.exchange.create_orders(orders) + except Exception as e: + self.logger.log_this(f"Exception while sending safety orders: {e}",1) + tries-=1 + time.sleep(self.wait_time) + if tries==0: + return [] + + #Retrieve the orders from the exchange by id to confirm that they were sent + #Specially for OKX, since the orders that create_orders return are empty (only id is present) + returned_orders = [] + for order in sent_orders: + tries = self.retries + while tries>=0: + try: + returned_orders.append(self.get_order(order["id"],order["symbol"])) + time.sleep(self.wait_time) + except Exception as e: + self.logger.log_this(f"Exception while retrieving safety orders: {e}",1) + tries-=1 + if tries==0: + if self.get_exchange_name()=="okex": + return returned_orders + returned_orders.append(order) #In the case of the other exchanges, we just assume that the order was sent and append it. + time.sleep(self.wait_time) + return returned_orders + + def new_limit_order(self,symbol,size,side,price,no_retries=False): ''' Sends a new limit order. diff --git a/trader.py b/trader.py index e3c6a33..e6f7eb6 100755 --- a/trader.py +++ b/trader.py @@ -831,7 +831,31 @@ class trader: orders_to_place = min(self.status.get_no_of_safety_orders()-self.status.get_so_amount(),amount) if orders_to_place<1: return 0 + orders_placed = 0 + # if self.broker.get_exchange_name()!="binance": #Binance does not support sending multiple orders at once in Spot. + # self.broker.logger.log_this(f"Sending {orders_to_place} safety orders",2,self.status.get_pair()) + # orders_to_send = [] + # for i in range(orders_to_place): + # order_index = self.status.get_so_amount()+i+1 + # so_size = self.gib_so_size(self.status.get_order_size(),order_index,self.config.get_safety_order_scale()) + # if self.config.get_is_short(): + # orders_to_send.append({"symbol": self.status.get_pair(), + # "type": "limit", + # "side": "sell", + # "amount": so_size, + # "price": self.status.get_safety_price_table()[order_index]}) + # else: + # orders_to_send.append({"symbol": self.status.get_pair(), + # "type": "limit", + # "side": "buy", + # "amount": so_size/self.status.get_safety_price_table()[order_index], + # "price": self.status.get_safety_price_table()[order_index]}) + # sent_orders = self.broker.new_limit_orders(orders_to_send) + # self.status.set_so_amount(self.status.get_so_amount()+len(sent_orders)) + # for item in sent_orders: + # self.status.add_safety_order(item) + # else: for i in range(orders_to_place): self.broker.logger.log_this(f"Sending a new safety order ({i+1}/{orders_to_place})",2,self.status.get_pair()) so_size = self.gib_so_size(self.status.get_order_size(),self.status.get_so_amount()+1,self.config.get_safety_order_scale()) @@ -911,7 +935,7 @@ class trader: self.status.set_base_bought(self.status.get_base_bought() - old_tp_order["filled"] - self.parse_fees(old_tp_order)[0]) self.status.set_quote_spent(self.status.get_quote_spent() - old_tp_order["cost"]) self.status.set_fees_paid_in_quote(self.status.get_fees_paid_in_quote() + self.parse_fees(old_tp_order)[1]) - #self.status.set_fees_paid_in_base(self.status.get_fees_paid_in_base() + self.parse_fees(old_tp_order)[0]) + self.status.set_fees_paid_in_base(self.status.get_fees_paid_in_base() + self.parse_fees(old_tp_order)[0]) #Cooldown time.sleep(self.broker.get_wait_before_new_safety_order())