. Decorator for api endpoints error handling
. Input validation in api parameters . credentials.py import fallback
This commit is contained in:
parent
ca817b6a13
commit
e888ee0c78
|
|
@ -3,7 +3,9 @@
|
|||
. Minor fixes to string handling
|
||||
. Fixed misplaced lock
|
||||
. Fixed config dict mutation
|
||||
|
||||
. Decorator for api endpoints error handling
|
||||
. Input validation in api parameters
|
||||
. credentials.py import fallback
|
||||
|
||||
2026.06.03:
|
||||
. Fixed tp mode 2 non-functional
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import collections
|
||||
import time
|
||||
import credentials
|
||||
import sqlite3
|
||||
from contextlib import contextmanager
|
||||
from requests import get as requests_get
|
||||
|
|
@ -8,6 +7,11 @@ from json import load, dumps
|
|||
from copy import deepcopy
|
||||
from urllib.parse import quote
|
||||
|
||||
try:
|
||||
import credentials
|
||||
except ModuleNotFoundError:
|
||||
print("ERROR: credentials.py not found. Copy credentials.py.example to credentials.py and fill in your API keys")
|
||||
raise
|
||||
|
||||
class Broker:
|
||||
def __init__(self,exchange,broker_config,config_filename):
|
||||
|
|
|
|||
227
main.py
227
main.py
|
|
@ -5,6 +5,7 @@ from sys import argv, stdout
|
|||
from os import _exit as os_exit
|
||||
from json import load
|
||||
from datetime import date
|
||||
from functools import wraps
|
||||
from threading import Thread, Lock
|
||||
from waitress import serve
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
|
@ -494,9 +495,21 @@ def display_splashscreen():
|
|||
######### API ###########
|
||||
#########################
|
||||
|
||||
def api_error_handler(f):
|
||||
@wraps(f)
|
||||
def wrapper(*args,**kwargs):
|
||||
try:
|
||||
return f(*args,**kwargs)
|
||||
except Exception as e:
|
||||
broker.logger.log_this(f"API error in {f.__name__}: {e}", 1)
|
||||
return jsonify({"Error": "Halp"})
|
||||
return wrapper
|
||||
|
||||
|
||||
base_api = Flask(__name__)
|
||||
|
||||
@base_api.route("/global_status", methods=['GET'])
|
||||
@api_error_handler
|
||||
def return_global_status():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -511,6 +524,7 @@ def return_global_status():
|
|||
|
||||
|
||||
@base_api.route("/paused_traders", methods=['GET'])
|
||||
@api_error_handler
|
||||
def return_paused_status():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -524,6 +538,7 @@ def return_paused_status():
|
|||
|
||||
|
||||
@base_api.route("/worker_status", methods=['GET'])
|
||||
@api_error_handler
|
||||
def return_worker_status():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -535,16 +550,13 @@ def return_worker_status():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
base = request.args.get("base")
|
||||
quote = request.args.get("quote")
|
||||
return unwrapped_return_worker_status(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/view_old_long", methods=["GET"])
|
||||
@api_error_handler
|
||||
def return_old_long():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -557,17 +569,14 @@ def return_old_long():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
base = request.args.get("base")
|
||||
quote = request.args.get("quote")
|
||||
from_file = request.args.get("from_file")
|
||||
return unwrapped_view_old_long(base,quote,from_file)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/switch_to_long_price", methods=["GET"])
|
||||
@api_error_handler
|
||||
def return_switch_price():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -579,17 +588,13 @@ def return_switch_price():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
base = request.args.get("base")
|
||||
quote = request.args.get("quote")
|
||||
return unwrapped_switch_to_long_price(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
|
||||
@base_api.route("/base_add_so_calculation", methods=["GET"])
|
||||
@api_error_handler
|
||||
def return_base_add_so_calculation():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -601,16 +606,13 @@ def return_base_add_so_calculation():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
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'})
|
||||
|
||||
|
||||
@base_api.route("/get_all_worker_status", methods=['GET'])
|
||||
@api_error_handler
|
||||
def return_all_worker_status():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -625,6 +627,7 @@ def return_all_worker_status():
|
|||
|
||||
|
||||
@base_api.route("/add_pair", methods=['POST'])
|
||||
@api_error_handler
|
||||
def add_pair():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -636,19 +639,16 @@ def add_pair():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_add_pair(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/remove_pair", methods=['POST'])
|
||||
@api_error_handler
|
||||
def remove_pair():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -660,19 +660,16 @@ def remove_pair():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_remove_pair(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/restart_pair", methods=['POST'])
|
||||
@api_error_handler
|
||||
def restart_pair():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -684,19 +681,16 @@ def restart_pair():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_restart_pair(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/import_pair", methods=['POST'])
|
||||
@api_error_handler
|
||||
def import_pair():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -710,19 +704,16 @@ def import_pair():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_import_pair(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/switch_to_long", methods=['POST'])
|
||||
@api_error_handler
|
||||
def switch_to_long():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -735,7 +726,6 @@ def switch_to_long():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -743,12 +733,10 @@ def switch_to_long():
|
|||
quote = data["quote"]
|
||||
calculate_profits = data["calculate_profits"]
|
||||
return unwrapped_switch_to_long(base,quote,calculate_profits)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/switch_to_short", methods=['POST'])
|
||||
@api_error_handler
|
||||
def switch_to_short():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -760,19 +748,16 @@ def switch_to_short():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_switch_to_short(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/load_old_long", methods=['POST'])
|
||||
@api_error_handler
|
||||
def load_old_long():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -784,19 +769,16 @@ def load_old_long():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_load_old_long(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/add_so", methods=['POST'])
|
||||
@api_error_handler
|
||||
def add_so():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -809,7 +791,6 @@ def add_so():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -817,12 +798,10 @@ def add_so():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_add_safety_orders(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_tp_level", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_tp_level():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -835,7 +814,6 @@ def mod_tp_level():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -843,12 +821,10 @@ def mod_tp_level():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_tp_level(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_order_size", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_order_size():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -861,7 +837,6 @@ def mod_order_size():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -869,12 +844,10 @@ def mod_order_size():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_order_size(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_concurrent_safety_orders", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_concurrent_safety_orders():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -887,7 +860,6 @@ def mod_concurrent_safety_orders():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -895,12 +867,10 @@ def mod_concurrent_safety_orders():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_concurrent_safety_orders(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_boosted_concurrent_safety_orders", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_boosted_concurrent_safety_orders():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -913,7 +883,6 @@ def mod_boosted_concurrent_safety_orders():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -921,12 +890,10 @@ def mod_boosted_concurrent_safety_orders():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_boosted_concurrent_safety_orders(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_default_order_size", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_default_order_size():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -937,18 +904,15 @@ def mod_default_order_size():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_default_order_size(amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/mod_global_tp_level", methods=['POST'])
|
||||
@api_error_handler
|
||||
def mod_global_tp_level():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -959,18 +923,15 @@ def mod_global_tp_level():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
amount = data["amount"]
|
||||
return unwrapped_mod_global_tp_level(amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/last_call", methods=['POST'])
|
||||
@api_error_handler
|
||||
def last_call():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -982,19 +943,16 @@ def last_call():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_last_call(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/deferred_last_call", methods=['POST'])
|
||||
@api_error_handler
|
||||
def deferred_last_call():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1007,7 +965,6 @@ def deferred_last_call():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -1015,12 +972,10 @@ def deferred_last_call():
|
|||
quote = data["quote"]
|
||||
yyyymmdd = data["yyyymmdd"]
|
||||
return unwrapped_deferred_last_call(base,quote,yyyymmdd)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/toggle_pause", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_pause():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1032,19 +987,16 @@ def toggle_pause():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_toggle_pause(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/global_last_call", methods=['POST'])
|
||||
@api_error_handler
|
||||
def global_last_call():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1059,6 +1011,7 @@ def global_last_call():
|
|||
|
||||
|
||||
@base_api.route("/cancel_global_last_call", methods=['POST'])
|
||||
@api_error_handler
|
||||
def cancel_global_last_call():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1073,6 +1026,7 @@ def cancel_global_last_call():
|
|||
|
||||
|
||||
@base_api.route("/add_quote", methods=['POST'])
|
||||
@api_error_handler
|
||||
def add_quote():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1085,7 +1039,6 @@ def add_quote():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -1093,12 +1046,10 @@ def add_quote():
|
|||
quote = data["quote"]
|
||||
amount = data["amount"]
|
||||
return unwrapped_add_quote(base,quote,amount)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/missing_pairs", methods=['GET'])
|
||||
@api_error_handler
|
||||
def missing_pairs():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -1113,6 +1064,7 @@ def missing_pairs():
|
|||
|
||||
|
||||
@base_api.route("/toggle_cleanup", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_cleanup():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1124,19 +1076,16 @@ def toggle_cleanup():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_toggle_cleanup(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/toggle_autoswitch", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_autoswitch():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1148,19 +1097,16 @@ def toggle_autoswitch():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_toggle_autoswitch(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/force_trader_close", methods=['POST'])
|
||||
@api_error_handler
|
||||
def force_trader_close():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1172,19 +1118,16 @@ def force_trader_close():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_force_trader_close(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/toggle_liquidate_after_switch", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_liquidate_after_switch():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1196,19 +1139,16 @@ def toggle_liquidate_after_switch():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_toggle_liquidate_after_switch(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/toggle_check_old_long_price", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_check_old_long_price():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1220,19 +1160,16 @@ def toggle_check_old_long_price():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_toggle_check_old_long_price(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/switch_quote_currency", methods=['POST'])
|
||||
@api_error_handler
|
||||
def switch_quote_currency():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1245,7 +1182,6 @@ def switch_quote_currency():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
|
|
@ -1253,12 +1189,10 @@ def switch_quote_currency():
|
|||
quote = data["quote"]
|
||||
new_quote = data["new_quote"]
|
||||
return unwrapped_switch_quote_currency(base,quote,new_quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/toggle_log_orders", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_log_orders():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1273,6 +1207,7 @@ def toggle_log_orders():
|
|||
|
||||
|
||||
@base_api.route("/toggle_restart", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_restart():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1287,6 +1222,7 @@ def toggle_restart():
|
|||
|
||||
|
||||
@base_api.route("/toggle_telegram", methods=['POST'])
|
||||
@api_error_handler
|
||||
def toggle_telegram():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1301,6 +1237,7 @@ def toggle_telegram():
|
|||
|
||||
|
||||
@base_api.route("/server_time", methods=['GET'])
|
||||
@api_error_handler
|
||||
def server_time():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -1329,6 +1266,7 @@ def get_log_list():
|
|||
|
||||
|
||||
@base_api.route("/refresh_log_cache", methods=['POST'])
|
||||
@api_error_handler
|
||||
def refresh_log_cache():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1336,14 +1274,11 @@ def refresh_log_cache():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
return unwrapped_refresh_log_cache()
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/get_balance", methods=['GET'])
|
||||
@api_error_handler
|
||||
def get_balance():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -1359,6 +1294,7 @@ def get_balance():
|
|||
|
||||
|
||||
@base_api.route("/get_deals_cache", methods=['GET'])
|
||||
@api_error_handler
|
||||
def get_deals_cache():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -1373,6 +1309,7 @@ def get_deals_cache():
|
|||
|
||||
|
||||
@base_api.route("/trader_time", methods=['GET'])
|
||||
@api_error_handler
|
||||
def trader_time():
|
||||
'''
|
||||
GET request
|
||||
|
|
@ -1387,6 +1324,7 @@ def trader_time():
|
|||
|
||||
|
||||
@base_api.route("/edit_loop_wait_time", methods=['POST'])
|
||||
@api_error_handler
|
||||
def loop_wait_time():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1397,18 +1335,15 @@ def loop_wait_time():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
wait_time = data["wait_time"]
|
||||
return unwrapped_loop_wait_time(wait_time)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/edit_call_wait_time", methods=['POST'])
|
||||
@api_error_handler
|
||||
def call_wait_time():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1419,18 +1354,15 @@ def call_wait_time():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
wait_time = data["wait_time"]
|
||||
return unwrapped_call_wait_time(wait_time)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/edit_cooldown_multiplier", methods=['POST'])
|
||||
@api_error_handler
|
||||
def edit_cooldown_multiplier():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1441,18 +1373,15 @@ def edit_cooldown_multiplier():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
multiplier = data["cooldown_multiplier"]
|
||||
return unwrapped_edit_cooldown_multiplier(multiplier)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
@base_api.route("/reload_markets", methods=['POST'])
|
||||
@api_error_handler
|
||||
def reload_markets():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1468,6 +1397,7 @@ def reload_markets():
|
|||
|
||||
|
||||
@base_api.route("/reload_trader_config", methods=['POST'])
|
||||
@api_error_handler
|
||||
def reload_trader_config():
|
||||
'''
|
||||
POST request
|
||||
|
|
@ -1479,16 +1409,12 @@ def reload_trader_config():
|
|||
|
||||
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in valid_keys:
|
||||
return jsonify({'Error': 'API key invalid'}), 401
|
||||
try:
|
||||
if request.json is None:
|
||||
return jsonify({'Error': 'request.json is None'})
|
||||
data = request.json
|
||||
base = data["base"]
|
||||
quote = data["quote"]
|
||||
return unwrapped_reload_trader_config(base,quote)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return jsonify({'Error': 'Halp'})
|
||||
|
||||
|
||||
def run_API():
|
||||
|
|
@ -1500,6 +1426,11 @@ def run_API():
|
|||
# Unwrapped API functions #
|
||||
###########################
|
||||
|
||||
def validate_pair_param(base, quote):
|
||||
if not base or not quote or not base.isalpha() or not quote.isalpha():
|
||||
raise ValueError(f"Invalid pair: {base}/{quote}")
|
||||
return base.upper(), quote.upper()
|
||||
|
||||
def unwrapped_global_status():
|
||||
'''
|
||||
Returns the global status dictionary of the instance.
|
||||
|
|
@ -1524,6 +1455,7 @@ def unwrapped_return_worker_status(base,quote):
|
|||
Returns:
|
||||
dict: The status dictionary of the trader.
|
||||
'''
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
for instance in running_traders:
|
||||
|
|
@ -1555,6 +1487,7 @@ def unwrapped_add_pair(base,quote):
|
|||
jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
|
||||
|
|
@ -1592,6 +1525,7 @@ def unwrapped_remove_pair(base,quote):
|
|||
jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1616,6 +1550,7 @@ def unwrapped_restart_pair(base,quote):
|
|||
jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
if restart_pair_no_json(base,quote)==0:
|
||||
return jsonify({"Success": "Pair restarted"})
|
||||
return jsonify({"Error": "Halp"})
|
||||
|
|
@ -1633,6 +1568,7 @@ def unwrapped_import_pair(base,quote):
|
|||
jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
import_instance(base,quote)
|
||||
|
|
@ -1658,6 +1594,7 @@ def unwrapped_switch_to_long(base,quote,calculate_profits):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
ignore_old_long = int(calculate_profits)!=1
|
||||
#Close trader and orders and pull info our of the orders
|
||||
if f"{base}{quote}" not in broker.get_pairs():
|
||||
|
|
@ -1687,6 +1624,7 @@ def unwrapped_switch_to_short(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
#Close trader and orders and pull info our of the orders
|
||||
symbol = f"{base}/{quote}"
|
||||
if f"{base}{quote}" not in broker.get_pairs():
|
||||
|
|
@ -1732,6 +1670,7 @@ def unwrapped_load_old_long(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
#Load the file
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
|
|
@ -1771,6 +1710,7 @@ def unwrapped_view_old_long(base,quote,from_file):
|
|||
jsonify: A jsonified dictionary containing the old_long info.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
if int(from_file)==1:
|
||||
|
|
@ -1802,6 +1742,7 @@ def unwrapped_switch_to_long_price(base,quote):
|
|||
jsonify: A jsonified dictionary containing the old_long info.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1834,6 +1775,7 @@ def unwrapped_add_safety_orders(base,quote,amount):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1865,6 +1807,7 @@ def unwrapped_base_add_so_calculation(base,quote):
|
|||
jsonify: A jsonified dictionary with the amount of orders that can be added.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1894,6 +1837,7 @@ def unwrapped_mod_tp_level(base,quote,amount):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1920,6 +1864,7 @@ def unwrapped_mod_order_size(base,quote,amount):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1947,6 +1892,7 @@ def unwrapped_mod_concurrent_safety_orders(base,quote,amount):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -1974,6 +1920,7 @@ def unwrapped_mod_boosted_concurrent_safety_orders(base,quote,amount):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2040,6 +1987,7 @@ def unwrapped_last_call(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2070,6 +2018,7 @@ def unwrapped_deferred_last_call(base,quote,yyyymmdd):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
year = yyyymmdd[:4]
|
||||
month = yyyymmdd[4:6]
|
||||
|
|
@ -2102,6 +2051,7 @@ def unwrapped_toggle_pause(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
toggle_pauses.append(symbol)
|
||||
|
|
@ -2166,6 +2116,8 @@ def unwrapped_add_quote(base,quote,amount):
|
|||
Returns:
|
||||
json: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
with traders_lock:
|
||||
for instance in running_traders:
|
||||
if f"{base}/{quote}"==instance.status.get_pair():
|
||||
|
|
@ -2228,6 +2180,7 @@ def unwrapped_missing_pairs():
|
|||
Returns:
|
||||
jsonify: A jsonify object with a list of the missing pairs
|
||||
'''
|
||||
|
||||
try:
|
||||
missing_pairs = broker.get_pairs()
|
||||
for trader in running_traders:
|
||||
|
|
@ -2251,6 +2204,7 @@ def unwrapped_toggle_cleanup(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2278,6 +2232,7 @@ def unwrapped_force_trader_close(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2305,6 +2260,7 @@ def unwrapped_toggle_autoswitch(base,quote):
|
|||
A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2336,6 +2292,7 @@ def unwrapped_toggle_liquidate_after_switch(base,quote):
|
|||
A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2367,6 +2324,7 @@ def unwrapped_toggle_check_old_long_price(base,quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
with traders_lock:
|
||||
|
|
@ -2399,6 +2357,7 @@ def unwrapped_switch_quote_currency(base,quote,new_quote):
|
|||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
try:
|
||||
symbol = f"{base}/{quote}"
|
||||
for trader in running_traders:
|
||||
|
|
@ -2631,6 +2590,8 @@ def unwrapped_reload_trader_config(base,quote):
|
|||
Returns:
|
||||
jsonify: A jsonified dictionary detailing the outcome of the operation.
|
||||
'''
|
||||
|
||||
base, quote = validate_pair_param(base,quote)
|
||||
symbol = f"{base}/{quote}"
|
||||
for trader in running_traders:
|
||||
if trader.status.get_pair() == symbol:
|
||||
|
|
|
|||
Loading…
Reference in New Issue