From 16e1994ed1731dda972f7d0ae7180c7a7c5112e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Thu, 28 Aug 2025 10:18:12 -0300 Subject: [PATCH] empty_order handling --- main.py | 2 +- todo.txt | 1 + trader.py | 15 +++++++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index b826cbb..037bf2c 100644 --- a/main.py +++ b/main.py @@ -18,7 +18,7 @@ import exchange_wrapper import trader -version = "2025.08.27" +version = "2025.08.28" ''' Color definitions. If you want to change them, check the reference at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors diff --git a/todo.txt b/todo.txt index 5522512..6b2a5b9 100755 --- a/todo.txt +++ b/todo.txt @@ -8,6 +8,7 @@ Mandatory: 4. Implement api key hashing. 5. Dockerize. 6. Inspect orderbook liquidity prior to changing mode from short to long (big sell market order needs to have liquidity). +7. When autoswitching to long, instead of using a big market order, the last safety order should be a sell order of all the available funds. Would be nice to have: diff --git a/trader.py b/trader.py index 7113afa..d0a6cda 100755 --- a/trader.py +++ b/trader.py @@ -865,10 +865,16 @@ class trader: new_order = self.broker.new_limit_order(self.status.get_pair(),so_size/self.status.get_safety_price_table()[self.status.get_so_amount()+1],"buy",self.status.get_safety_price_table()[self.status.get_so_amount()+1]) if new_order==1: self.broker.logger.log_this("Not enough balance to send a new safety order",1,self.status.get_pair()) + self.status.set_no_of_safety_orders(self.status.get_so_amount()) #To avoid sending more safety orders, no_of_safety_order can be later modified manually. return orders_placed elif new_order is None: self.broker.logger.log_this("new_limit_order returned None",1,self.status.get_pair()) + self.status.set_no_of_safety_orders(self.status.get_so_amount()) #To avoid sending more safety orders, no_of_safety_order can be later modified manually. return orders_placed + elif new_order==self.broker.get_empty_order(): + self.broker.logger.log_this("new_limit_order returned an empty order",1,self.status.get_pair()) + self.status.set_no_of_safety_orders(self.status.get_so_amount()) #To avoid sending more safety orders, no_of_safety_order can be later modified manually. + return orders_placed orders_placed+=1 self.status.add_safety_order(new_order) self.status.set_so_amount(self.status.get_so_amount()+1) @@ -1116,8 +1122,8 @@ class trader: for order in self.status.get_safety_orders(): if order["id"] not in open_orders_ids: filled_ids.append(order["id"]) - - if filled_ids!=[]: + + if filled_ids!=[]: #WRONG: Once all safety orders are filled, adding no_of_safety_orders won't result in sending new orders. closed_orders = self.broker.get_closed_orders(self.status.get_pair()) filled_orders = [item for item in closed_orders if item["id"] in filled_ids and item["status"]=="closed"] #maybe item["status"] in ["closed", "canceled", ""]? self.status.set_safety_orders_filled(self.status.get_safety_orders_filled()+len(filled_orders)) @@ -1626,8 +1632,9 @@ class trader: self.quit = True return 1 - #MIGRATION: ONCE MIGRATION IS DONE, REMOVE THIS LINE - #self.status.set_safety_orders([self.status.status_dictionary["safety_order"]]) + #MIGRATION: ONCE MIGRATION IS DONE, REMOVE THESE LINES + #if self.status.status_dictionary["safety_order"]["id"]!="": + # self.status.set_safety_orders([self.status.status_dictionary["safety_order"]]) #Done self.pause = False