safety order batch send mostly done

This commit is contained in:
Nicolás Sánchez 2025-08-27 15:56:15 -03:00
parent 2e35ea9c13
commit 3a4ce2311e
2 changed files with 59 additions and 1 deletions

View File

@ -864,6 +864,40 @@ class Broker:
return "the lowest price limit for sell orders is" in str(error_object).lower() 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): def new_limit_order(self,symbol,size,side,price,no_retries=False):
''' '''
Sends a new limit order. Sends a new limit order.

View File

@ -831,7 +831,31 @@ class trader:
orders_to_place = min(self.status.get_no_of_safety_orders()-self.status.get_so_amount(),amount) orders_to_place = min(self.status.get_no_of_safety_orders()-self.status.get_so_amount(),amount)
if orders_to_place<1: if orders_to_place<1:
return 0 return 0
orders_placed = 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): 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()) 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()) 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_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_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_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 #Cooldown
time.sleep(self.broker.get_wait_before_new_safety_order()) time.sleep(self.broker.get_wait_before_new_safety_order())