Statistics server API update

This commit is contained in:
Nicolás Sánchez 2026-02-08 12:04:22 -03:00
parent 4a1f1c844d
commit 12999a2189
3 changed files with 81 additions and 52 deletions

1
.gitignore vendored
View File

@ -11,6 +11,7 @@ utils/close.py
utils/credentials.py utils/credentials.py
utils/set_exchange.py utils/set_exchange.py
utils/stuff.py utils/stuff.py
utils/shorts_summary.py
logs/binance.log logs/binance.log
logs/okex.log logs/okex.log
logs/gateio.log logs/gateio.log

View File

@ -1,53 +1,61 @@
import sqlite3 '''
import os Returns information on all running short traders:
import sys '''
import json
import datetime
pair = sys.argv[1].replace("/","") import json, datetime, credentials, requests, time
#Connect to db def profit_since_date(base, quote, timestamp):
connection = sqlite3.connect("../profits/profits_database.db") url = f"{base_statistics_url}/total_profit_by_pair_since_date?base={base}&quote={quote}&timestamp={timestamp}" #type: ignore
cursor = connection.cursor() result = json.loads(requests.get(url,headers=headers).content)
return result["Total profit"]
#Load old_long info def timestamp_to_seconds(timestamp_string):
try: '''
with open(f"../status/{pair}.oldlong") as f: Converts a timestamp string from this format "[YYYY/mm/dd HH:MM:SS]" to seconds.
old_long = json.load(f)
except Exception as e:
print(e)
print("No old_long file")
os._exit(0)
#Get time of switch to unix time :param timestamp_string: timestamp string.
old_date = old_long["datetime"][1:11] :return: linux time in seconds.
linux_time = datetime.datetime.strptime(old_date,"%Y/%m/%d").timestamp() '''
#Query database dt = datetime.datetime.strptime(timestamp_string.strip('[]'), "%Y/%m/%d %H:%M:%S")
query = f"""SELECT pair, SUM(amount) AS total_profit return int(dt.timestamp())
FROM profits_table
WHERE timestamp >= '{linux_time}'
GROUP BY pair;"""
cursor.execute(query)
query_result = cursor.fetchall()
#Calculate profits
total = 0
for item in query_result:
if item[0].replace("/","")==pair:
total = item[1]
print(f"Profits since switch ({old_date}): {round(total,2)}") if __name__=="__main__":
print(f"Profit needed to cover expenses: {round(old_long['quote_spent'],2)}") api_key = credentials.get_credentials("mainnet_api_key")["key"]
print(f"Difference: {round(old_long['quote_spent']-total,2)}") base_statistics_url = f"{credentials.get_url('mainnet')}/statistics_server" #type: ignore
base_url = f"{credentials.get_url('mainnet')}" #type: ignore
results_dict = {}
try: headers = {"X-API-KEY": api_key}
with open(f"../status/{pair}.status") as f:
status_file = json.load(f)
except Exception as e:
print(e)
print("No status file")
os._exit(0)
print(f"Old long price: {old_long['tp_price']}") exchanges = ["binance", "gateio", "kucoin", "okex"]
print(f"Current price: {status_file['price']}")
for exchange in exchanges:
#fetch all traders status
url = f"{base_url}/{exchange}/get_all_worker_status"
while True:
query = requests.get(url,headers=headers)
if query.status_code != 503:
break
time.sleep(.2)
workers_status = json.loads(query.content)
#for each status_dict, extract pair, switch_date, old_long_amount
for item in workers_status:
if workers_status[item]["is_short"]:
print("Processing",item)
base,quote = item.split("/")
switch_date = timestamp_to_seconds(workers_status[item]["old_long"]["datetime"])
profit_since_short = profit_since_date(base,quote,switch_date)
total_current_value = workers_status[item]["quote_spent"] + (workers_status[item]["old_long"]["tp_amount"]-workers_status[item]["base_bought"])*workers_status[item]["price"]
results_dict[item] = {
"switch_date": workers_status[item]["old_long"]["datetime"],
"profit_since_short": round(profit_since_short,2),
"old_long_quote_spent": round(workers_status[item]["old_long"]["quote_spent"]),
"total_current_value": round(total_current_value,2)
}
for item in results_dict:
print(item, results_dict[item])

View File

@ -174,24 +174,25 @@ def profit_report():
"Total profit": total_amount} "Total profit": total_amount}
def query_total_profit(pair=None): def query_total_profit(pair=None, start_date=0):
''' '''
Returns total profit of the trading pair. Returns total profit of the trading pair.
If no pair specified, returns the grand total of all pairs. If no pair specified, returns the grand total of all pairs.
''' '''
if pair is None: if pair is None:
query = "SELECT SUM(amount) AS total_profit FROM profits_table" query = "SELECT SUM(amount) AS total_profit FROM profits_table WHERE timestamp >= ?"
with db_cursor() as cursor: with db_cursor() as cursor:
cursor.execute(query) cursor.execute(query, (start_date,))
query_result = cursor.fetchall() query_result = cursor.fetchall()
return query_result[0][0] return query_result[0][0]
else: else:
query = """SELECT pair, SUM(amount) AS total_profit query = """SELECT pair, SUM(amount) AS total_profit
FROM profits_table FROM profits_table
WHERE timestamp >= ?
GROUP BY pair;""" GROUP BY pair;"""
with db_cursor() as cursor: with db_cursor() as cursor:
cursor.execute(query) cursor.execute(query, (start_date,))
query_result = cursor.fetchall() query_result = cursor.fetchall()
for item in query_result: for item in query_result:
if item[0].replace("/","")==pair: if item[0].replace("/","")==pair:
@ -566,6 +567,25 @@ def total_profit_by_pair():
return jsonify({'Error': 'Halp'}) return jsonify({'Error': 'Halp'})
@stats_api.route("/total_profit_by_pair_since_date")
def total_profit_by_pair_since_date():
'''
GET request
Parameters: 'base' -> string
'quote' -> string
'timestamp' -> int
'''
if not "X-API-KEY" in request.headers or not request.headers.get("X-API-KEY") in get_valid_keys():
return jsonify({'Error': 'API key invalid'}), 401
try:
base = request.args.get("base")
quote = request.args.get("quote")
timestamp = int(request.args.get("timestamp")) # type: ignore
total = query_total_profit(f"{base}{quote}", timestamp)
return jsonify({"Total profit": total})
except Exception as e:
print(e)
return jsonify({'Error': 'Halp'})
if __name__=="__main__": if __name__=="__main__":