This commit is contained in:
@@ -94,17 +94,28 @@ async def get_metadata():
|
||||
return format_questdb_response(data)
|
||||
|
||||
@app.get("/api/summary")
|
||||
async def get_summary():
|
||||
async def get_summary(days: int = None):
|
||||
"""
|
||||
Gibt Zusammenfassung zurück. Nutzt analytics_daily_summary für total_trades (alle Trades).
|
||||
"""
|
||||
# Hole Gesamtzahl aller Trades aus analytics_daily_summary
|
||||
query = """
|
||||
select
|
||||
sum(total_trades) as total_trades,
|
||||
sum(total_volume) as total_volume
|
||||
from analytics_daily_summary
|
||||
Gibt Zusammenfassung zurück. Nutzt analytics_daily_summary für total_trades.
|
||||
Optional: days Parameter für Zeitraum-basierte Zusammenfassung.
|
||||
"""
|
||||
if days:
|
||||
# Zeitraum-basierte Zusammenfassung
|
||||
query = f"""
|
||||
select
|
||||
sum(total_trades) as total_trades,
|
||||
sum(total_volume) as total_volume
|
||||
from analytics_daily_summary
|
||||
where timestamp >= dateadd('d', -{days}, now())
|
||||
"""
|
||||
else:
|
||||
# Gesamtzahl aller Trades
|
||||
query = """
|
||||
select
|
||||
sum(total_trades) as total_trades,
|
||||
sum(total_volume) as total_volume
|
||||
from analytics_daily_summary
|
||||
"""
|
||||
|
||||
data = query_questdb(query)
|
||||
if data and data.get('dataset') and data['dataset']:
|
||||
@@ -135,15 +146,92 @@ async def get_summary():
|
||||
return format_questdb_response(data)
|
||||
|
||||
@app.get("/api/statistics/total-trades")
|
||||
async def get_total_trades():
|
||||
"""Gibt Gesamtzahl aller Trades zurück (aus analytics_daily_summary)"""
|
||||
query = "select sum(total_trades) as total from analytics_daily_summary"
|
||||
async def get_total_trades(days: int = None):
|
||||
"""Gibt Gesamtzahl aller Trades zurück (aus analytics_daily_summary). Optional: days Parameter für Zeitraum."""
|
||||
if days:
|
||||
query = f"select sum(total_trades) as total from analytics_daily_summary where timestamp >= dateadd('d', -{days}, now())"
|
||||
else:
|
||||
query = "select sum(total_trades) as total from analytics_daily_summary"
|
||||
data = query_questdb(query)
|
||||
if data and data.get('dataset') and data['dataset']:
|
||||
total = data['dataset'][0][0] if data['dataset'][0][0] else 0
|
||||
return {'total_trades': total}
|
||||
return {'total_trades': 0}
|
||||
|
||||
@app.get("/api/custom-analytics")
|
||||
async def get_custom_analytics(
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
x_axis: str = "date",
|
||||
y_axis: str = "volume",
|
||||
group_by: str = "exchange",
|
||||
exchanges: str = None
|
||||
):
|
||||
"""
|
||||
Flexibler Analytics-Endpunkt für custom Graphen.
|
||||
|
||||
Parameters:
|
||||
- date_from: Startdatum (YYYY-MM-DD)
|
||||
- date_to: Enddatum (YYYY-MM-DD)
|
||||
- x_axis: X-Achse (date, exchange, isin)
|
||||
- y_axis: Y-Achse (volume, trade_count, avg_price)
|
||||
- group_by: Gruppierung (exchange, isin, date)
|
||||
- exchanges: Komma-separierte Liste von Exchanges (optional)
|
||||
"""
|
||||
# Validiere Parameter
|
||||
valid_x_axis = ["date", "exchange", "isin"]
|
||||
valid_y_axis = ["volume", "trade_count", "avg_price"]
|
||||
valid_group_by = ["exchange", "isin", "date"]
|
||||
|
||||
if x_axis not in valid_x_axis:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid x_axis. Must be one of: {valid_x_axis}")
|
||||
if y_axis not in valid_y_axis:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid y_axis. Must be one of: {valid_y_axis}")
|
||||
if group_by not in valid_group_by:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid group_by. Must be one of: {valid_group_by}")
|
||||
|
||||
# Baue Query auf
|
||||
y_axis_map = {
|
||||
"volume": "sum(price * quantity)",
|
||||
"trade_count": "count(*)",
|
||||
"avg_price": "avg(price)"
|
||||
}
|
||||
|
||||
x_axis_map = {
|
||||
"date": "date_trunc('day', timestamp)",
|
||||
"exchange": "exchange",
|
||||
"isin": "isin"
|
||||
}
|
||||
|
||||
group_by_map = {
|
||||
"exchange": "exchange",
|
||||
"isin": "isin",
|
||||
"date": "date_trunc('day', timestamp)"
|
||||
}
|
||||
|
||||
y_metric = y_axis_map[y_axis]
|
||||
x_label = x_axis_map[x_axis]
|
||||
group_by_field = group_by_map[group_by]
|
||||
|
||||
query = f"""
|
||||
select
|
||||
{x_label} as x_value,
|
||||
{group_by_field} as group_value,
|
||||
{y_metric} as y_value
|
||||
from trades
|
||||
where timestamp >= '{date_from}'
|
||||
and timestamp <= '{date_to}'
|
||||
"""
|
||||
|
||||
if exchanges:
|
||||
exchange_list = ",".join([f"'{e.strip()}'" for e in exchanges.split(",")])
|
||||
query += f" and exchange in ({exchange_list})"
|
||||
|
||||
query += f" group by {x_label}, {group_by_field} order by {x_label} asc, {group_by_field} asc"
|
||||
|
||||
data = query_questdb(query, timeout=15)
|
||||
return format_questdb_response(data)
|
||||
|
||||
@app.get("/api/statistics/moving-average")
|
||||
async def get_moving_average(days: int = 7, exchange: str = None):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user