| API | Typ | Basis-URL | Daten | Auth | Uptime | Genutzt von |
|---|---|---|---|---|---|---|
| gemini-os | REST JSON Proxy | https://gemini-os.replit.app |
EOD OHLCV + Ticker-Suche | Keine | REPLIT-RISIKO | 9 Dateien |
| open-bb | REST JSON Proxy | https://open-bb.replit.app |
Intraday OHLCV (Yahoo Finance) | Keine | REPLIT-RISIKO | 2 Dateien |
| TradingView Widget | Embedded Widget | https://s3.tradingview.com/tv.js |
Live-Charts (alle Timeframes) | Keine (free widget) | CDN-STABIL | 11 Dateien |
| Lightweight Charts | JS Bibliothek (CDN) | https://cdn.jsdelivr.net/npm/lightweight-charts@4.1.1 |
Custom Chart-Rendering | Keine | CDN-STABIL | 2 Dateien |
gemini-os.replit.app und open-bb.replit.app) sind externe Hobby-Instanzen. Sie können bei Inaktivität schlafen gehen ("cold start" 10–30s Delay) oder jederzeit offline gehen. Kein SLA, kein Fallback im aktuellen Code.
| Parameter | Typ | Pflicht | Default | Beschreibung | Beispiel |
|---|---|---|---|---|---|
| symbol | string | PFLICHT | — | Ticker-Symbol in SYMBOL.EXCHANGE Format | TSLA.US |
| from | string | OPTIONAL | — | Startdatum ISO 8601 | 2023-01-01 |
| to | string | OPTIONAL | — | Enddatum ISO 8601 | 2024-12-31 |
| Suffix | Beschreibung | Beispiel-Ticker |
|---|---|---|
.US | US-Aktien (NYSE, NASDAQ) | TSLA.US, NVDA.US, AAPL.US |
.XETRA | Deutsche Börse Xetra | SAP.XETRA, RHM.XETRA |
.PA | Euronext Paris | AIR.PA |
.L | London Stock Exchange | BP.L |
ETF | ETF (via .US suffix) | QQQ.US, SPY.US |
GET https://gemini-os.replit.app/api/eod?symbol=TSLA.US&from=2024-01-01&to=2024-12-31
// JavaScript (aus dem Code)
const url = `https://gemini-os.replit.app/api/eod?symbol=${ticker}&from=${fromDate}&to=${toDate}`;
const response = await fetch(url);
const data = await response.json();
[
{
"date": "2024-01-02", // string — ISO 8601 Datum
"open": 186.20, // number — Eröffnungspreis
"high": 188.45, // number — Tageshoch
"low": 183.15, // number — Tagestief
"close": 185.64, // number — Schlusskurs
"volume": 52340100 // number — Handelsvolumen
},
// ... weitere Tages-Objekte chronologisch
]
| Feld | Typ | Einheit | Nutzung im Stack |
|---|---|---|---|
| date | string | ISO 8601 | Zeitachse, Candle-Sequenz |
| open | number | USD / EUR | Heikin-Ashi, Markov-State-Klassifikation |
| high | number | USD / EUR | ATR-Berechnung (H−L), Pattern-Detection |
| low | number | USD / EUR | ATR-Berechnung, Pattern-Detection |
| close | number | USD / EUR | State-Klassifikation (Green: close>open), SMA/EMA, Markov-Matrix |
| volume | number | Stück | Volume-State-Threshold (>avgVol = V, ≤avgVol = v) |
| Parameter | Typ | Pflicht | Beschreibung | Beispiel |
|---|---|---|---|---|
| query | string | PFLICHT | Suchbegriff (Ticker oder Name) | AAPL |
| limit | number | OPTIONAL | Max. Anzahl Ergebnisse | 10 |
GET https://gemini-os.replit.app/api/search?query=Apple&limit=5
// JavaScript
const res = await fetch(`https://gemini-os.replit.app/api/search?query=${encodeURIComponent(q)}`);
const results = await res.json();
[
{
"symbol": "AAPL.US", // string — volles Symbol mit Börsen-Suffix
"name": "Apple Inc.", // string — Firmenname
"exchange": "NASDAQ" // string — Börsenname
},
...
]
| Situation | Verhalten der API | Stack-Handling |
|---|---|---|
| Symbol nicht gefunden | Leeres Array [] oder {"error": "..."} |
Meistens kein UI-Feedback — nur console.error |
| Replit Cold Start | HTTP 502 oder Timeout nach 30s | fetch() wirft Exception — unbehandelt in 7/9 Dateien |
| Rate Limit | HTTP 429 (unbekannt ob implementiert) | Kein Retry-Mechanismus im Stack |
| CORS | Headers vorhanden (Replit-Proxy setzt sie) | Kein Problem, funktioniert aus Browser |
| Parameter | Typ | Pflicht | Beschreibung | Beispiel |
|---|---|---|---|---|
| ticker | string | PFLICHT | Yahoo Finance Ticker (kein Börsen-Suffix nötig) | TSLA, AAPL, QQQ |
| Parameter | Typ | Pflicht | Erlaubte Werte | Default | Beschreibung |
|---|---|---|---|---|---|
| range | string | PFLICHT | 1d 5d 10d 1mo 3mo |
— | Datums-Range für historische Daten |
| interval | string | PFLICHT | 1m 5m 15m 30m 1h 1d |
— | Candle-Granularität |
range=10d&interval=1h — also 10 Tage stündliche Daten. Das ergibt ~70 Candles (7 Handelsstunden × 10 Tage).
GET https://open-bb.replit.app/api/yahoo/chart/TSLA?range=10d&interval=1h
// JavaScript (aus INTRADAY-SHANNON.html)
const ticker = document.getElementById('ticker').value.trim().toUpperCase();
const url = `https://open-bb.replit.app/api/yahoo/chart/${ticker}?range=10d&interval=1h`;
const res = await fetch(url);
const json = await res.json();
// Mögliche Struktur 1: Direkt als Array
[
{
"timestamp": 1704196200, // number — Unix-Timestamp (Sekunden)
"open": 185.10, // number — Eröffnung
"high": 186.90, // number — Hoch
"low": 184.50, // number — Tief
"close": 186.45, // number — Schluss
"volume": 4521300 // number — Volumen
},
...
]
// Alternativ: Yahoo Finance native Struktur
{
"chart": {
"result": [{
"timestamp": [1704196200, ...],
"indicators": {
"quote": [{
"open": [185.10, ...],
"high": [186.90, ...],
"low": [184.50, ...],
"close": [186.45, ...],
"volume": [4521300, ...]
}]
}
}]
}
}
| Feld | Typ | Nutzung in INTRADAY-* |
|---|---|---|
| timestamp | number (Unix) | Zeitachse, Power Hour Detection (14:00–15:00 EST), Session-Klassifikation |
| open | number | State-Klassifikation (Green: close>open), Overnight Gap Detection |
| high | number | Range-Berechnung |
| low | number | Range-Berechnung |
| close | number | State-Klassifikation, Markov-Chain-Key, Shannon-Entropie |
| volume | number | Nicht genutzt in INTRADAY-* (nur EOD-Files nutzen Volume) |
TSLA, NVDA, QQQTSLA.US, NVDA.US — das würde Yahoo Finance nicht finden.
Timestamps sind in Unix-Sekunden (UTC). Die INTRADAY-* Files konvertieren für Power Hour Detection:
// EST Stunde aus Timestamp
const estHour = new Date(bar.timestamp * 1000).toLocaleString('en-US', {
timeZone: 'America/New_York', hour: 'numeric', hour12: false
});
// Power Hour: 14 = 14:00 EST (letzte Handelsstunde US-Markt)
| Parameter | Typ | Pflicht | Im Stack genutzte Werte | Beschreibung |
|---|---|---|---|---|
| container_id | string | PFLICHT | "tv_main_chart" |
ID des DIV-Elements, in das der Chart gerendert wird |
| symbol | string | PFLICHT | "TSLA", "BABA", "SAP" |
TradingView Ticker (ohne Börsen-Suffix in den meisten Files) |
| interval | string | OPTIONAL | "D", "W", "60", "15" |
Candle-Interval: "D"=Daily, "W"=Weekly, Zahl=Minuten |
| style | string | OPTIONAL | "1" (Candle), "8" (Renko), "9" (Kagi), "10" (P&F), "11" (Line Break) |
Chart-Typ. Style "8"–"11" werden in MULTI-REGIME genutzt |
| theme | string | OPTIONAL | "dark" |
Widget-Farbschema (alle Files nutzen dark) |
| locale | string | OPTIONAL | "de_DE", "en" |
Sprache des Widgets. Einige Files nutzen deutsch. |
| width | string/number | OPTIONAL | "100%" |
Breite des Chart-Containers |
| height | number | OPTIONAL | 400, 500, 550 |
Höhe in Pixeln |
| allow_symbol_change | boolean | OPTIONAL | false |
Verhindert, dass der User den Ticker im Widget selbst ändert |
| hide_top_toolbar | boolean | OPTIONAL | false, true |
Zeigt/versteckt die TV-Toolbar |
| save_image | boolean | OPTIONAL | false |
Screenshot-Button im Widget de-/aktivieren |
| studies | array | OPTIONAL | ["STD;EMA"], ["STD;Volume"] |
Vorgeladene Indikatoren (Standard-TradingView Kürzel) |
// WICHTIG: Container leeren vor Neuinitialisierung (fehlt im aktuellen Stack!)
document.getElementById("tv_main_chart").innerHTML = "";
// Widget erstellen
new TradingView.widget({
container_id: "tv_main_chart",
symbol: globalTvSymbol, // z.B. "TSLA"
interval: "D",
style: "1", // 1 = Candlestick
theme: "dark",
locale: "de_DE",
width: "100%",
height: 500,
allow_symbol_change: false,
hide_top_toolbar: false,
save_image: false,
studies: ["STD;EMA"]
});
| style | Chart-Typ | Genutzt in |
|---|---|---|
"0" | Bars | — |
"1" | Candlestick | INSTITUTIONAL, CANdlESTICKS, VOLUMEN, RISIKO, SHORT, PREDICTIONS, QUANT |
"2" | Line | — |
"8" | Renko | MARKOV-RENKO v12.5 |
"9" | Kagi | MARKOV-MULTI-REGIME v14.0 (Tab 2) |
"10" | Point & Figure | MARKOV-MULTI-REGIME v14.0 (Tab 3) |
"11" | Line Break | MARKOV-MULTI-REGIME v14.0 (Tab 4) |
Lightweight Charts ist eine Open-Source-Charting-Bibliothek von TradingView. Genutzt von den INTRADAY-* Files als Alternative zum embedded Widget, da sie mehr Kontrolle über Dateneingabe ermöglicht.
// Chart erstellen
const chart = LightweightCharts.createChart(
document.getElementById('chartContainer'),
{
width: document.getElementById('chartContainer').clientWidth,
height: 300,
layout: {
background: { color: '#0a0a1a' },
textColor: '#c9d1d9',
},
grid: {
vertLines: { color: '#1a1a3e' },
horzLines: { color: '#1a1a3e' },
},
timeScale: { timeVisible: true, secondsVisible: false }
}
);
// Candlestick-Serie hinzufügen
const candleSeries = chart.addCandlestickSeries({
upColor: '#00ff87',
downColor: '#ff3366',
borderUpColor: '#00ff87',
borderDownColor: '#ff3366',
wickUpColor: '#00ff87',
wickDownColor: '#ff3366',
});
// Daten setzen (UTC-Timestamps)
candleSeries.setData([
{ time: 1704196200, open: 185.10, high: 186.90, low: 184.50, close: 186.45 },
...
]);
Bei API-Fehler: Großes rotes Banner anzeigen statt nur console.error.
async function fetchEODData(symbol) {
try {
const res = await fetch(`https://gemini-os.replit.app/api/eod?symbol=${symbol}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
document.getElementById('error-banner').innerHTML =
`⚠ API nicht erreichbar: ${err.message}. Daten möglicherweise veraltet.`;
document.getElementById('error-banner').style.display = 'block';
return null;
}
}
Letzten erfolgreichen API-Response cachen, bei Fehler Cache nutzen.
async function fetchWithCache(url, cacheKey) {
try {
const res = await fetch(url);
const data = await res.json();
localStorage.setItem(cacheKey, JSON.stringify({ data, ts: Date.now() }));
return data;
} catch (err) {
const cached = localStorage.getItem(cacheKey);
if (cached) {
const { data, ts } = JSON.parse(cached);
const ageHours = (Date.now() - ts) / 3600000;
showWarning(`Offline-Daten genutzt (${Math.round(ageHours)}h alt).`);
return data;
}
throw err;
}
}
User informieren, dass Daten geladen werden (nur INTRADAY-* macht das korrekt).
async function loadData(symbol) {
const btn = document.getElementById('loadBtn');
const output = document.getElementById('outputPanel');
btn.disabled = true;
btn.textContent = 'LOADING...';
output.innerHTML = '<div class="loader">Berechne Markov-Matrix...</div>';
try {
const data = await fetchEODData(symbol);
renderResults(data);
} finally {
btn.disabled = false;
btn.textContent = 'ANALYSE STARTEN';
}
}
Falls gemini-os offline ist: Fallback auf public APIs.
| Service | Endpunkt | Free? | Auth? | Geeignet für |
|---|---|---|---|---|
| Alpha Vantage | https://www.alphavantage.co/query?function=TIME_SERIES_DAILY |
✅ | API Key | EOD-Daten (25 Calls/Tag kostenlos) |
| Yahoo Finance v8 | https://query1.finance.yahoo.com/v8/finance/chart/{ticker} |
✅ | Nein | EOD + Intraday (inoffiziell, Rate-Limit) |
| Polygon.io | https://api.polygon.io/v2/aggs/ticker/{ticker}/range |
Teilweise | API Key | EOD kostenlos, Intraday kostenpflichtig |
Visualisierung wie Daten durch die Live-API-Files fließen:
| Schritt | Aktion | Code-Referenz | Output |
|---|---|---|---|
| 1. Ticker Input | User gibt Symbol ein oder klickt Asset-Button | input#symbolInput, setAsset('TSLA.US') |
globalApiSymbol = 'TSLA.US' |
| 2. API-Fetch | fetch(gemini-os.replit.app/api/eod?symbol=...) |
runAnalysis() / loadMarkovData() |
JSON-Array mit OHLCV-Candles |
| 3. State-Klassifikation | Jede Candle → binärer State (G/R) oder 4-State (Rv/RV/Gv/GV) | buildTransitionMatrix() |
states[] Array |
| 4. Matrix-Aufbau | Zähle Transitionen, berechne MLE-Wahrscheinlichkeiten | countMatrix[prev][curr]++ |
P[][] Transitionsmatrix |
| 5. Edge-Berechnung | edge = P[G][G] - 0.5 (Bull-Edge) |
computeEdge() |
edge float (−0.5 bis +0.5) |
| 6. Kelly-Sizing | kelly = edge - (1-edge)/crv oder Citadel-Formel |
runRiskEngine() |
kellyPct, totalShares |
| 7. Display | Schreibe Ergebnisse in Execution-Panel via .innerHTML = ... |
executionPanel.innerHTML = ... |
Sichtbare Ausgabe im Browser |
| 8. TV-Widget Update | Neues TradingView.widget() mit dem Symbol erstellen | new TradingView.widget({symbol: tvTicker, ...}) |
Chart aktualisiert |
// 1. Candle-States bestimmen
const states = data.map(c => c.close > c.open ? 1 : 0); // 1=Green, 0=Red
// 2. Transitions zählen (MLE)
const countMatrix = [[0,0],[0,0]]; // [prevState][currState]
for (let i = 1; i < states.length; i++) {
countMatrix[states[i-1]][states[i]]++;
}
// 3. Wahrscheinlichkeiten normalisieren
const P = countMatrix.map(row => {
const total = row[0] + row[1];
return total > 0 ? row.map(v => v / total) : [0.5, 0.5];
});
// P[0][1] = P(Green | prev=Red) — Reversal-Wahrscheinlichkeit
// P[1][1] = P(Green | prev=Green) — Continuation-Wahrscheinlichkeit
// 4. Edge aus letztem bekannten State
const lastState = states[states.length - 1];
const edgeRaw = P[lastState][1]; // Prob. dass nächste Candle Green
const edge = edgeRaw - 0.5; // Normalisiert: -0.5 bis +0.5
// 5. Kelly-Fraction
const crv = 2.0; // Chance-Risk-Ratio
const kelly = edge > 0 ? edge - (1 - edgeRaw) / crv : 0;
const kellyPct = Math.min(kelly * 100, 35); // 35% Hard Cap