43 KiB
Finlytic Systemdokumentation (STATE.md)
Dieses Dokument bietet eine lückenlose, detaillierte und strukturierte Gesamtdokumentation der gesamten Finlytic-Plattform. Es umfasst die Architektur, alle Konfigurationen & Einstellungen, mathematische/finanzielle Formeln, sämtliche Schnittstellen (MQTT RPC, MQTT Pub/Sub, REST API, SignalR Hubs), Datenbankstrukturen sowie die genaue Funktionsweise der 9 Microservices und des Flutter-Frontends.
Inhaltsverzeichnis
- Systemarchitektur & Topologie
- Microservices-Übersicht & Datenbanken
- Einstellungen & Konfiguration (Settings)
- Mathematische, Technische & Finanzielle Formeln
- Schnittstellen & Endpunkte
- Detaillierte Funktionsweise & Datenfluss
- Frontend-Architektur (FinlyticApp)
1. Systemarchitektur & Topologie
Finlytic ist eine modulare, ereignisgesteuerte Finanzanalyse- und automatisierte Trading-Plattform für Aktien und Derivate (Knock-Out-Zertifikate, Optionsscheine).
┌────────────────────────────────────────────────────────────────────────┐
│ FinlyticApp (Flutter Web & Mobile) │
└───────────────────────────────────┬────────────────────────────────────┘
│ HTTP / WebSocket (SignalR)
▼
┌────────────────────────────────────────────────────────────────────────┐
│ FinlyticBackend (API & Gateway) │
└───────────────────────────────────┬────────────────────────────────────┘
│ MQTT RPC & Pub/Sub
┌──────────────┬───────────────┼──────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼
┌──────────┐ ┌──────────────┐ ┌───────────┐ ┌─────────────┐ ┌────────────┐
│Finlytic │ │FinlyticNews │ │Finlytic │ │Finlytic │ │Finlytic │
│Assets │ │ │ │Sentiment │ │Fundamentals │ │Technicals │
└────┬─────┘ └──────┬───────┘ └─────┬─────┘ └──────┬──────┘ └─────┬──────┘
│ │ │ │ │
└──────────────┴───────┬───────┴──────────────┴──────────────┘
│ MQTT (Signale, Scores, Setups)
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────────┐ ┌────────────┐
│Finlytic │ ──────► │FinlyticBot │ │Finlytic │
│Engine │ (Trades)│(Auto-Trading)│ │Simulation │
└────┬─────┘ └──────────────┘ └────────────┘
│
▼
┌──────────┐
│Finlytic │ ──────► ntfy Push-Server (Mobil & Webhooks)
│Notify │
└──────────┘
Kernprinzipien & Regeln (Rules.md):
- MQTT-Exklusivität im Backend: Alle internen Microservices kommunizieren ausschließlich über MQTT. Es gibt keine direkten HTTP-Verbindungen zwischen Backend-Diensten.
- Einziges Web-Gateway:
FinlyticBackendist der einzige Dienst mit Kestrel-HTTP/WebSocket-Port (5000:8080). - Strikte Datenisolation: Jeder Service besitzt seine eigene PostgreSQL-Datenbank (keine geteilten Tabellen).
- Dynamische Konfiguration: Dynamic Settings (
ISettingsService) werden in DB persistiert und per MQTT aktualisiert, ohne Neustart. - Kanalbasiertes Logging: Jeder Service sendet strukturierte Logs per MQTT (
finlytic/logs/{service}), die im Admin-Panel live gestreamt werden. - Keine Scheindaten: Reine Echtdaten oder explizite Empty-States/Exceptions.
2. Microservices-Übersicht & Datenbanken
| Service | Typ / Basis | PostgreSQL-Datenbank | Hauptaufgabe |
|---|---|---|---|
| FinlyticCore | Shared Class Library | (Keine eigene DB) | Gemeinsame DTOs, Enums, MQTT-Clients, TradeRepublic-Client, Settings-Interface. |
| FinlyticAssets | Background Worker | finlytic_assets |
Stammdaten-Synchronisation (Stocks, ETFs), Lokale Logo-Speicherung, Trade Republic Ticker-Proxy, KO-Derivate-Abfrage. |
| FinlyticNews | Playwright Worker | finlytic_news |
Scraping von 10 Finanzportalen, Duplikaterkennung (SimHash/Jaccard), Regex/NLP-Asset-Matching, Sector-Clustering. |
| FinlyticSentiment | Background Worker | finlytic_sentimental |
FinBERT KI-Sentiment-Analyse (Deutsch & Englisch Webhooks), Exponentielle Zeit-Decay-Gewichtung (\lambda = \ln(2)/\tau). |
| FinlyticFundamentals | Playwright Worker | finlytic_fundamentals |
Fundamentaldaten & Kennzahlen (KGV, ROE, Cashflow, Analysten-Ratings, Dividenden, Earnings-Kalender). |
| FinlyticTechnicals | Background Worker | finlytic_ta |
Multi-Timeframe-Kerzen (15m, 1h, 1d), 10 Kernstrategien, 15 Pattern-Detektoren (SMC & Chart), Symmetrisches Scoring V2. |
| FinlyticEngine | Background Worker | finlytic_engine |
Composite Opportunity Scorer (COS V2), Earnings/Dividenden-Sperren, n8n AI Reasoning Gate, Trade Lifecycle & Monitoring. |
| FinlyticSimulation | Background Worker | finlytic_simulation |
Quantitative Backtesting-Engine, Replay-Runner (Anti-Lookahead), Zuverlässigkeitsmatrix, Slippage- & Gebührenmodellierung. |
| FinlyticBot | Background Worker | finlytic_bot |
Automatisierte Orderausführung (1-2% Risikoregel), Alpaca Paper Trading (US-Equities) & Interner Synthetischer Ledger. |
| FinlyticNotify | Background Worker | finlytic_notify |
Push-Benachrichtigungen via ntfy (Proposals, Trade-Events, Bot-Status, News). |
| FinlyticBackend | ASP.NET Core Kestrel | finlytic_backend |
JWT-Authentifizierung, User- & Favoritenverwaltung, SignalR-Streaming, MQTT-Bridge. |
3. Einstellungen & Konfiguration (Settings)
3.1 Umgebungsvariablen (compose.yaml / .env)
| Variable | Standardwert | Beschreibung |
|---|---|---|
DB_HOST |
OmniDB |
Hostname der PostgreSQL-Instanz |
DB_PORT |
5432 |
Port der PostgreSQL-Instanz |
DB_PASSWORD |
(Pflichtfeld) | Passwort für den PostgreSQL-Benutzer admin |
MQTT_HOST |
host.docker.internal |
Hostname des MQTT-Brokers (z.B. Mosquitto) |
MQTT_PORT |
4545 |
Port des MQTT-Brokers |
JWT_SECRET_KEY |
(Pflichtfeld, \ge 32 Zeichen) |
Signaturschlüssel für JWT-Token |
ADMIN_DEFAULT_PASSWORD |
(Pflichtfeld) | Initiales Passwort für den Standard-Admin |
FINLYTIC_DATA_ROOT |
C:/Users/larsh/Documents/docker/finlytic |
Pfad für persistente Assets (Logos, Index) |
NTFY_BASE_URL |
http://host.docker.internal:8080 |
Basis-URL des ntfy-Push-Servers |
Webhooks__German |
https://n8n.kleidukos.me/webhook/sentiment/de |
FinBERT Webhook für deutsche Artikel |
Webhooks__English |
https://n8n.kleidukos.me/webhook/sentiment/en |
FinBERT Webhook für englische Artikel |
Ai__N8nValidationWebhookUrl |
https://n8n.kleidukos.me/webhook/trade-validation |
n8n Webhook für AI-Trade-Validierung |
3.2 Dynamische Service-Einstellungen (ISettingsService)
Jeder Microservice verwaltet typisierte, zur Laufzeit änderbare Konfigurationswerte:
FinlyticAssets (SettingKeys.cs)
Logging.Channel.Assets(bool, default:true): Logging für Asset-ScansLogging.Channel.MQTT(bool, default:true): Logging für MQTT-VerkehrLogging.Channel.Health(bool, default:true): Logging für Ping-HealthchecksLogging.Channel.TradeRepublic(bool, default:true): Logging für TR-WebSocketTradeRepublic.WsReconnectIntervalSeconds(int, default:5): Reconnect-WartezeitTradeRepublic.WsTimeoutSeconds(int, default:15): Timeout für TR-AnfragenScanner.EnableAutoScan(bool, default:true): Automatischer Asset-Sync aktiviertScanner.CurrentScanningType(string, default:"Stock"): Aktueller Typ im LoopScanner.CurrentScanningPage(int, default:0): Aktuelle Paginierungsseite (Recovery-Modus)Scanner.FinishedInitialScan(bool, default:false): Status des Initial-ScansScanner.BatchAssetUpdateDelay(int, default:0): Pause zwischen Batches (Sekunden)Scanner.AssetUpdateTypeDelay(int, default:0): Pause zwischen Typen (Sekunden)Scanner.TradeRepublicMaxRequestPageSize(int, default:50): Batchgröße pro TR-CallScanner.CycleDelayMinutes(int, default:1440): Wartezeit bis zum nächsten Vollscan (24h)
FinlyticNews (SettingKeys.cs)
Logging.Channel.News(bool, default:true): News-Verarbeitungs-LogsLogging.Channel.Scraper(bool, default:true): Scraper-Adapter-LogsLogging.Channel.Matcher(bool, default:true): In-Memory Asset-Matcher-LogsLogging.Channel.Deduplication(bool, default:true): Duplikaterkennungs-LogsScraping.IntervalMinutes(int, default:15): Scraping-IntervallScraping.MaxArticlesPerFeed(int, default:20): Maximale Artikel pro FeedFeature.EnableAutoScraping(bool, default:true): Automatisches Scraping aktivScraping.HttpTimeoutSeconds(int, default:30): Timeout für HTTP/PlaywrightDeduplication.TitleSimilarityThreshold(double, default:0.85): Jaccard-SchwellenwertDeduplication.SimHashMaxHammingDistance(int, default:3): Max. SimHash-BitdistanzDeduplication.WindowDays(int, default:7): Historienfenster für DuplikateMatching.MinNameLength(int, default:3): Minimale Zeichenlänge für NamensmatchingMatching.EnableSectorClustering(bool, default:true): Sektorenprüfung bei EinzeltreffernMatching.RequireFinancialContextForShortNames(bool, default:true): Finanzkontext für kurze NamenData.ArticleRetentionDays(int, default:90): Aufbewahrungsdauer für News
FinlyticSentiment (SettingKeys.cs)
Logging.Channel.Sentiment(bool, default:true): Sentiment-LogsSentiment.GermanWebhookUrl(string, default:https://n8n.kleidukos.me/webhook/sentiment/de)Sentiment.EnglishWebhookUrl(string, default:https://n8n.kleidukos.me/webhook/sentiment/en)Sentiment.MinimumConfidenceThreshold(double, default:0.60): MindestkonfidenzSentiment.TimeDecayHalfLifeDays(double, default:7.0): Halbwertszeit\taufür Zeit-DecaySentiment.SentimentWindowDays(int, default:30): Zeitfenster für AggregationSentiment.AnalysisBatchSize(int, default:10): Artikel pro AnalysezyklusSentiment.PollIntervalSeconds(int, default:30): Polling für neue ArtikelSentiment.EnableAutoSentiment(bool, default:true): Automatische Analyse aktiv
FinlyticFundamentals (SettingKeys.cs)
Logging.Channel.Fundamentals(bool, default:true): Fundamentaldaten-LogsLogging.Channel.HtmlScrapper(bool, default:true): Playwright-Scraper-LogsLogging.Channel.YahooClient(bool, default:true): Yahoo Finance API-LogsFeature.EnableHtmlFallback(bool, default:true): HTML-Scraping falls API fehltScraper.ForceHtmlFallback(bool, default:false): HTML-Scraping erzwingenFeature.AllowForceRefresh(bool, default:true): Cache-Umgehung erlaubenCache.FundamentalDataValidityDays(int, default:30): Cache-Gültigkeit
FinlyticTechnicals (SettingKeys.cs)
Logging.Channel.TechnicalAnalysis(bool, default:true): TA-Berechnungs-LogsIndicators.RsiPeriod(int, default:14): RSI-PeriodeIndicators.MacdFastPeriod(int, default:12): MACD Fast EMAIndicators.MacdSlowPeriod(int, default:26): MACD Slow EMAIndicators.MacdSignalPeriod(int, default:9): MACD Signal LineIndicators.EmaShortPeriod(int, default:50): EMA ShortIndicators.EmaLongPeriod(int, default:200): EMA LongIndicators.BollingerBandsPeriod(int, default:20): Bollinger-PeriodeIndicators.BollingerBandsStdDev(double, default:2.0): Bollinger StandardabweichungIndicators.AtrPeriod(int, default:14): ATR-PeriodeCache.DurationMinutes(int, default:60): Cache-Dauer
FinlyticEngine (EngineSettingKeys.cs)
Engine.MinCompositeScore(decimal, default:75.0): Mindest-Gesamtscore für ProposalsEngine.WeightTechnical(decimal, default:0.45): Gewichtung Technik (45%)Engine.WeightSentiment(decimal, default:0.35): Gewichtung Sentiment (35%)Engine.WeightFundamental(decimal, default:0.20): Gewichtung Fundamentaldaten (20%)Engine.EarningsLockoutDays(int, default:2): Vorlaufzeit vor Earnings (Score-Suppression)Engine.DividendGateDays(int, default:1): Vorlaufzeit vor Ex-DividendeEngine.MinDerivativeLeverage(decimal, default:5.0): Mindesthebel für KO-DerivateEngine.TargetDefaultLeverage(decimal, default:7.0): Zielhebel für KO-DerivateEngine.KnockOutSafetyBufferPercent(decimal, default:2.0): Sicherheitsabstand Barrier zu SLEngine.AiValidationTimeoutSeconds(int, default:15): Timeout für n8n AI-ValidierungEngine.EnableAiValidation(bool, default:true): KI-Gate aktiv (sonst Fast-Pass)Engine.EnablePaperTradingBot(bool, default:false): Automatische Bot-AusführungEngine.PollingIntervalSeconds(int, default:120): Poller-Intervall (Opportunity-Scan)Engine.MonitoringIntervalSeconds(int, default:60): Aktives Trade-Monitoring-IntervallEngine.PollerMinScore(decimal, default:70.0): Mindestscore für FTA-AbfrageEngine.PollerTopPicksOnly(bool, default:true): Nur Top-Picks abfragen (\ge 75)Engine.PollerLimit(int, default:25): Max. Setups pro ScanEngine.ProposalValidityHours(int, default:24): Gültigkeitsdauer eines Vorschlags (24h)
FinlyticSimulation (SimulationSettingKeys.cs)
Simulation.DefaultSlippagePercent(decimal, default:0.00): Slippage deaktiviert (wird in OrdergebührenDefaultOrderFeeEurabgebildet)Simulation.DefaultOrderFeeEur(decimal, default:1.00): Ordergebühr pro Transaktion (1 €)Simulation.DefaultStartingCapital(decimal, default:10000.00): Startkapital für BacktestsSimulation.MinSampleTradesForApproval(int, default:5): Mindest-Trades für Matrix-ZulassungSimulation.HighProfitFactorThreshold(decimal, default:1.60): PF für Score-Bonus (+15 Pkt)Simulation.LowProfitFactorThreshold(decimal, default:1.00): PF für Veto-SperreSimulation.KnockOutBarrierBufferPercent(decimal, default:2.0): KO-Barrier-SimulationSimulation.DefaultTrailingStopPercent(decimal, default:3.0): Fallback-Trailing-StopSimulation.EnableScheduledMatrixRecompute(bool, default:true): Periodische Matrix-NeuberechnungSimulation.MatrixRecomputeIntervalHours(int, default:24): Matrix-Stale-Schwelle (24h)Simulation.MatrixRecomputeCheckIntervalMinutes(int, default:60): Recompute-Check-Intervall
FinlyticBot (BotSettingKeys.cs)
Alpaca.KeyId(string): Alpaca API KeyAlpaca.SecretKey(string): Alpaca Secret KeyAlpaca.IsPaper(bool, default:true): Alpaca Paper vs. LiveBot.EnableAutoExecution(bool, default:true): Automatische Ausführung aktivBot.RiskPerTradePercent(decimal, default:1.0): 1% Risiko pro Trade bezogen auf GesamtkapitalBot.MaxPositionAllocationPercent(decimal, default:20.0): Max. 20% Kapital pro EinzelpositionBot.MaxConcurrentPositions(int, default:5): Max. 5 offene Positionen gleichzeitigBot.DailyLossLimitPercent(decimal, default:3.0): Täglicher Verluststopp (3%)Bot.MonitoringIntervalSeconds(int, default:15): Bot-Positionsüberwachung (15s)Bot.SyntheticBaseCapitalEur(decimal, default:50000.0): Startkapital Synthetischer Ledger
FinlyticNotify (NotifySettingKeys.cs)
Ntfy.BaseUrl(string, default:http://localhost:8080)Ntfy.TopicPrefix(string, default:finlytic)Ntfy.BroadcastChannel(string, default:broadcast)Ntfy.NewsChannel(string, default:news)Ntfy.DefaultUsername(string, default:admin)Ntfy.MinProposalScore(decimal, default:70.0)Ntfy.NotifyOnProposals(bool, default:true)Ntfy.NotifyOnTradeUpdates(bool, default:true)Ntfy.NotifyOnBotTrades(bool, default:true)Ntfy.NotifyOnNews(bool, default:true)Ntfy.ClickBaseUrl(string, default:http://localhost:3000)
4. Mathematische, Technische & Finanzielle Formeln
4.1 Technische Indikatoren (TechnicalIndicatorsEngine.cs)
1. Simple Moving Average (SMA)
\text{SMA}_n = \frac{1}{n} \sum_{i=0}^{n-1} P_{t-i}
2. Exponential Moving Average (EMA)
Glättungsfaktor k:
k = \frac{2}{n + 1}
\text{EMA}_t = (P_t \cdot k) + (\text{EMA}_{t-1} \cdot (1 - k))
(Initialisierung über SMA der ersten n Kerzen)
3. Relative Strength Index (RSI - Wilder's Smoothing)
Gewinne U_t = \max(0, P_t - P_{t-1}), Verluste D_t = \max(0, P_{t-1} - P_t)
\overline{U}_t = \frac{\overline{U}_{t-1} \cdot (n-1) + U_t}{n}, \quad \overline{D}_t = \frac{\overline{D}_{t-1} \cdot (n-1) + D_t}{n}
\text{RS} = \frac{\overline{U}_t}{\overline{D}_t}, \quad \text{RSI} = 100 - \frac{100}{1 + \text{RS}}
4. Average True Range (ATR)
\text{TR}_t = \max \left( H_t - L_t, \, |H_t - C_{t-1}|, \, |L_t - C_{t-1}| \right)
\text{ATR}_n = \frac{1}{n} \sum_{i=0}^{n-1} \text{TR}_{t-i}
5. Moving Average Convergence Divergence (MACD)
\text{MACD Line} = \text{EMA}_{12}(P) - \text{EMA}_{26}(P)
\text{Signal Line} = \text{EMA}_9(\text{MACD Line})
\text{Histogram} = \text{MACD Line} - \text{Signal Line}
6. Bollinger Bands & %B
\text{Middle Band} = \text{SMA}_{20}(P)
\sigma = \sqrt{\frac{1}{20} \sum_{i=0}^{19} (P_{t-i} - \text{Middle Band})^2}
\text{Upper Band} = \text{Middle Band} + 2\sigma, \quad \text{Lower Band} = \text{Middle Band} - 2\sigma
\text{Bandwidth} = \frac{\text{Upper} - \text{Lower}}{\text{Middle}} \cdot 100, \quad \%B = \frac{P_t - \text{Lower}}{\text{Upper} - \text{Lower}}
7. Keltner Channels & Volatility Squeeze
\text{KC Middle} = \text{EMA}_{20}(P), \quad \text{KC Upper} = \text{EMA}_{20} + 1.5 \cdot \text{ATR}_{20}, \quad \text{KC Lower} = \text{EMA}_{20} - 1.5 \cdot \text{ATR}_{20}
\text{Squeeze On} \iff \text{BB Lower} > \text{KC Lower} \quad \text{UND} \quad \text{BB Upper} < \text{KC Upper}
8. SuperTrend
\text{HL2} = \frac{H_t + L_t}{2}
\text{Upper Band} = \text{HL2} + 3.0 \cdot \text{ATR}_{10}, \quad \text{Lower Band} = \text{HL2} - 3.0 \cdot \text{ATR}_{10}
9. Average Directional Index (ADX / DMI)
+\text{DM} = \begin{cases} H_t - H_{t-1} & \text{falls } H_t - H_{t-1} > L_{t-1} - L_t \text{ und } > 0 \\ 0 & \text{sonst} \end{cases}
-\text{DM} = \begin{cases} L_{t-1} - L_t & \text{falls } L_{t-1} - L_t > H_t - H_{t-1} \text{ und } > 0 \\ 0 & \text{sonst} \end{cases}
+\text{DI}_{14} = \frac{\sum +\text{DM}}{\sum \text{TR}} \cdot 100, \quad -\text{DI}_{14} = \frac{\sum -\text{DM}}{\sum \text{TR}} \cdot 100
\text{DX} = \frac{|+\text{DI} - -\text{DI}|}{+\text{DI} + -\text{DI}} \cdot 100, \quad \text{ADX} = \text{SMA}_{14}(\text{DX})
10. Volume Weighted Average Price (VWAP)
\text{VWAP} = \frac{\sum_{i=1}^N \left( \frac{H_i + L_i + C_i}{3} \cdot V_i \right)}{\sum_{i=1}^N V_i}
4.2 Symmetrisches Technisches Scoring V2 (TechnicalScoringEngineV2.cs)
\text{FinalScore} = \text{Clamp}\Big( (0.35 \cdot S_{\text{Ind}}) + (0.35 \cdot S_{\text{Pattern}}) + (0.30 \cdot S_{\text{BaseStrategy}}), \; 0, \; 100 \Big)
Indikator-Confluence (S_{\text{Ind}} Basis: 50 Pkt):
- Buy (Long):
\text{EMA}_{20} > \text{EMA}_{50} \implies +15Pkt\text{RSI}_{14} \in [45, 65] \implies +15Pkt\text{ADX}_{14} \ge 25 \implies +10PktP > \text{VWAP} \text{ oder } \text{EMA}_{20} > \text{VWAP} \implies +10Pkt
- Sell (Short):
\text{EMA}_{20} < \text{EMA}_{50} \implies +15Pkt\text{RSI}_{14} \in [35, 55] \implies +15Pkt\text{ADX}_{14} \ge 25 \implies +10PktP < \text{VWAP} \text{ oder } \text{EMA}_{20} < \text{VWAP} \implies +10Pkt
4.3 Exponentielles Zeit-Decay-Sentiment (SentimentDbService.cs)
Jeder Artikel i hat Alter \Delta t_i = \text{Now} - t_{\text{published}} in Tagen und FinBERT-Konfidenz C_i.
Abklingkonstante \lambda:
\lambda = \frac{\ln(2)}{\tau} \quad (\tau = \text{HalfLifeDays}, \text{ Standard: } 7.0)
Gewicht des Artikels w_i:
w_i = \max(0.01, C_i) \cdot e^{-\lambda \cdot \Delta t_i}
Aggregierter gewichteter Sentiment-Score S_{\text{weighted}} \in [-1.0, +1.0]:
S_{\text{weighted}} = \frac{\sum_{i=1}^N (w_i \cdot \text{CompoundScore}_i)}{\sum_{i=1}^N w_i}
4.4 Composite Opportunity Score (COS V2) (CompositeOpportunityScorerV2.cs)
Gewichtete Faktoren:
- Technischer Score
S_{\text{Tech}} \in [0, 100](Gewicht:w_{\text{Tech}} = 0.45) - Sentiment Score
S_{\text{Sent}} \in [0, 100](Gewicht:w_{\text{Sent}} = 0.35):- Für Buy:
S_{\text{Sent}} = \frac{S_{\text{weighted}} + 1}{2} \cdot 100 - Für Sell:
S_{\text{Sent}} = \frac{1 - S_{\text{weighted}}}{2} \cdot 100
- Für Buy:
- Fundamentaler Score
S_{\text{Fund}} \in [0, 100](Gewicht:w_{\text{Fund}} = 0.20):- Richtungsabhängige Bewertung von KGV, ROE, Debt/Equity, Consensus-Rating und Short-Interest.
- Simulations-Matrix-Bonus:
B_{\text{Sim}} = +15falls\text{PF} \ge 1.60, Veto-MultiplikatorM_{\text{Veto}} = 0.20falls\text{PF} < 1.00. - Sperr-Multiplikatoren:
- Earnings-Sperre:
M_{\text{Earnings}} = 0.15falls\text{Tage zu Earnings} \le 2. - Dividenden-Sperre:
M_{\text{Dividend}} = 0.50falls\text{Tage zu Ex-Dividende} \le 1.
- Earnings-Sperre:
\text{RawScore} = (w_{\text{Tech}} \cdot S_{\text{Tech}}) + (w_{\text{Sent}} \cdot S_{\text{Sent}}) + (w_{\text{Fund}} \cdot S_{\text{Fund}}) + B_{\text{Sim}}
\text{COS} = \text{Clamp}\Big( \text{RawScore} \cdot M_{\text{Earnings}} \cdot M_{\text{Dividend}} \cdot M_{\text{Veto}}, \; 0, \; 100 \Big)
4.5 Positionsgrößenbestimmung & Risikomodell (1-2% Regel) (BotOrderExecutor.cs)
Gesamtes Kontokapital E, Risiko pro Trade R_{\%} = 1.0\%, Maximalallokation A_{\%} = 20.0\%.
\text{MaxRiskCapital} = E \cdot \frac{R_{\%}}{100}
\text{UnitRisk} = |\text{EntryPrice} - \text{StopLossPrice}|
Berechnete Stückzahl Q_{\text{calc}}:
Q_{\text{calc}} = \frac{\text{MaxRiskCapital}}{\text{UnitRisk}}
Allokations-Deckelung:
Q_{\text{max}} = \frac{E \cdot \frac{A_{\%}}{100}}{\text{EntryPrice}}
Q_{\text{final}} = \max\Big(1, \, \text{Round}\big(\min(Q_{\text{calc}}, Q_{\text{max}})\big)\Big)
4.6 Quantitative Simulations- & Performancemetriken (VirtualBacktestBroker.cs)
- Win Rate (WR):
\text{WR} = \frac{N_{\text{Wins}}}{N_{\text{Trades}}} \cdot 100 - Profit Factor (PF):
\text{PF} = \frac{\sum \text{Gewinne}}{\sum |\text{Verluste}|} - Erwartungswert (Expectancy in €):
\text{Expectancy} = \left(\frac{\text{WR}}{100} \cdot \overline{\text{Win}}\right) - \left(\left(1 - \frac{\text{WR}}{100}\right) \cdot \overline{\text{Loss}}\right) - Annualisierte Sharpe Ratio:
\overline{R} = \frac{1}{N}\sum R_i, \quad \sigma_R = \sqrt{\frac{1}{N-1}\sum (R_i - \overline{R})^2}\text{Sharpe Ratio} = \frac{\overline{R}}{\sigma_R} \cdot \sqrt{252} - R-Multiple:
R_{\text{mult}} = \frac{\text{Realisierter PnL}}{\text{UnitRisk} \cdot \text{Menge}} - Max Adverse / Favorable Excursion (MAE / MFE):
\text{MAE}_{\text{Long}} = \frac{P_{\text{Entry}} - P_{\text{Min}}}{P_{\text{Entry}}} \cdot 100, \quad \text{MFE}_{\text{Long}} = \frac{P_{\text{Max}} - P_{\text{Entry}}}{P_{\text{Entry}}} \cdot 100
5. Schnittstellen & Endpunkte
5.1 MQTT RPC-Kanäle
Schema: Request auf services/request/{channel}/{correlationId}, Response auf services/response/{channel}/{correlationId}.
Kanalname (MqttTopics.Channels) |
Betreuender Service | Request-DTO | Response-DTO | Beschreibung |
|---|---|---|---|---|
health_Ping |
(Alle Services) | object |
ServiceHealthResponse |
Liveness-Check pro Service |
assets_Get |
FinlyticAssets | GetValidAssetRequest |
List<AssetDto> |
Stammdaten für ISIN auflösen |
assets_GetDiscovery |
FinlyticAssets | GetDiscoveryAssetsRequest |
List<AssetDto> |
Kuratierte Discovery-Assets |
assets_GetDerivatives |
FinlyticAssets | GetDerivativesRequest |
List<DerivativeDto> |
KO-Derivate nach Hebel/Typ suchen |
tr_GetLivePrice |
FinlyticAssets | IsinRequest |
LivePriceDto? |
Realtime-Kurs via Trade Republic |
assets_settings_GetAll |
FinlyticAssets | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
assets_settings_Update |
FinlyticAssets | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
news_Get |
FinlyticNews | DailyNewsRequest |
List<NewsArticleDto> |
Paginierte/gefilterte News |
news_GetById |
FinlyticNews | ArticleRequest |
NewsArticleDto? |
Einzelartikel nach ID |
news_GetPending |
FinlyticNews | object |
List<NewsArticleDto> |
Artikel zur Sentiment-Analyse |
news_UpdateStatus |
FinlyticNews | UpdateNewsStatusRequest |
UpdateNewsStatusResponse |
Artikel-Status aktualisieren |
news_settings_GetAll |
FinlyticNews | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
news_settings_Update |
FinlyticNews | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
sentiment_GetIsin |
FinlyticSentiment | GetSentimentByIsinRequest |
IsinSentimentSummaryDto? |
Aggregiertes Sentiment für ISIN |
sentiment_GetSector |
FinlyticSentiment | GetSectorSentimentRequest |
SectorSentimentSummaryDto? |
Sektoren-Sentiment |
sentiment_GetArticle |
FinlyticSentiment | ArticleRequest |
IsinAnalysisEntry? |
FinBERT-Ergebnis für Artikel |
sentiment_GetAll |
FinlyticSentiment | PaginatedRequest |
List<CompanySentimentSummaryEntity> |
Alle Unternehmens-Sentiments |
sentiment_Analyze |
FinlyticSentiment | JsonElement / NewsArticleDto |
IsinAnalysisEntry? |
Ad-hoc FinBERT-Analyse |
sentiment_settings_GetAll |
FinlyticSentiment | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
sentiment_settings_Update |
FinlyticSentiment | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
fundamentals_Get |
FinlyticFundamentals | IsinRequest / GetFundamentalsRequest |
AssetFundamentalsDto? |
Fundamentaldaten & Kennzahlen |
events_GetAll |
FinlyticFundamentals | object |
List<CorporateEventDto> |
Alle Termine/Events |
events_GetByMonth |
FinlyticFundamentals | GetEventsByMonthRequest |
List<CorporateEventDto> |
Monatliche Termine/Earnings |
fundamentals_settings_GetAll |
FinlyticFundamentals | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
fundamentals_settings_Update |
FinlyticFundamentals | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
ta_GetAnalysis |
FinlyticTechnicals | IsinRequest |
TechnicalAnalysisDto? |
Komplette TA inkl. Indikatoren |
ta_GetSetupsForIsin |
FinlyticTechnicals | IsinRequest |
List<StrategyResultDto> |
Aktive Setups für eine ISIN |
ta_GetSetups |
FinlyticTechnicals | GetSetupsRequest |
List<StrategyResultDto> |
Universe-weite Setups/Top-Picks |
ta_GetCandles |
FinlyticTechnicals | GetCandlesRequest |
IReadOnlyList<CandleDto> |
Kerzen nach Timeframe |
ta_GetWatchlist |
FinlyticTechnicals | object |
List<WatchlistEntryDto> |
Monitorte Universe-Assets |
ta_GetRecentSetupHistory |
FinlyticTechnicals | GetRecentSetupHistoryRequest |
List<StrategyResultDto> |
Historische Setup-Scores |
ta_settings_GetAll |
FinlyticTechnicals | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
ta_settings_Update |
FinlyticTechnicals | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
engine_GetProposals |
FinlyticEngine | GetProposalsRequest |
List<TradeProposalDto> |
Aktive Trade-Vorschläge |
engine_GetTrades |
FinlyticEngine | GetTradesRequest |
List<ActiveTradeDto> |
Aktive Benutzertrades |
engine_EvaluateIsin |
FinlyticEngine | EvaluateIsinRequest |
AssetEvaluationResultDto? |
Manuelle ISIN-Evaluierung |
engine_AddFill |
FinlyticEngine | AddFillRequest |
ActiveTradeDto? |
Teil-/Vollausführung buchen |
engine_UpdateStopLoss |
FinlyticEngine | UpdateStopLossRequest |
ActiveTradeDto? |
Stop-Loss anpassen |
engine_CloseTrade |
FinlyticEngine | CloseTradeRequest |
ActiveTradeDto? |
Trade schließen |
engine_AcceptProposal |
FinlyticEngine | AcceptTradeProposalRequest |
ActiveTradeDto? |
Vorschlag als Trade annehmen |
engine_CreateManualTrade |
FinlyticEngine | CreateManualTradeRequest |
ActiveTradeDto? |
Manuellen Trade eröffnen |
engine_GetEvaluationHistory |
FinlyticEngine | GetEvaluationHistoryRequest |
GetEvaluationHistoryResponse |
Admin-Evaluierungs-Historie |
engine_settings_GetAll |
FinlyticEngine | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
engine_settings_Update |
FinlyticEngine | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
sim_RunBacktest |
FinlyticSimulation | BacktestRequestDto |
BacktestReportDto |
Quantitativen Backtest starten |
sim_GetReliability |
FinlyticSimulation | GetReliabilityRequest |
StrategyAssetReliabilityDto? |
Zuverlässigkeit für Setup |
sim_GetMatrixForAsset |
FinlyticSimulation | IsinRequest |
List<StrategyAssetReliabilityDto> |
Komplette Asset-Matrix |
sim_GetBacktestHistory |
FinlyticSimulation | GetBacktestHistoryRequest |
GetBacktestHistoryResponse |
Historische Backtest-Läufe |
sim_GetBacktestRunDetail |
FinlyticSimulation | RunIdRequest |
BacktestReportDto? |
Detailbericht eines Backtests |
sim_GetStrategyParameters |
FinlyticSimulation | GetStrategyParametersRequest |
StrategyParameterProfileDto? |
Gespeicherte TA-Parameter |
sim_SaveStrategyParameters |
FinlyticSimulation | SaveStrategyParametersRequest |
StrategyParameterProfileDto |
TA-Parameter speichern |
sim_settings_GetAll |
FinlyticSimulation | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
sim_settings_Update |
FinlyticSimulation | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
bot_GetStatus |
FinlyticBot | object |
BotStatusDto |
Bot-Status & Venue |
bot_GetPositions |
FinlyticBot | object |
List<BotTradeOrderDto> |
Offene Bot-Positionen |
bot_GetSummary |
FinlyticBot | object |
AccountSummaryDto |
Kontostand & PnL |
bot_ExecuteProposal |
FinlyticBot | ExecuteProposalRequest |
BotTradeOrderDto? |
Order für Proposal aufgeben |
bot_PanicClose |
FinlyticBot | object |
PanicCloseResultDto |
Notfall-Schließung aller Positionen |
bot_settings_GetAll |
FinlyticBot | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
bot_settings_Update |
FinlyticBot | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
notify_settings_GetAll |
FinlyticNotify | object |
List<DynamicSettingDto> |
Einstellungen abfragen |
notify_settings_Update |
FinlyticNotify | Dictionary<string, object?> |
List<DynamicSettingDto> |
Einstellungen aktualisieren |
backend_GetAggregatedFavorites |
FinlyticBackend | object |
List<string> |
Alle Benutzer-Favoriten-ISINs |
backend_GetUsername |
FinlyticBackend | UserIdRequest |
string? |
Benutzernamen nach GUID |
5.2 MQTT Pub/Sub Event-Topics
| Topic | Publisher | Konsumenten | Payload-Typ | Beschreibung |
|---|---|---|---|---|
services/news/completed |
FinlyticNews | FinlyticSentiment, Backend | NewsArticleDto |
Neuer fertig verarbeiteter Artikel |
finlytic/news/stream/{isin} |
FinlyticNews | BackendMqttBridge | NewsArticleDto |
ISIN-spezifischer News-Stream |
finlytic/sentiment/stream/{isin} |
FinlyticSentiment | FinlyticTechnicals, Backend | IsinSentimentSummaryDto |
Aktualisiertes Sentiment |
finlytic/engine/proposals/created |
FinlyticEngine | FinlyticBot, FinlyticNotify, Backend | TradeProposalDto |
Neuer Trade-Vorschlag erstellt |
finlytic/engine/trades/status_changed |
FinlyticEngine | FinlyticNotify, Backend | ActiveTradeDto |
Trade-Statusänderung (TP/SL/Close) |
finlytic/bot/trades/stream |
FinlyticBot | FinlyticNotify, Backend | BotTradeOrderDto |
Bot-Order-Lifecycle-Event |
finlytic/logs/{service} |
(Alle Services) | BackendMqttBridge | LogMessageDto |
Strukturierter Service-Logstream |
5.3 REST API Endpunkte (FinlyticBackend)
Alle Endpunkte erfordern Authorization: Bearer <JWT> (außer Login und Health).
1. Authentifizierung & Benutzer (/api/v1/auth, /api/v1/user, /api/v1/admin)
POST /api/v1/auth/login[AllowAnonymous]: Login mit Username/Passwort\toJWT Token & User-Objekt.POST /api/v1/auth/change-initial-password: Ändern des Initialpassworts beiRequiresPasswordChange.POST /api/v1/user/fcm-token: Hinterlegen des Firebase Cloud Messaging Push-Tokens.GET /api/v1/user/me: Profil des aktuell angemeldeten Benutzers abrufen.GET /api/v1/admin/users[Roles: Admin]: Benutzerliste.POST /api/v1/admin/users[Roles: Admin]: Neuen Benutzer anlegen.PUT /api/v1/admin/users/{id}[Roles: Admin]: Benutzer bearbeiten (Rolle, Status).DELETE /api/v1/admin/users/{id}[Roles: Admin]: Benutzer deaktivieren/löschen.POST /api/v1/admin/users/{id}/reset-password[Roles: Admin]: Passwort zurücksetzen.
2. Assets & Discovery (/api/v1/assets)
GET /api/v1/assets/search?q={query}: Volltextsuche nach Name/ISIN im lokalen Index.GET /api/v1/assets/discovery?limit={limit}: Kuratierte Trend-/Discovery-Assets.GET /api/v1/assets/{isin}/fundamentals: Fundamentaldaten, KGV, Events.GET /api/v1/assets/{isin}/technicals: TA-Indikatoren, Kerzen, Setups.GET /api/v1/assets/{isin}/live: Trade Republic Realtime-Tick (Bid/Ask/Last).GET /api/v1/assets/{isin}/derivatives?optionType={long|short}&targetLeverage={x}: Passende KO-Zertifikate.GET /api/v1/logo/{isin}[AllowAnonymous]: Lokales SVG-Logo ausliefern.
3. Analyse & Engine (/api/v1/analyze, /api/v1/engine)
POST /api/v1/analyze/manual: Ad-hoc Auswertung einer ISIN (TA, Sentiment, KI-Gate).GET /api/v1/analyze/proposals: Vorschläge abrufen.GET /api/v1/engine/proposals?onlyActive={bool}&limit={limit}: Aktive Vorschläge.GET /api/v1/engine/trades?mode={Manual|Bot}: Trades des eingeloggten Users.POST /api/v1/engine/evaluate: Evaluierungs-Trigger für ISIN.POST /api/v1/engine/trades/{id}/fills: Fill buchen.PUT /api/v1/engine/trades/{id}/stoploss: SL-Anpassung.POST /api/v1/engine/trades/{id}/close: Trade schließen.
4. Benutzer-Trades (/api/v1/user/trades)
GET /api/v1/user/trades: Eigene aktive & historische Trades.POST /api/v1/user/trades/accept: Vorschlag verbindlich annehmen.POST /api/v1/user/trades/manual: Eigenen Trade ohne Vorschlag eröffnen.POST /api/v1/user/trades/{id}/close: Eigenen Trade manuell schließen.
5. Favoriten & Präferenzen (/api/v1/user/favorites, /api/v1/user/preferences)
GET /api/v1/user/favorites: Favoritenliste mit Live-Preisen & Tagesänderung.POST /api/v1/user/favorites/{symbol}: Asset zu Favoriten hinzufügen.POST /api/v1/user/favorites/{symbol}/ticker: Ticker-Symbol zuweisen.DELETE /api/v1/user/favorites/{symbol}: Asset aus Favoriten entfernen.GET /api/v1/user/preferences: UI-Präferenzen (Theme, Layout).PUT /api/v1/user/preferences/theme: Theme anpassen.
6. Backtesting & Simulation (/api/v1/simulation)
POST /api/v1/simulation/run: Quantitativen Backtest starten.GET /api/v1/simulation/matrix/{isin}: Zuverlässigkeitsmatrix für ISIN.GET /api/v1/simulation/history/{isin}: Historische Backtests für ISIN.GET /api/v1/simulation/history/run/{runId}: Vollständiger Backtest-Report.GET /api/v1/simulation/parameters/{isin}/{strategyKey}: Gespeicherte Strategie-Parameter.POST /api/v1/simulation/parameters: Parameterprofil speichern.
7. Bot & Paper-Trading (/api/v1/bot)
GET /api/v1/bot/status: Bot-Status & Venue.GET /api/v1/bot/positions/active: Offene Bot-Positionen.GET /api/v1/bot/portfolio/summary: Kontostand & PnL.POST /api/v1/bot/orders/execute: Manuelle Order über Bot abschicken.POST /api/v1/bot/orders/panic-close: Notfall-Schließung.POST /api/v1/bot/settings/update: Bot-Einstellungen aktualisieren.
8. News & Kalender (/api/v1/news, /api/v1/calendar)
GET /api/v1/news?limit={limit}&offset={offset}&isin={isin}&status={status}: Gefilterte News.GET /api/v1/calendar/events/{year}/{month}: Corporate Events & Earnings.
9. Admin-System (/api/v1/admin/settings, /api/v1/admin/evaluations)
GET /api/v1/admin/settings: Einstellungen aller Services.GET /api/v1/admin/settings/{serviceName}: Einstellungen eines Services.PUT /api/v1/admin/settings/{serviceName}: Einstellungen dynamisch ändern.GET /api/v1/admin/settings/health: Health-Status aller Services.GET /api/v1/admin/settings/logs/{serviceName}: Letzte 250 Ringpuffer-Logs.GET /api/v1/admin/evaluations: Evaluierungs-Historie ("Warum kein Proposal?").GET /api/v1/admin/evaluations/watchlist: Gescannte Watchlist-Assets.GET /api/v1/admin/evaluations/watchlist/{isin}/history: Setup-Verlauf eines Assets.
5.4 SignalR Hubs & Methoden
Verbindung über /hubs/{hubname}?access_token=<JWT>.
| Hub-Route | Server-Methoden | Client-Events (Callbacks) | Zweck |
|---|---|---|---|
/hubs/trade-stream |
SubscribeToAsset(isin)UnsubscribeFromAsset(isin) |
ReceiveTradeProposal(proposal)ReceiveTradeUpdate(trade) |
Realtime-Updates zu Proposals & Trades |
/hubs/news |
SubscribeToIsin(isin) |
ReceiveNewsArticle(article) |
Neue gescrapte/analysierte News |
/hubs/health |
(Keine) | ReceiveServiceHealth(health) |
Live-Healthcheck der Services |
/hubs/favorites-prices |
(Keine) | ReceivePriceUpdate(isin, price, change) |
Realtime-Kursupdates der Favoriten (15s Takt) |
/hubs/logs |
(Keine) | ReceiveLogMessage(logDto) |
Admin Live-Logstream |
6. Detaillierte Funktionsweise & Datenfluss
6.1 End-to-End Opportunity- & Trade-Lifecycle
1. DATA INGESTION
├── FinlyticNews: RSS/Scraping -> SimHash Deduplication -> In-Memory Matcher -> MQTT "services/news/completed"
├── FinlyticSentiment: FinBERT Webhook -> Time-Decay DB Update -> MQTT "finlytic/sentiment/stream/{isin}"
└── FinlyticTechnicals: Trade Republic & Yahoo Ticks -> Resampler -> Indicator Math (RSI, EMA, Squeeze, etc.)
2. TECHNICAL SCANNING (FinlyticTechnicals)
├── MultiTimeframeCandleAggregator aktualisiert Ringpuffer (15m, 1h, 1d)
├── 15 Pattern-Detektoren identifizieren FVG, OrderBlocks, DoubleBottom, Liquidity Sweeps
├── 10 CoreStrategies evaluieren Signale & erzeugen Exit-Pläne (TP1, TP2, Trailing-Stop, Break-Even)
└── TechnicalScoringEngineV2 berechnet Confluence-Score (Indikatoren + Patterns + Strategie)
3. ENGINE EVALUATION (FinlyticEngine)
├── OpportunityPollerBackgroundService pollt Top-Picks (Score >= 70)
├── CompositeOpportunityScorerV2 berechnet COS (Tech 45%, Sent 35%, Fund 20%)
├── Filter-Gates: EarningsLockout (2 Tage), DividendGate (1 Tag), Simulation Matrix Veto
├── AiReasoningGateService sendet strukturierten Context an n8n AI-Webhook
└── KnockOutDerivativeResolver matcht Hebel & Safety-Buffer -> Proposal persistiert & publiziert
4. EXECUTION & BOT (FinlyticBot / FinlyticApp)
├── FinlyticApp: User sieht Proposal im UI, klickt "Accept" -> Trade eröffnet
├── FinlyticBot: Falls AutoExecution aktiv -> 1-2% Risikosizing -> Orderausführung (Alpaca/Ledger)
└── FinlyticNotify: ntfy Push-Notification an Smartphone/Desktop
5. ACTIVE MONITORING & EXITS
├── ActiveTradeMonitoringBackgroundService (Engine) & BotTradeLifecycleBackgroundService (Bot)
├── Regelmäßige Kursabfrage (15s - 60s)
├── Bei TP1: Teilverkauf (50%) & Verschieben des Stop-Loss auf Break-Even (gebührenbereinigt)
├── Bei TP2: Teilverkauf (30%) & Aktivierung des ATR-Trailing-Stops für verbleibende 20%
└── Bei Stop-Loss / Knock-Out / MaxBars: Positionsschließung & PnL-Verbuchung
7. Frontend-Architektur (FinlyticApp)
- Technologie: Flutter (Dart) mit Web- und Mobile-Unterstützung.
- State Management:
flutter_bloc(BlocProvider,BlocBuilder,BlocConsumer,Cubit). - Netzwerk & Security:
- Zentraler
Dio-Client mitAuthInterceptor. - Injiziert automatisch
Authorization: Bearer <token>in jeden Request. - Automatischer Logout: Fängt
401 Unauthorizedund403 Forbiddenzentral ab, löscht Secure Storage und leitet sofort auf den Login-Bildschirm um.
- Zentraler
- Realtime-Kommunikation:
SignalRServicemit automatischem Reconnect und Event-Subskriptionen (trade-stream,news,health,favorites-prices,logs). - Feature-Struktur:
features/auth: Login, Passwortänderung.features/dashboard: Schnellübersicht, aktive Trades, Markttrends.features/discovery: Top-Assets, Scanner-Ergebnisse.features/asset_detail: Interaktiver Chart, Multi-Timeframe-Indikatoren, Fundamentaldaten, Sentiment-Historie, Derivate-Selektor.features/proposals: Trade-Vorschläge mit detaillierter KI-Begründung, Setup-Chart und Direkt-Annahme.features/trades: Eigene Positionen, TP/SL-Visualisierung, manuelles Schließen.features/bot: Bot-Positionen, Performance-Graphen, Kontostand, Panic-Close-Button.features/simulation: Backtest-Runner, Equity-Kurven, Strategie-Zuverlässigkeitsmatrix, Parameter-Tuning.features/news: Live-Newsfeed mit Sentiment-Badges und Filter nach Asset.features/calendar: Earnings- und Corporate-Events-Kalender.features/favorites: Realtime-Watchlist mit Kurs-Ticker.features/admin: Dynamische Service-Settings, Live-Log-Konsole, System-Health, Benutzerverwaltung, Evaluierungs-Historie ("Warum kein Proposal?").