From 0dd3077eb5309dd92594c5843f34d2b4b30ffe6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Thu, 28 Aug 2025 18:05:44 -0300 Subject: [PATCH] better handling of concurrent safety orders changes in runtime --- .gitignore | 1 + trader.py | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index eacbdcc..0fed6b0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ logs/gateio.log logs/kucoin.log upload_testnet.sh upload_mainnet.sh +upload_local_testnet.sh utils/data/binance.db utils/data/okx.db utils/data/gateio.db diff --git a/trader.py b/trader.py index d0a6cda..3f9ccaa 100755 --- a/trader.py +++ b/trader.py @@ -34,6 +34,7 @@ class trader: self.low_price_cache = None self.mid_price_cache = None self.high_price_cache = None + self.concurrent_so_amount_cache = None if self.config.get_is_short(): #Check if there is an old_long file. If so, load it. @@ -1123,7 +1124,7 @@ class trader: if order["id"] not in open_orders_ids: filled_ids.append(order["id"]) - if filled_ids!=[]: #WRONG: Once all safety orders are filled, adding no_of_safety_orders won't result in sending new orders. + if filled_ids!=[]: 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)) @@ -1156,7 +1157,18 @@ class trader: self.status.save_to_file(is_backup=True) self.restart = True return 1 - + + #Should we send more safety orders without touching the TP order? + #Necessary check if we add to no_of_safety_orders or modify concurrent_safety_orders at runtime + max_concurrent_safety_orders = self.config.get_boosted_concurrent_safety_orders() if self.status.get_is_boosted() else self.config.get_concurrent_safety_orders() + condition_a = len(self.status.get_safety_orders())short) #Commented out because i'm not sure where this should go #if not self.config.get_is_short() and self.status.get_so_amount()==self.status.get_no_of_safety_orders() and self.config.get_autoswitch(): @@ -1517,8 +1529,9 @@ class trader: low_price = self.status.get_next_so_price() if self.status.get_next_so_price() is not None else 0 mid_price = self.status.get_price() if self.status.get_price() is not None else 0 high_price = self.status.get_take_profit_price() if self.status.get_take_profit_price() is not None else 0 + concurrent_so_amount = len(self.status.get_safety_orders()) - if low_price==self.low_price_cache and mid_price==self.mid_price_cache and high_price==self.high_price_cache: + if low_price==self.low_price_cache and mid_price==self.mid_price_cache and high_price==self.high_price_cache and concurrent_so_amount==self.concurrent_so_amount_cache: #Only modifies the uptime position = self.status.get_status_string().find("Uptime") new_uptime = self.seconds_to_time(self.status.get_deal_uptime()) @@ -1528,6 +1541,7 @@ class trader: self.low_price_cache = low_price self.mid_price_cache = mid_price self.high_price_cache = high_price + self.concurrent_so_amount_cache = concurrent_so_amount #Formatting low_boundary = '{:.20f}'.format(low_price)[:decimals].center(decimals) @@ -1588,7 +1602,7 @@ class trader: except Exception as e: print(e) - safety_order_string = f"{self.status.get_safety_orders_filled()}/{self.get_color('cyan')}{len(self.status.get_safety_orders())}{self.get_color('white')}/{self.status.get_no_of_safety_orders()}".rjust(27) + safety_order_string = f"{self.status.get_safety_orders_filled()}/{self.get_color('cyan')}{concurrent_so_amount}{self.get_color('white')}/{self.status.get_no_of_safety_orders()}".rjust(27) prices = f"{low_boundary_color}{low_boundary}{self.get_color('white')}|{price_color}{mid_boundary}{self.get_color('white')}|{target_price_color}{high_boundary}{self.get_color('white')}|{pct_color}{pct_to_profit_str}%{self.get_color('white')}" line1 = f"{p}{pair_color}{self.status.get_pair().center(13)}{self.get_color('white')}| {safety_order_string} |{prices}| Uptime: {self.seconds_to_time(self.status.get_deal_uptime())}" if self.status.get_is_boosted():