From a19cf0271c46c127698ff2d7d718e926bbaf5a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20S=C3=A1nchez?= Date: Wed, 19 Mar 2025 16:04:06 -0300 Subject: [PATCH] imported_trader now takes order ids --- changelog.txt | 3 +++ main.py | 20 +++++++++++++------- trader.py | 12 +++++++----- utils/commander.py | 9 ++++++++- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/changelog.txt b/changelog.txt index e4caf69..2ffcb1a 100755 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +2025.03.19: +. Added the possibility to force specific orders when importing a trader. + 2025.03.07: . Error fix in take_profit_routine. diff --git a/main.py b/main.py index bd43ca6..bd294bd 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,7 @@ import exchange_wrapper import trader -version = "2025.03.07" +version = "2025.03.19" ''' Color definitions. If you want to change them, check the reference at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors @@ -72,7 +72,7 @@ def time_to_unix(year: str, month: str, day: str) -> int: return 0 -def import_instance(base: str, quote: str) -> int: +def import_instance(base: str, quote: str, forced_tp_id = None, forced_so_id = None) -> int: ''' Imports an previously running trader instance from the status file. @@ -84,7 +84,7 @@ def import_instance(base: str, quote: str) -> int: int: 0 if successful ''' broker.logger.log_this(f"Importing {base}/{quote}") - instances_to_add.append(trader.trader(broker,f"{base}/{quote}",is_import=True)) + instances_to_add.append(trader.trader(broker,f"{base}/{quote}",is_import=True,forced_tp_id=forced_tp_id,forced_so_id=forced_so_id)) if f"{base}{quote}" not in tickers: tickers.append(f"{base}{quote}") return 0 @@ -630,6 +630,8 @@ def import_pair(): Parameters: base: str quote: str + forced_tp_id: str + forced_so_id: str ''' if "X-API-KEY" in request.headers and request.headers.get("X-API-KEY") in valid_keys: @@ -638,8 +640,10 @@ def import_pair(): return jsonify({'Error': 'request.json is None'}) data = request.json base = data["base"] - quote = data["quote"] - return unwrapped_import_pair(base,quote) + quote = data["quote"] + forced_tp_id = data["forced_tp_id"] if "forced_tp_id" in data else None + forced_so_id = data["forced_so_id"] if "forced_so_id" in data else None + return unwrapped_import_pair(base,quote,forced_tp_id,forced_so_id) except Exception as e: print(e) return jsonify({'Error': 'Halp'}) @@ -1389,20 +1393,22 @@ def unwrapped_restart_pair(base,quote): return jsonify({"Error": "Halp"}) -def unwrapped_import_pair(base,quote): +def unwrapped_import_pair(base,quote,forced_tp_id = None, forced_so_id = None): ''' Imports a previously running pair Parameters: base (str): The base currency of the pair quote (str): The quote currency of the pair + forced_tp_id (str): The ID of the take profit order to use + forced_so_id (str): The ID of the stop order to use Returns: jsonified dictionary detailing the outcome of the operation. ''' try: - import_instance(base,quote) + import_instance(base,quote,forced_tp_id,forced_so_id) broker.add_pair_to_config(f"{base}{quote}") broker.rewrite_config_file() broker.logger.log_this(f"Done",2,f"{base}/{quote}") diff --git a/trader.py b/trader.py index 3d523a4..1f3e93c 100755 --- a/trader.py +++ b/trader.py @@ -6,7 +6,7 @@ from config_handler import ConfigHandler from status_handler import StatusHandler class trader: - def __init__(self, broker, pair: str, is_import: bool = False): + def __init__(self, broker, pair: str, is_import: bool = False, forced_tp_id = None, forced_so_id = None): #Flags self.pause = True @@ -42,7 +42,7 @@ class trader: self.status.set_pause_reason("Initialization") if is_import: - self.load_imported_trader() + self.load_imported_trader(forced_tp_order_id=forced_tp_id, forced_safety_order_id=forced_so_id) return None # An alternative would be to set up a variable like self.is_initalized to false and finish the initialization here. @@ -1573,7 +1573,7 @@ class trader: return f"{white}{line1}\n{line3}{white}" - def load_imported_trader(self) -> int: + def load_imported_trader(self, forced_tp_order_id = None, forced_safety_order_id = None) -> int: ''' Loads status dictionary, orders and sets up variables ''' @@ -1587,14 +1587,16 @@ class trader: self.config.set_no_of_safety_orders(self.status.get_no_of_safety_orders()) #If this is not loaded from status_dict, it will ignore if safety orders were added at runtime #Refresh take profit order - self.status.set_take_profit_order(self.broker.get_order(self.status.get_take_profit_order()["id"],self.config.get_pair())) + order_id = self.status.get_take_profit_order()["id"] if forced_tp_order_id is None else forced_tp_order_id + self.status.set_take_profit_order(self.broker.get_order(order_id,self.config.get_pair())) if self.status.get_take_profit_order()==self.broker.get_empty_order(): self.broker.logger.log_this("Couldn't load take profit order (broker returned empty order). Aborting.",1,self.config.get_pair()) self.quit = True return 1 #Refresh safety order - self.status.set_safety_order(self.broker.get_order(self.status.get_safety_order()["id"],self.config.get_pair())) + order_id = self.status.get_safety_order()["id"] if forced_safety_order_id is None else forced_safety_order_id + self.status.set_safety_order(self.broker.get_order(order_id,self.config.get_pair())) if self.status.get_safety_order()==self.broker.get_empty_order() and self.status.get_so_amount()