Files
trading-daemon/dashboard/__pycache__/server.cpython-313.pyc

309 lines
23 KiB
Plaintext
Raw Normal View History

2026-01-27 13:08:14 +01:00
<EFBFBD>
\<5C>xiW<00><00><><00>SSKJrJr SSKJr SSKJr SSKJr SSK r SSK
r
SSK J r J r Jr \"SS9r\R!\S /S /S /S
9 \R#S \"S S 9SS9 \R%S5S5r\
R("SS5r\
R("SS5r\(a \(a\\4OSr\
R("SS5rS\S3rSGS\S\S\ \ \\44SjjrS\ \\4S\ \\44Sjr\R%S 5SHS!\S"\4S#jj5r\R%S$5S%5r\R%S&5SIS"\4S'jj5r \R%S(5SIS"\4S)jj5r!\R%S*5SJS,\S-\S.\S/\S0\S1\4 S2jj5r"\R%S35SKS"\S+\4S4jj5r#\R%S55SLS"\4S6jj5r$\R%S75SMS"\S8\4S9jj5r%\R%S:5SNS;\S0\S<\S,\S-\S=\S>\4S?jj5r&\R%S@5SA\4SBj5r'\(SC:XaSSK)r)\)RT"\SDSESF9 gg)O<>)<02>FastAPI<50> HTTPException)<01>CORSMiddleware)<01> StaticFiles<65><01> FileResponseN)<03>Optional<61>Dict<63>AnyzTrading Dashboard API)<01>title<6C>*)<03> allow_origins<6E> allow_methods<64> allow_headersz/staticzdashboard/public)<01> directory<72>static)<01>name<6D>/c<00><00> # <00>[S5$7f)Nzdashboard/public/index.htmlr<00><00><00>dashboard/server.py<70>
read_indexrs<00><00><00> <17>5<> 6<>6<>s<00> <01>DB_USER<45>admin<69> DB_PASSWORD<52>quest<73>DB_HOST<53>questdbzhttp://z:9000<30>query<72>timeout<75>returnc<00><><00>[R"[S3SU0[US9nURS:XaUR 5$[ URSUR3S9e![RRa [ SSS9e[RRan[ S S
[U53S9eS nAff=f) z!Zentrale QuestDB-Abfrage-Funktionz/execr )<03>params<6D>authr!<00><>zQuestDB error: <20><02> status_code<64>detaili<6C>zQuestDB query timeouti<74>zQuestDB connection error: N) <0C>requests<74>get<65>DB_URL<52>DB_AUTHr(<00>jsonr<00>text<78>
exceptions<EFBFBD>Timeout<75>RequestException<6F>str)r r!<00>response<73>es r<00> query_questdbr6!s<><00><00> [<01><1B><<3C><<3C>6<EFBFBD>(<28>%<25> 0<>'<27>5<EFBFBD>9I<39>PW<50>ah<61>i<><08> <13> <1F> <1F>3<EFBFBD> &<26><1B>=<3D>=<3D>?<3F> "<22><1F>H<EFBFBD>,@<40>,@<40>?<3F>[c<>[h<>[h<>Zi<5A>Ij<49>k<> k<><6B> <13> <1E> <1E> &<26> &<26>M<01><1B><03>4K<34>L<>L<> <13> <1E> <1E> /<2F> /<2F>[<01><1B><03>6P<36>QT<51>UV<55>QW<51>PX<50>4Y<34>Z<>Z<><5A>[<01>s<00>AA'<00>!A'<00>'AC<03>,C<03>C<03>datac<00><00>U(d//S.$U$)z/Einheitliche Formatierung der QuestDB-Antworten<65><02>columns<6E>datasetr)r7s r<00>format_questdb_responser<.s<00><00> <0F><1D>"<22>-<2D>-<2D> <0F>Krz /api/trades<65>isin<69>daysc<00><00>(# <00>U(a
SUSUS3nOSUS3n[U5nU(a5URS5(a[URS/55S:Xa&[R S5 S US
3n[U5n[ U5$7f) u<>
Gibt aggregierte Analyse aller Trades zurück (nicht einzelne Trades).
Nutzt vorberechnete Daten aus analytics_exchange_daily.
z<EFBFBD>
select
date_trunc('day', timestamp) as date,
count(*) as trade_count,
sum(price * quantity) as volume,
avg(price) as avg_price
from trades
where isin = 'z('
and timestamp > dateadd('d', -zB, now())
group by date
order by date desc
z<>
select
timestamp as date,
exchange,
trade_count,
volume
from analytics_exchange_daily
where timestamp >= dateadd('d', -z:, now())
order by date desc, exchange asc
r;rz@analytics_exchange_daily is empty, calculating from trades tablez<65>
select
date_trunc('day', timestamp) as date,
exchange,
count(*) as trade_count,
sum(price * quantity) as volume
from trades
where timestamp >= dateadd('d', -zZ, now())
group by date, exchange
order by date desc, exchange asc
)r6r+<00>len<65>logger<65>infor<)r=r>r r7s r<00>
get_tradesrC5s<><00><00><00>  <0C><17><1C>f<EFBFBD>'<27>'+<2B>f<EFBFBD>- <09>  <0C><05>*<2A>+/<2F><16>0 <09>  <0C><05> <19><15> <1F>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>c<EFBFBD>$<24>(<28>(<28>9<EFBFBD>b<EFBFBD>2I<32>.J<>a<EFBFBD>.O<><0E> <0B> <0B>V<>X<>*<2A>+/<2F><16>0 <09>
 <0C><05><1D>U<EFBFBD>#<23><04> "<22>4<EFBFBD> (<28>(<28>s<00>BBz /api/metadatac<00><00>:# <00>Sn[U5n[U5$7f)uGibt alle Metadata zurückzselect * from metadata<74>r6r<)r r7s r<00> get_metadatarFjs!<00><00><00> %<25>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00>z /api/summaryc<00><00># <00>U(aSUS3nOSn[U5nU(a URS5(a
US(d0[RS5 U(aSUS3nOSn[U5nU(akURS5(aUUS(aKUSS S (a USS S OS nUSS S
(a USS S
OS nS S 0S S0S S0/SX4//S.$Sn[U5n[ U5$7f)u<>
Gibt Zusammenfassung zurück. Nutzt analytics_daily_summary für total_trades.
Optional: days Parameter für Zeitraum-basierte Zusammenfassung.
z<EFBFBD>
select
sum(total_trades) as total_trades,
sum(total_volume) as total_volume
from analytics_daily_summary
where timestamp >= dateadd('d', -<2D>, now())
z<>
select
sum(total_trades) as total_trades,
sum(total_volume) as total_volume
from analytics_daily_summary
r;z?analytics_daily_summary is empty, calculating from trades tablez<65>
select
count(*) as total_trades,
sum(price * quantity) as total_volume
from trades
where timestamp >= dateadd('d', -z, now())
z<>
select
count(*) as total_trades,
sum(price * quantity) as total_volume
from trades
r<00>gr<00> continent<6E> trade_count<6E> total_volume<6D>Allr9z<>
select
coalesce(m.continent, 'Unknown') as continent,
count(*) as trade_count,
sum(t.price * t.quantity) as total_volume
from trades t
left join metadata m on t.isin = m.isin
group by continent
)r6r+rArBr<)r>r r7<00> total_tradesrLs r<00> get_summaryrOqs><00><00><00>  <0C>*<2A>
+/<2F><16>0 <09>  <0C><05> <0C><05> <19><15> <1F>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>$<24>y<EFBFBD>/<2F><0E> <0B> <0B>U<>W<> <0F>.<2E>
/3<>V<EFBFBD>4 <0A> <10>E<EFBFBD><10>E<EFBFBD> <1D>U<EFBFBD>#<23><04> <0B><04><08><08><19>#<23>#<23><04>Y<EFBFBD><0F>04<30>Y<EFBFBD><0F><01>0B<30>1<EFBFBD>0E<30>t<EFBFBD>I<EFBFBD><EFBFBD>q<EFBFBD>)<29>!<21>,<2C>1<EFBFBD> <0C>04<30>Y<EFBFBD><0F><01>0B<30>1<EFBFBD>0E<30>t<EFBFBD>I<EFBFBD><EFBFBD>q<EFBFBD>)<29>!<21>,<2C>3<EFBFBD> <0C>
<18><1B>%<25><17><1D>'<27><17><1E>(<28><0E>
<1F> <0C>;<3B><<3C> 
<EFBFBD>
<EFBFBD> <08>E<EFBFBD> <19><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00>C=C?z/api/statistics/total-tradesc<00><00><># <00>U(aSUS3nOSn[U5nU(aAURS5(a+US(a!USSS(a USSSOSnSU0$SS0$7f)ukGibt Gesamtzahl aller Trades zurück (aus analytics_daily_summary). Optional: days Parameter für Zeitraum.z`select sum(total_trades) as total from analytics_daily_summary where timestamp >= dateadd('d', -z, now())z>select sum(total_trades) as total from analytics_daily_summaryr;rrN)r6r+)r>r r7<00>totals r<00>get_total_tradesrR<00>s<><00><00><00> <0C>r<>sw<73>rx<72>yA<02>B<02><05>P<><05> <18><15> <1F>D<EFBFBD> <0B><04><08><08><19>#<23>#<23><04>Y<EFBFBD><0F>)-<2D>i<EFBFBD><1F><11>);<3B>A<EFBFBD>)><3E><04>Y<EFBFBD><0F><01>"<22>1<EFBFBD>%<25>A<EFBFBD><05><1E><05>&<26>&<26> <1A>A<EFBFBD> <1E><1E>s<00>A(A*z/api/custom-analytics<63>exchange<67> date_from<6F>date_to<74>x_axis<69>y_axis<69>group_by<62> exchangesc<00><00>4# <00>/SQn/SQn/SQnX&;a [SSU3S9eX7;a [SSU3S9eXH;a [SSU3S9eUS :wa<>S
S S S.n S SS.n
S SSS.n X<>n X<>n X<>nSU SUSU SUSUS3 nU(aLSRURS5Vs/sHnSUR5S3PM sn5nUSUS3- nUSU SUSU SUS3 - n[ US S!9n[ U5$S"nU(a<>URS5Vs/sHnUR5PM nn[ U5S#:XaUS$nOaS%US&US':XaS
O US(:XaS OS S)US*US+SRUVs/sH nSUS3PM sn5S,US-US.3n[ US S!9n[ U5$S/US0US1US2US3US43 n[ US5S!9nU(aURS65(d<>[RS75 S
S S S.n S SSS.n X<>n X<>nS8USU SUSUS3 nU(aLSRURS5Vs/sHnSUR5S3PM sn5nUSUS3- nUS9US:3- n[ US S!9n[ U5$s snfs snfs snfs snf7f);u<>
Flexibler Analytics-Endpunkt für custom Graphen.
Nutzt vorberechnete Daten aus analytics_custom für bessere Performance.
Parameters:
- date_from: Startdatum (YYYY-MM-DD)
- date_to: Enddatum (YYYY-MM-DD)
- x_axis: X-Achse (date, exchange, isin) - aktuell nur "date" unterstützt
- y_axis: Y-Achse (volume, trade_count, avg_price)
- group_by: Gruppierung (exchange, isin, date)
- exchanges: Komma-separierte Liste von Exchanges (optional)
)<03>daterSr=)<03>volumerK<00> avg_price)rSr=r[<00><>z Invalid x_axis. Must be one of: r'z Invalid y_axis. Must be one of: z"Invalid group_by. Must be one of: r[zsum(price * quantity)<29>count(*)z
avg(price)rSr=)rSr=zdate_trunc('day', timestamp)z
select
z as x_value,
z as group_value,
z< as y_value
from trades
where timestamp >= 'z'
and timestamp <= 'z
'
<20>,<2C>'z and exchange in (<28>)<29>
group by <20>, z
order by z asc, z asc<73><00>r!<00>allrIrzK
select
timestamp as x_value,
z! as group_value,
r\rKzD as y_value
from trades
where timestamp >= 'z '
and timestamp <= 'z'
and exchange in (z")
group by timestamp, z%
order by timestamp asc, z asc
z<>
select
timestamp as x_value,
group_value,
y_value
from analytics_custom
where timestamp >= 'z'
and timestamp <= 'z'
and y_axis = 'z'
and group_by = 'z'
and exchange_filter = 'z2'
order by timestamp asc, group_value asc
<20>r;z:No pre-calculated data found, falling back to direct queryzR
select
date_trunc('day', timestamp) as x_value,
z( group by date_trunc('day', timestamp), z& order by x_value asc, group_value asc)
r<00>join<69>split<69>stripr6r<r@r+rA<00>warning)rTrUrVrWrXrY<00> valid_x_axis<69> valid_y_axis<69>valid_group_by<62>
y_axis_map<EFBFBD>
x_axis_map<EFBFBD> group_by_map<61>y_metric<69>x_label<65>group_by_fieldr r5<00> exchange_listr7<00>exchange_filters r<00>get_custom_analyticsrx<00>s<><00><00><00>,0<>L<EFBFBD>9<>L<EFBFBD>1<>N<EFBFBD> <0A>!<21><1B><03>6V<36>Wc<57>Vd<56>4e<34>f<>f<> <0A>!<21><1B><03>6V<36>Wc<57>Vd<56>4e<34>f<>f<><0F>%<25><1B><03>6X<36>Yg<59>Xh<58>4i<34>j<>j<><0E><16><17>.<2E>%<25>%<25>
<EFBFBD>
<EFBFBD> #<23><1A>
<EFBFBD>
<EFBFBD>
#<23><1A>2<>
<EFBFBD> <0C> <1E>%<25><08><1C>$<24><07>%<25>/<2F><0E> <0A> <14>I<EFBFBD> <0A> <1B> <1C> <0A> <15>J<EFBFBD><1D>&<26>K<EFBFBD>(<1B>"<22>)<29>$ <09> <0C><05> <15><1F>H<EFBFBD>H<EFBFBD> <09><0F><0F>PS<50>@T<>%U<>@T<>1<EFBFBD><01>!<21>'<27>'<27>)<29><1B>A<EFBFBD>&6<>@T<>%U<>V<>M<EFBFBD> <11>)<29>-<2D><1F><01>:<3A> :<3A>E<EFBFBD> <0A>:<3A>g<EFBFBD>Y<EFBFBD>b<EFBFBD><1E>(8<>
<EFBFBD>7<EFBFBD>)<29>6<EFBFBD>R`<60>Qa<51>ae<61>f<>f<><05><1C>U<EFBFBD>B<EFBFBD>/<2F><04>&<26>t<EFBFBD>,<2C>,<2C><1C>O<EFBFBD><10>-6<>O<EFBFBD>O<EFBFBD>C<EFBFBD>,@<40>A<>,@<40>q<EFBFBD><11><17><17><19>,@<40> <0A>A<> <0E>}<7D> <1D><11> "<22>+<2B>A<EFBFBD>.<2E>O<EFBFBD><11><1A>
<EFBFBD><11>,2<>h<EFBFBD>,><3E>(<28>RX<52>\i<>Ri<52>J<EFBFBD>o{<7B>|<7C>}!<21>!*<2A> <0B>,<1F>&<26>i<EFBFBD>(<1E>!<21>h<EFBFBD>h<EFBFBD>-<2D>'H<>-<2D>Q<EFBFBD>!<21>A<EFBFBD>3<EFBFBD>a<EFBFBD><08>-<2D>'H<>I<>J<>K!<21>!)<29>
<EFBFBD>+%<25>%-<2D>J<EFBFBD>/ <0A> <10>E<EFBFBD>!<21><15><02>3<>D<EFBFBD>*<2A>4<EFBFBD>0<> 0<><19> #<23> <0B>$<17><1E>i<EFBFBD> <13><19>(<28><15><1D>J<EFBFBD><1C>+<2B>,<2C>-<05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> <0F>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A><0E><0E><0E>S<>U<>-<2D>%<25>%<25>
<EFBFBD>
<EFBFBD> #<23><1A>2<>
<EFBFBD> <0C> <1E>%<25><08>%<25>/<2F><0E> <0A><1C> <1C> <0A> <15>J<EFBFBD><1D>&<26>K<EFBFBD>(<1B>"<22>)<29>$ <09> <0C><05> <15><1F>H<EFBFBD>H<EFBFBD> <09><0F><0F>PS<50>@T<>%U<>@T<>1<EFBFBD><01>!<21>'<27>'<27>)<29><1B>A<EFBFBD>&6<>@T<>%U<>V<>M<EFBFBD> <11>)<29>-<2D><1F><01>:<3A> :<3A>E<EFBFBD> <0A>;<3B>N<EFBFBD>;K<>Kq<4B>r<>r<><05><1C>U<EFBFBD>B<EFBFBD>/<2F><04> "<22>4<EFBFBD> (<28>(<28><>i&V<01><>B<01><>(I<01><>f&V<01>s:<00>BJ<01>J<08>=AJ<01>J <04>*AJ<01>-J<1A>=B;J<01>8J<08>AJz/api/statistics/moving-averagec<00><00><># <00>US;a
[SSS9eSUSUSUS3nU(a US US
3- nUS - n[US S 9nU(a5URS5(a[URS/55S:Xa:[R S5 SUS3nU(a US US
3- nUS- n[USS 9n[ U5$7f)u<>
Gibt Moving Average Daten für Tradezahlen und Volumen je Exchange zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
<EFBFBD><06><00><00>*<00>E<00><>imr^<00>?Invalid days parameter. Must be one of: 7, 30, 42, 69, 180, 365r'zi
select
timestamp as date,
exchange,
trade_count,
volume,
maz_count as ma_count,
maz\_volume as ma_volume
from analytics_exchange_daily
where timestamp >= dateadd('d', -z , now())
z and exchange = 'raz order by date asc, exchange ascrhrfr;rzOanalytics_exchange_daily is empty, calculating moving average from trades tablea9
select
date_trunc('day', timestamp) as date,
exchange,
count(*) as trade_count,
sum(price * quantity) as volume,
count(*) as ma_count,
sum(price * quantity) as ma_volume
from trades
where timestamp >= dateadd('d', -rHz8 group by date, exchange order by date asc, exchange asc<73>
)rr6r+r@rArBr<)r>rSr r7s r<00>get_moving_averager<65>_s<00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <0B> <10>&<26> <0B> <0F>&<26>&<26>&*<2A>V<EFBFBD>,<05>
<08>E<EFBFBD><10> <0A>$<24>X<EFBFBD>J<EFBFBD>a<EFBFBD>0<>0<><05> <09> /<2F>/<2F>E<EFBFBD> <18><15><01> *<2A>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A>c<EFBFBD>$<24>(<28>(<28>9<EFBFBD>b<EFBFBD>2I<32>.J<>a<EFBFBD>.O<><0E> <0B> <0B>e<>g<> *<2A>+/<2F><16>0 <09>
 <0C><05> <14> <11>(<28><18>
<EFBFBD>!<21>4<> 4<>E<EFBFBD> <0A>K<>K<><05><1C>U<EFBFBD>B<EFBFBD>/<2F><04> "<22>4<EFBFBD> (<28>(<28>s<00>B=B?z/api/statistics/volume-changesc<00><00># <00>US;a
[SSS9eSUS3n[USS9nU(aURS 5(d5[R S
US 35 S US US- SUS- S3n[USS9n[ U5$7f)ut
Gibt Änderungen in Volumen und Anzahl je Exchange zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
rzr^r<>r'z<>
select
exchange,
trade_count,
volume,
count_change_pct,
volume_change_pct,
trend
from analytics_volume_changes
where period_days = z.
order by timestamp desc
limit 20
rhrfr;z+No pre-calculated volume changes found for z days, calculating on-the-flya
with
first_half as (
select
exchange,
count(*) as trade_count,
sum(price * quantity) as volume
from trades
where timestamp >= dateadd('d', -z7, now())
and timestamp < dateadd('d', -<2D>a;, now())
group by exchange
),
second_half as (
select
exchange,
count(*) as trade_count,
sum(price * quantity) as volume
from trades
where timestamp >= dateadd('d', -a<>, 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
re)rr6r+rArBr<)r>r r7s r<00>get_volume_changesr<73><00>s<><00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <19><1E><06><05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> <10>t<EFBFBD>x<EFBFBD>x<EFBFBD> <09>*<2A>*<2A><0E> <0B> <0B>A<>$<24><16>Gd<47>e<>f<>2<>37<33><16>8/<2F>/3<>A<EFBFBD>v<EFBFBD>h<EFBFBD> 72<37>37<33>q<EFBFBD>&<26><18>#: <09>%5 <0C><05>n<1D>U<EFBFBD>B<EFBFBD>/<2F><04> "<22>4<EFBFBD> (<28>(<28>s<00>A>Bz/api/statistics/stock-trends<64>limitc<00><00>l# <00>US;a
[SSS9eSUSUSUS3n[US S
9n[U5$7f) ur
Gibt Trendanalyse für häufig gehandelte Aktien zurück.
Unterstützte Zeiträume: 7, 30, 42, 69, 180, 365 Tage
rzr^r<>r'z<>
select
timestamp as date,
isin,
trade_count,
volume,
count_change_pct,
volume_change_pct
from analytics_stock_trends
where period_days = z$
and timestamp >= dateadd('d', -z,, now())
order by volume desc
limit z
rhrf)rr6r<)r>r<>r r7s r<00>get_stock_trendsr<73><00>sc<00><00><00>  <0C>,<2C>,<2C><1B><03>4u<34>v<>v<> <19><1E><06>$<24>$(<28>6<EFBFBD>* <0B> <10>'<27><05> <08>E<EFBFBD> <19><15><01> *<2A>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00>24z/api/analytics<63>metric<69> sub_group_by<62>isins<6E>
continentsc <00><00><># <00>SS/n[U/SQU-;U/SQU-;USL/5nU(aSOSn U(aSOSn
SU S U S
3S S U S 3S.n SU S3SU S3U S3U S3U(a SU
SU S3OSU(aSU
S3OSU(aSU
S3OSU(a SU SU
S3OSU(a SU SU
S3OSS. n U RX S5n U RXS 5nS!US"3nU(aX,;a US#X<>S$3- nUS%:Xa US&U S U S'3- nO US#U S(3- nU(aUS)- nUS*- nU(a US+U S,US-3- nU(a US+U S.US-3- nU(aOS/RURS/5Vs/sHnS-UR 5S-3PM sn5nUS+U S0US13- nU(aVU(aOS/RURS/5Vs/sHnS-UR 5S-3PM sn5nUS+U
S2US13- nUS3U3- nU(aX,;a
US#X<>3- nUS4- n[ U5n[ U5$s snfs snf7f)5u&Analytics Endpunkt für Report Builder<65>exchange_continent<6E>exchange_sector)rrJ<00>sectorNzt.<2E>zm.zsum(zprice * z quantity)r_zavg(zprice))r\<00>countr]zdate_trunc('day', z
timestamp)zdate_trunc('month', rSr=z coalesce(zname, zisin)zcontinent, 'Unknown')z 'Unknown'zsector, 'Unknown')zconcat(zexchange, ' - ', coalesce(zcontinent, 'Unknown'))zsector, 'Unknown'))) <09>day<61>monthrSr=rrJr<>r<>r<>r\r<>zselect z as labelrdz as sub_labelrgz, count(*) as value_count, sum(z%quantity) as value_volume from tradesz as value from tradesz* t left join metadata m on t.isin = m.isinz
where 1=1z and ztimestamp >= 'raztimestamp <= 'r`z isin in (rbzcontinent in (rcz order by label asc)<07>anyr+rirjrkr6r<)r<>rXr<>rTrUr<>r<><00>composite_keys<79>needs_metadata<74>t_prefix<69>m_prefix<69> metrics_map<61>
groups_map<EFBFBD>selected_metric<69>selected_groupr <00>i<>
isins_list<EFBFBD>c<> cont_listr7s r<00> get_analyticsr<73>s<00><00><00>+<2B>,=<3D>><3E>N<EFBFBD><18><10>3<>n<EFBFBD>D<>D<><14>7<>.<2E>H<>H<><12>$<24><1E><06><07>N<EFBFBD> &<26>t<EFBFBD>2<EFBFBD>H<EFBFBD>%<25>t<EFBFBD>2<EFBFBD>H<EFBFBD><19><18>
<EFBFBD>(<28>8<EFBFBD>*<2A>I<EFBFBD>><3E><1B><1B>H<EFBFBD>:<3A>V<EFBFBD>,<2C><06>K<EFBFBD>$<24>H<EFBFBD>:<3A>Z<EFBFBD>8<>'<27><08>z<EFBFBD><1A><<3C><1F>j<EFBFBD><08>)<29><1B>*<2A>D<EFBFBD>!<21>?M<>)<29>H<EFBFBD>:<3A>V<EFBFBD>H<EFBFBD>:<3A>U<EFBFBD>;<3B>SY<53>DR<44>y<EFBFBD><18>
<EFBFBD>*?<3F>@<40>Xc<58>>L<>I<EFBFBD>h<EFBFBD>Z<EFBFBD>'9<>:<3A>R]<5D>p~<7E><07><08>z<EFBFBD>1K<31>H<EFBFBD>:<3A>Uk<55>l<>EP<02>jx<6A>W<EFBFBD>X<EFBFBD>J<EFBFBD>.H<><18>
<EFBFBD>Re<EFBFBD>f<>J<02>
<06>J<EFBFBD>"<22>o<EFBFBD>o<EFBFBD>f<EFBFBD>(<28>.C<>D<>O<EFBFBD><1F>^<5E>^<5E>H<EFBFBD><15>.?<3F>@<40>N<EFBFBD><15>n<EFBFBD>%<25>Y<EFBFBD> /<2F>E<EFBFBD><13> <0C>2<> <0A>2<EFBFBD>j<EFBFBD>.<2E>/<2F>}<7D>=<3D>=<3D><05> <0A><15><EFBFBD> <0A>2<>8<EFBFBD>*<2A>H<EFBFBD>X<EFBFBD>J<EFBFBD>Ns<4E>t<>t<><05> <0A>2<EFBFBD>o<EFBFBD>&<26>&;<3B><<3C><<3C><05><15> <0A>=<3D>=<3D><05> <09>\<5C><19>E<EFBFBD><10> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><19> <0B>1<EFBFBD>=<3D>=<3D><05><0E> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><17> <09><11>;<3B>;<3B><05> <0C><18>X<EFBFBD>X<EFBFBD><15><1B><1B>S<EFBFBD>9I<39>J<>9I<39>A<EFBFBD><11>1<EFBFBD>7<EFBFBD>7<EFBFBD>9<EFBFBD>+<2B>Q<EFBFBD>/<2F>9I<39>J<>K<>
<EFBFBD> <0A>5<EFBFBD><18>
<EFBFBD>)<29>J<EFBFBD><<3C>q<EFBFBD>9<>9<><05><11>n<EFBFBD><17>H<EFBFBD>H<EFBFBD>
<EFBFBD>8H<EFBFBD>8H<EFBFBD><13>8M<38>N<>8M<38>1<EFBFBD><01>!<21>'<27>'<27>)<29><1B>A<EFBFBD>.<2E>8M<38>N<>O<> <09> <0A>5<EFBFBD><18>
<EFBFBD>.<2E><19> <0B>1<EFBFBD>=<3D>=<3D><05> <09>z<EFBFBD>.<2E>)<29> *<2A>*<2A>E<EFBFBD><13> <0C>2<> <0A>2<EFBFBD>j<EFBFBD>.<2E>/<2F>0<>0<><05> <09> "<22>"<22>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28><>K<01><>O<01>s<00>E-I<01>/H6<08> ?I<01> H;<08>*AIz/api/metadata/search<63>qc<00><00>H# <00>SUSUS3n[U5n[U5$7f)z(Case-insensitive search for ISIN or Namez3select isin, name from metadata where isin ilike '%z%' or name ilike '%z %' limit 10rE)r<>r r7s r<00>search_metadatar<61>Ts5<00><00><00>B<01>!<21><13>DW<44>XY<58>WZ<57>Ze<5A> f<>E<EFBFBD> <18><15> <1F>D<EFBFBD> "<22>4<EFBFBD> (<28>(<28>s<00> "<01>__main__z0.0.0.0i@)<02>host<73>port)r<>)Nr{)N)r[r\rSN)r{N)r{)r{<00>)r\r<>NNNNN)+<2B>fastapirr<00>fastapi.middleware.corsr<00>fastapi.staticfilesr<00>fastapi.responsesrr*<00>os<6F>typingr r
r <00>app<70>add_middleware<72>mountr+r<00>getenvrrr-rr,r3<00>intr6r<rCrFrOrRrxr<>r<>r<>r<>r<><00>__name__<5F>uvicorn<72>runrrr<00><module>r<>sj<00><01>*<2A>2<>+<2B>*<2A><0F> <09>&<26>&<26> <0A>+<2B>,<2C><03><03><12><12><12><16>%<25><16>%<25><16>%<25> <13><02><04> <09> <09>)<29>[<5B>+=<3D>><3E>X<EFBFBD> <09>N<><04><17><17><13><1C>7<><0E>7<> <0A>)<29>)<29>I<EFBFBD>w<EFBFBD>
'<27><07><10>i<EFBFBD>i<EFBFBD> <0A>w<EFBFBD>/<2F> <0B>$+<2B> <0B>7<EFBFBD>K<EFBFBD>
<20><14><07>
<0C>)<29>)<29>I<EFBFBD>y<EFBFBD>
)<29><07> <12>7<EFBFBD>)<29>5<EFBFBD> !<21><06> [<01><13> [<01>s<EFBFBD> [<01>H<EFBFBD>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>4L<34> [<01><10>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E><10>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E><10><05><17><17><1D><17>2)<29>3<EFBFBD>2)<29>S<EFBFBD>2)<29><18>2)<29>h<05><17><17><1F><19>)<29><1A>)<29> <05><17><17><1E><18>F)<29>C<EFBFBD>F)<29><19>F)<29>P<05><17><17> '<27>(<28>
<1F><13>
<1F>)<29>
<1F><05><17><17> <20>!<21><19><1A><1E><19> U)<29><12>U)<29> <10>U)<29> <10>U)<29> <10> U)<29>
<12> U)<29> <13> U)<29>"<22>U)<29>n<05><17><17> )<29>*<2A>/)<29>3<EFBFBD>/)<29>c<EFBFBD>/)<29>+<2B>/)<29>b<05><17><17> )<29>*<2A>W)<29>3<EFBFBD>W)<29>+<2B>W)<29>r<05><17><17> '<27>(<28>)<29><13>)<29><13>)<29>)<29>)<29>4<05><17><17> <19><1A><1A><19><1C><19><17><15><1A>K)<29> <0F>K)<29><11>K)<29><16>K)<29><13> K)<29>
<11> K)<29> <0F> K)<29><14>K)<29><1B>K)<29>Z<05><17><17> <1F> <20>)<29>S<EFBFBD>)<29>!<21>)<29>  <0C>z<EFBFBD><19><12> <0B>K<EFBFBD>K<EFBFBD><03>)<29>$<24>/<2F>r