diff --git a/main.py b/main.py index f01031a..7cd8ba1 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,7 @@ import exchange_wrapper import trader -version = "2025.05.31" +version = "2025.06.04" ''' Color definitions. If you want to change them, check the reference at https://en.wikipedia.org/wiki/ANSI_escape_code#Colors @@ -547,6 +547,28 @@ def return_switch_price(): return jsonify({'Error': 'Halp'}) return jsonify({'Error': 'API key invalid'}), 401 + +@base_api.route("/base_add_so_calculation", methods=["GET"]) +def return_base_add_so_calculation(): + ''' + GET request + + Parameters: + base: str + quote: str + ''' + + if "X-API-KEY" in request.headers and request.headers.get("X-API-KEY") in valid_keys: + try: + base = request.args.get("base") + quote = request.args.get("quote") + return unwrapped_base_add_so_calculation(base,quote) + except Exception as e: + print(e) + return jsonify({'Error': 'Halp'}) + return jsonify({'Error': 'API key invalid'}), 401 + + @base_api.route("/get_all_worker_status", methods=['GET']) def return_all_worker_status(): ''' @@ -1642,6 +1664,32 @@ def unwrapped_add_safety_orders(base,quote,amount): return jsonify({"Error": "Error adding safety orders"}) +def unwrapped_base_add_so_calculation(base,quote): + ''' + Calculates the amount of safety order that can be added to a short trader with the current available base currency. + + Parameters: + base (str): The base currency of the pair. + quote (str): The quote currency of the pair. + + Returns: + jsonify: A jsonified dictionary with the amount of orders that can be added. + ''' + + try: + for x in running_instances: + if f"{base}/{quote}"==x.config.get_pair(): + free_base = x.fetch_free_base() + if free_base is None: + return jsonify({"Error": "Can't fetch amount of free base on the exchange"}) + amount_of_orders = x.base_add_calculation(free_base) + return jsonify({"Amount": amount_of_orders, "Free base on exchange": free_base}) + return jsonify({"Error": "Can't find the pair in the running instances"}) + except Exception as e: + broker.logger.log_this(f"{e}",2,f"{base}/{quote}") + return jsonify({"Error": "Error in unwrapped_base_add_so_calculation"}) + + def unwrapped_mod_tp_level(base,quote,amount): ''' Modifies the take profit percentage of a pair. It applies the new percentage only after a new TP order is sent. diff --git a/trader.py b/trader.py index 2c44133..c2ec029 100755 --- a/trader.py +++ b/trader.py @@ -335,11 +335,10 @@ class trader: if not self.config.get_is_short(): # Only works for short traders. return 0 - safety_price_table = self.calculate_safety_prices(self.status.get_start_price(),max_so,self.config.get_safety_order_deviance()) amount_accumulated = 0 so_count = 0 for i in range(self.status.get_so_amount()+1,max_so+1): - amount_accumulated+= self.gib_so_size(self.status.get_start_price(),i,self.config.get_safety_order_scale())/safety_price_table[i] + amount_accumulated+= self.gib_so_size(self.status.get_order_size(),i,self.config.get_safety_order_scale()) if amount_accumulated >= base_currency_amount: return so_count so_count+=1 diff --git a/utils/commander.py b/utils/commander.py index 0edf72b..7743c85 100644 --- a/utils/commander.py +++ b/utils/commander.py @@ -57,6 +57,7 @@ TRADERS 68) toggle_check_old_long_price 69) switch_quote_currency 70) reload_safety_order 71) view_old_long 72) switch_price 73) reload_trader_config 74) toggle_liquidate_after_switch +75) base_add_calculation 98) Change broker 99) Exit ''' @@ -817,4 +818,16 @@ if __name__=="__main__": parameters = {"base": base, "quote": quote} print(json.loads(requests.post(url, headers=headers, json=parameters).content)) - input("Press ENTER to continue ") \ No newline at end of file + input("Press ENTER to continue ") + + elif command==75: + print("Returns the amount of safety orders that can be added to a short trader with the available funds") + trading_pair = input("Input trader in the format BASE/QUOTE: ").upper() + if not validate_pair(trading_pair): + print("The input is invalid") + break + if input("Proceed? (Y/n) ") in ["Y","y",""]: + base,quote = trading_pair.split("/") + url = f"{base_url}{port}/base_add_so_calculation?base={base}"e={quote}" + print(json.loads(requests.get(url,headers=headers).content)) + input("Press ENTER to continue ") \ No newline at end of file