This commit is contained in:
@@ -348,9 +348,9 @@ async def get_volume_changes(days: int = 7):
|
||||
if days not in [7, 30, 42, 69, 180, 365]:
|
||||
raise HTTPException(status_code=400, detail="Invalid days parameter. Must be one of: 7, 30, 42, 69, 180, 365")
|
||||
|
||||
# Hole die neuesten Daten für den angegebenen Zeitraum
|
||||
query = f"""
|
||||
select
|
||||
timestamp as date,
|
||||
exchange,
|
||||
trade_count,
|
||||
volume,
|
||||
@@ -359,11 +359,74 @@ async def get_volume_changes(days: int = 7):
|
||||
trend
|
||||
from analytics_volume_changes
|
||||
where period_days = {days}
|
||||
and timestamp >= dateadd('d', -{days}, now())
|
||||
order by date desc, exchange asc
|
||||
order by timestamp desc
|
||||
limit 20
|
||||
"""
|
||||
|
||||
data = query_questdb(query, timeout=5)
|
||||
|
||||
# Falls keine vorberechneten Daten vorhanden, berechne on-the-fly
|
||||
if not data or not data.get('dataset'):
|
||||
logger.info(f"No pre-calculated volume changes found for {days} days, calculating on-the-fly")
|
||||
|
||||
# Berechne Volumen-Änderungen direkt aus trades
|
||||
query = f"""
|
||||
with
|
||||
first_half as (
|
||||
select
|
||||
exchange,
|
||||
count(*) as trade_count,
|
||||
sum(price * quantity) as volume
|
||||
from trades
|
||||
where timestamp >= dateadd('d', -{days}, now())
|
||||
and timestamp < dateadd('d', -{days/2}, now())
|
||||
group by exchange
|
||||
),
|
||||
second_half as (
|
||||
select
|
||||
exchange,
|
||||
count(*) as trade_count,
|
||||
sum(price * quantity) as volume
|
||||
from trades
|
||||
where timestamp >= dateadd('d', -{days/2}, now())
|
||||
group by exchange
|
||||
)
|
||||
select
|
||||
coalesce(f.exchange, s.exchange) as exchange,
|
||||
coalesce(s.trade_count, 0) as trade_count,
|
||||
coalesce(s.volume, 0) as volume,
|
||||
case when f.trade_count > 0 then
|
||||
((coalesce(s.trade_count, 0) - f.trade_count) * 100.0 / f.trade_count)
|
||||
else 0 end as count_change_pct,
|
||||
case when f.volume > 0 then
|
||||
((coalesce(s.volume, 0) - f.volume) * 100.0 / f.volume)
|
||||
else 0 end as volume_change_pct,
|
||||
case
|
||||
when f.trade_count > 0 and f.volume > 0 then
|
||||
case
|
||||
when ((coalesce(s.trade_count, 0) - f.trade_count) * 100.0 / f.trade_count) > 5
|
||||
and ((coalesce(s.volume, 0) - f.volume) * 100.0 / f.volume) > 5
|
||||
then 'mehr_trades_mehr_volumen'
|
||||
when ((coalesce(s.trade_count, 0) - f.trade_count) * 100.0 / f.trade_count) > 5
|
||||
and ((coalesce(s.volume, 0) - f.volume) * 100.0 / f.volume) < -5
|
||||
then 'mehr_trades_weniger_volumen'
|
||||
when ((coalesce(s.trade_count, 0) - f.trade_count) * 100.0 / f.trade_count) < -5
|
||||
and ((coalesce(s.volume, 0) - f.volume) * 100.0 / f.volume) > 5
|
||||
then 'weniger_trades_mehr_volumen'
|
||||
when ((coalesce(s.trade_count, 0) - f.trade_count) * 100.0 / f.trade_count) < -5
|
||||
and ((coalesce(s.volume, 0) - f.volume) * 100.0 / f.volume) < -5
|
||||
then 'weniger_trades_weniger_volumen'
|
||||
else 'stabil'
|
||||
end
|
||||
else 'neu'
|
||||
end as trend
|
||||
from first_half f
|
||||
full outer join second_half s on f.exchange = s.exchange
|
||||
order by s.volume desc
|
||||
"""
|
||||
|
||||
data = query_questdb(query, timeout=15)
|
||||
|
||||
return format_questdb_response(data)
|
||||
|
||||
@app.get("/api/statistics/stock-trends")
|
||||
|
||||
Reference in New Issue
Block a user