Compare commits
No commits in common. "1cb7022fc9aec554597df2c63166e0f13cf6eb66" and "1cc5028f783c415936d2358ad7b54d742d34283b" have entirely different histories.
1cb7022fc9
...
1cc5028f78
4 changed files with 0 additions and 364 deletions
|
|
@ -1,171 +0,0 @@
|
||||||
From a207fa8847a49a5b055656027a7c4a29d20ab6c1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Rain Ocampo <rain@opencampo.local>
|
|
||||||
Date: Sat, 22 Aug 2026 18:11:44 +0000
|
|
||||||
Subject: [PATCH] =?UTF-8?q?Historical=20Data=20Foundation=20V2=20+=20M12/M?=
|
|
||||||
=?UTF-8?q?13=20Shared=20Repository=20Schritt=201:=20Meilenstein-Doku=20(A?=
|
|
||||||
=?UTF-8?q?rchitecture-Closeout)=20-=20Ge=C3=A4ndert=20von=20Rain=20Ocampo?=
|
|
||||||
=?UTF-8?q?,=2022.08.2026?=
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
---
|
|
||||||
.../historical-v2-foundation-milestone.md | 146 ++++++++++++++++++
|
|
||||||
1 file changed, 146 insertions(+)
|
|
||||||
create mode 100644 notes/trading/system-docs/historical-v2-foundation-milestone.md
|
|
||||||
|
|
||||||
diff --git a/notes/trading/system-docs/historical-v2-foundation-milestone.md b/notes/trading/system-docs/historical-v2-foundation-milestone.md
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..ed2aac1
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/notes/trading/system-docs/historical-v2-foundation-milestone.md
|
|
||||||
@@ -0,0 +1,146 @@
|
|
||||||
+---
|
|
||||||
+type: Trading-Modul-System
|
|
||||||
+_organized: true
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+# Historical Data Foundation V2 + M12/M13 Shared Repository — Meilenstein
|
|
||||||
+
|
|
||||||
+> **Meilenstein:** Historical Data Foundation V2 + M12/M13 Shared Repository Schritt 1
|
|
||||||
+> **Stand:** 22.08.2026 | **Autor:** Rain Ocampo (Hermes)
|
|
||||||
+> **Status:** ✅ Schritt 1 fachlich abgeschlossen + verifiziert. Phase 2 NICHT begonnen.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 1. Architektur-Überblick
|
|
||||||
+
|
|
||||||
+Zwei getrennte Systeme, die über eine gemeinsame Repository-Schicht verbunden sind:
|
|
||||||
+
|
|
||||||
+- **Historical-Service V2** (`/opt/historical-v2/`, Container `historical-service` + `historical-db`): Dukascopy-basierte historische Marktdaten mit Dataset-Versionierung, Quality-/Session-/Eligibility-Modellen, Fixture-Trennung.
|
|
||||||
+- **M12/M13** (`Modul-12-Backtesting`, `Modul-13-Optimization`): Backtesting + Optimization, lesen Marktdaten über die gemeinsame `HistoricalRepository`-Schicht.
|
|
||||||
+
|
|
||||||
+**Netzwerk-Grenze (aktuell):** historical-db (10.0.8.2, Netz `f2afda69`) und M12/M13 (10.0.13.x, Netz `c17337ef`) liegen in **verschiedenen Docker-Netzwerken** — die Produktiv-Container erreichen die historical-db NICHT. Für Schritt 1 korrekt: Produktiv bleibt auf Legacy. V2 wurde lokal via SSH-Port-Forward gegen die echte DB getestet.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 2. Dataset-Versioning
|
|
||||||
+
|
|
||||||
+- `dataset_version`-Tabelle: `dataset_version_id`, `version_label`, `dataset_version_hash`, `feed_type`, `provider_id`, `instrument_id`, `timeframe`, `start_utc`, `end_utc`, `raw_source`, `normalization_version`, `aggregation_version`, `quality_version`, `data_as_of`, `quality_model_version`, `stale_model_version`, `session_model_version`, `calendar_version`, `eligibility_model_version`, `is_fixture`.
|
|
||||||
+- **`dataset_version_hash`** = deterministischer SHA-256 über die vollständige DatasetSpec (provider, feed, instrument, timeframe, start, end, raw_source, norm_version, quality_version, aggregation_version, raw_or_derived, raw_source_hash, quality_model_version, stale_model_version, session_model_version, calendar_version, eligibility_model_version).
|
|
||||||
+- Gleiche Spec → identischer Hash; andere Version → anderer Hash. **Hash-Identität** (kryptografisch) und **Auditierbarkeit** (menschenlesbare Versionen als Run-Metadaten) sind getrennt zu betrachten.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 3. Dukascopy-Befunde
|
|
||||||
+
|
|
||||||
+- Nur EURUSD, nur Dukascopy, nur Historical-V2-Stack.
|
|
||||||
+- Bid+Ask-OHLC, H4 = HOUR_4 nativ.
|
|
||||||
+- Range > ~5000 → 0 (Datenlücke).
|
|
||||||
+- Historical-Allowance zählt Datenpunkte wöchentlich (~10k).
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 4. Session / Quality / Eligibility
|
|
||||||
+
|
|
||||||
+- `historical_bar` trägt pro Bar: quality_status, quality_flags, session_state, session_phase, eligibility, exclusion_reason, technical_quality, market_quality.
|
|
||||||
+- `dataset_version` trägt die Modell-Versionen (quality_model_version, session_model_version, calendar_version, eligibility_model_version, stale_model_version).
|
|
||||||
+- **Aktuell (Schritt 1):** Diese Felder werden von der Repository-Schicht **noch NICHT** an M12/M13 propagiert (nur OHLCV + Dataset-Metadaten). → Phase-2-Requirement R5.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 5. Fixture-Trennung
|
|
||||||
+
|
|
||||||
+- `is_fixture`-Marker auf `dataset_version`-Ebene (Migration 06).
|
|
||||||
+- Repository-V2-Query filtert hart `AND dv.is_fixture = FALSE`.
|
|
||||||
+- **Lücke:** Kein explizites Config-Gate `ALLOW_FIXTURE_DATA` (Default `false`). → Phase-2-Requirement R4.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 6. Daily Quality
|
|
||||||
+
|
|
||||||
+- Daily-Quality-Report-Pipeline vorhanden (Foundation-Suite).
|
|
||||||
+- Quality-/Coverage-Status wird pro Bar erfasst, aber noch nicht bis zum Backtest propagiert.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 7. Shared Repository (M12/M13 Schritt 1)
|
|
||||||
+
|
|
||||||
+- **Befund:** `historical_repository.py` existiert als **zwei physisch getrennte Kopien** (M12 + M13, identischer Hash `bc64638b…`). Kein gemeinsames Paket/Volume.
|
|
||||||
+- **Drift-Risiko:** Kein Mechanismus erzwingt Identität → künftige Änderungen können auseinanderlaufen.
|
|
||||||
+- **Zielstruktur (Phase-2-Requirement R1):** Gemeinsames `shared/historical`-Paket als EINE Quelle, beide Module importieren daraus. Keine neue Kopierlösung.
|
|
||||||
+- Interface `load_candles(symbol, timeframe, start_date, end_date, provider, asset_class)` unverändert; M12 `data_hash()` erhalten.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 8. Legacy/V2 Gate
|
|
||||||
+
|
|
||||||
+- `HISTORICAL_DATA_SOURCE` (env), **Default = `legacy`** (liest `ohlcv` aus trading-DB, Modul-01).
|
|
||||||
+- `historical_v2` nur explizit aktivierbar. Kein stiller Wechsel.
|
|
||||||
+- FAIL-CLOSED: unbekannte Quelle → Fehler, kein stiller Fallback.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 9. M13 Hash
|
|
||||||
+
|
|
||||||
+- `compute_run_hash` erweitert um `dataset_version_id`, `dataset_version_hash`, `provider`, `feed_type` (nur bei V2).
|
|
||||||
+- Bei Legacy (Default) → unverändert, keine Cache-Invalidierung bestehender Runs.
|
|
||||||
+- **Hash-Audit:** `dataset_version_hash` deckt kryptografisch alle Versionen ab (bewiesen über Code + Tests). Entscheidung: **A** — Hash reicht für Identität, Versionen zusätzlich als Run-Metadaten (Phase-2-Requirement R3).
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 10. Aktuelle Netzwerkgrenze
|
|
||||||
+
|
|
||||||
+- historical-db (10.0.8.2) und M12/M13 (10.0.13.x) in verschiedenen Docker-Netzwerken.
|
|
||||||
+- Produktiv-Container erreichen historical-db NICHT (timeout, verifiziert).
|
|
||||||
+- **Empfohlene Service Boundary (Phase-2-Requirement R2):** B — M12/M13 → Historical-Service API → historical-db. Dedizierter Bulk-Bars-Endpoint mit Dataset-Version + Quality/Eligibility-Metadaten. Kein direkter DB-Zugriff aus M12/M13.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 11. Bekannte offene Punkte
|
|
||||||
+
|
|
||||||
+- Shared-Repository als EINE Quelle (R1) — noch 2 Kopien.
|
|
||||||
+- Service-Boundary B (R2) — noch direkte DB-Logik.
|
|
||||||
+- Run-Metadaten-Persistenz (R3) — noch nicht.
|
|
||||||
+- Fixture-Safety-Gate (R4) — noch nicht.
|
|
||||||
+- Quality/Coverage-Propagation (R5) — noch nicht.
|
|
||||||
+- Bid/Ask-Fill, Spread, Slippage, Kosten — Phase 2.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 12. Phase-2-Plan
|
|
||||||
+
|
|
||||||
+Phase 2 wird getrennt behandeln (NICHT implementiert):
|
|
||||||
+
|
|
||||||
+| ID | Thema |
|
|
||||||
+|----|-------|
|
|
||||||
+| A | Run-Metadaten-Persistenz |
|
|
||||||
+| B | echte Bid/Ask-Bar-Verarbeitung |
|
|
||||||
+| C | Fill-Modell |
|
|
||||||
+| D | variable reale Spreads |
|
|
||||||
+| E | Slippage-Modell |
|
|
||||||
+| F | Broker-/Trading-Kosten |
|
|
||||||
+| G | Intrabar-Ambiguität M1 |
|
|
||||||
+| H | Feed-Type BROKER vs REFERENCE |
|
|
||||||
+| I | Fixture-Safety |
|
|
||||||
+| J | Quality/Coverage-Safety |
|
|
||||||
+| K | M13-Reproduzierbarkeit |
|
|
||||||
+| L | Legacy-Kompatibilität |
|
|
||||||
+
|
|
||||||
+**Reihenfolge-Vorschlag:** I → J → A → B/C/D/E/F → G → H → K → L.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## 13. Status / Freigaben
|
|
||||||
+
|
|
||||||
+- **M12/M13 Schritt 1:** ✅ fachlich abgeschlossen + verifiziert (Tests A–J grün, M12 12/12 grün, Foundation-Suite 21/21 zweimal).
|
|
||||||
+- **Deploy:** Code-Identität lokal = VPS = Container (sha256 identisch), Container-Restart, Smoke-Tests grün.
|
|
||||||
+- **Phase 2:** ⛔ NICHT begonnen (explizite Freigabe erforderlich).
|
|
||||||
+- **Grenzen:** nur EURUSD, nur Dukascopy, nur Historical-V2-Stack; keine Produktivmodule M03–M19; keine IG-Calls/Orders; kein Jahresbackfill; M20–M25 nicht beginnen.
|
|
||||||
+
|
|
||||||
+---
|
|
||||||
+
|
|
||||||
+## Geändert
|
|
||||||
+```
|
|
||||||
+Geändert von: Rain Ocampo
|
|
||||||
+Datum: 22.08.2026
|
|
||||||
+Grund: Meilenstein-Doku Historical Data Foundation V2 + M12/M13 Shared Repository Schritt 1 angelegt (Architecture-Closeout).
|
|
||||||
+```
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
||||||
---
|
|
||||||
type: Note
|
|
||||||
_organized: true
|
|
||||||
---
|
|
||||||
|
|
||||||
# Phase 10c — Deterministische Slippage (DETERMINISTIC_FIXED)
|
|
||||||
|
|
||||||
**Geändert von:** Rain Ocampo (Hermes)
|
|
||||||
**Datum:** 23.08.2026
|
|
||||||
**Grund:** Deterministische Slippage-Komponente `DETERMINISTIC_FIXED` als zusätzliche, eigenständige Ausführungskomponente auf Basis von `LEGACY_SINGLE_PRICE` / `REFERENCE_BID_ASK` — formal/verifikativ abgeschlossen nach Deploy.
|
|
||||||
|
|
||||||
## Zusammenfassung
|
|
||||||
|
|
||||||
Phase 10c führt ein **deterministisches Slippage-Modell** (`slippage_model = DETERMINISTIC_FIXED`, Version `slippage_model_v1`) ein. Slippage ist eine **zusätzliche, eigenständige Komponente** auf dem Fill-Preis — **getrennt vom Spread**. Der Spread bleibt beim Ausführungspfad `REFERENCE_BID_ASK` intrinsisch (`BID_ASK_INTRINSIC`); Slippage wird **erst danach** auf den Fill-Preis aufgeschlagen. Legacy (`LEGACY_SINGLE_PRICE`) bleibt byte-identisch unverändert.
|
|
||||||
|
|
||||||
## Modell & Einheit
|
|
||||||
|
|
||||||
- **`DETERMINISTIC_FIXED`** + `slippage_model_version = slippage_model_v1`
|
|
||||||
- `slippage_unit = PRICE` → absolute Preisdistanz (keine implizite Umrechnung; Audit zeigt Einheit)
|
|
||||||
- **Kein** Random/Seed/Volatilität/Liquidität — reproduzierbar
|
|
||||||
- `NONE` (Default) vs `FIXED(0)`: **gleiche Fillpreise/PnL**, aber **unterschiedlicher ExecutionContext/run_hash** — gewollt
|
|
||||||
|
|
||||||
## Adverse Slippage-Semantik
|
|
||||||
|
|
||||||
- **LONG ENTRY** = ASK + slip, **LONG EXIT** = BID − slip
|
|
||||||
- **SHORT ENTRY** = BID − slip, **SHORT EXIT** = ASK + slip
|
|
||||||
- Basis: LONG Entry=ASK / Exit=BID, SHORT Entry=BID / Exit=ASK (unverändert)
|
|
||||||
- BUY → höher, SELL → tiefer (adversarial)
|
|
||||||
|
|
||||||
## Trigger ≠ Fill
|
|
||||||
|
|
||||||
- Stop/Target-Trigger laufen gegen **Basis-Preise** (ohne Slippage)
|
|
||||||
- Slippage erst auf den **Fill-Preis** — kein Doppel-Aufschlag
|
|
||||||
|
|
||||||
## Fail-Closed (15)
|
|
||||||
|
|
||||||
- `DETERMINISTIC_FIXED` ohne gültigen Wert → blockiert
|
|
||||||
- negativ/NaN/Inf/nichtnumerisch → ungültig
|
|
||||||
- unbekannte Einheit → ungültig
|
|
||||||
- `NONE`/Default → 0.0, V2-Pfad unverändert
|
|
||||||
|
|
||||||
## ExecutionContext / run_hash / Audit
|
|
||||||
|
|
||||||
- ExecutionContext Default: `NONE`/0.0; V2-Pfad unverändert, wenn nicht gesetzt
|
|
||||||
- `run_hash` inkl. `slippage_value` + `slippage_unit` (18)
|
|
||||||
- Audit: `entry/exit_market_price`/`fill_price`/`slippage` (19)
|
|
||||||
- gleiche Slippage-Konfig 2× → **identischer** run_hash; 0.10 vs 0.20 → anderer; NONE vs FIXED(0) → anderer
|
|
||||||
- Audit exakt = ExecutionContext
|
|
||||||
|
|
||||||
## Legacy byte-identisch (21)
|
|
||||||
|
|
||||||
- `params["slippage"]` unverändert (Legacy-Slippage-Feld)
|
|
||||||
- **kein** V2-Slippage-Audit im Legacy-Pfad
|
|
||||||
- **kein** DatasetGate-Block im Legacy-Pfad
|
|
||||||
|
|
||||||
## Beweis (Tests)
|
|
||||||
|
|
||||||
| Suite | Ergebnis |
|
|
||||||
|---|---|
|
|
||||||
| Phase10cSlippage | **30/30** grün (inkl. symmetrischer PnL-Beweis: LONG +2.80 / SHORT +2.80, slip 0.10) |
|
|
||||||
| Phase10bFixtureE2E | **8/8** grün |
|
|
||||||
| Phase10bEngine | **7/7** grün |
|
|
||||||
| Phase10a (execution_context) | **15/15** grün |
|
|
||||||
| Phase8 | **14/14** grün |
|
|
||||||
| Phase6/5 | 14/14 / 20/20 grün |
|
|
||||||
| M13Shared A–J + M13Compat | grün |
|
|
||||||
| **Gesamtsuite (Runner, nach Deploy)** | **2× alle 12 Suiten grün** |
|
|
||||||
|
|
||||||
## Deployment (kontrollierter Minimal-Deploy, Backup + Rollback)
|
|
||||||
|
|
||||||
- **Backup:** `/opt/data/m12m13_work/backup_phase10c_deploy_20260823_095549/` (m12 5 Dateien, sha256-verifiziert)
|
|
||||||
- **M12** (`Modul-12-Backtesting`): `core/pricing.py`, `core/engine.py`, `core/service.py`, `api/schemas.py`, `shared/historical/execution_context.py`
|
|
||||||
- **Verifikation:** Backup+sha256 VORHER, `docker cp`, `chown 1001:1001`, py_compile OK, Import-Smoke OK, Restart; `/health`=200, `/health/ready`=`{"status":"ready","db":"ok"}` (10.0.13.16:55012, intern)
|
|
||||||
- **M13**: `shared/execution_context.py` vorhanden, /health+ready grün (10.0.13.9:55013)
|
|
||||||
- **KEINE Phase 10d, keine IG-Calls/Orders, keine V2-Produktivaktivierung**
|
|
||||||
|
|
||||||
## V2-Runtime-Smoke (nach Deploy)
|
|
||||||
|
|
||||||
- `DETERMINISTIC_FIXED` importierbar
|
|
||||||
- `SlippageUnit.PRICE` importierbar
|
|
||||||
- `BID_ASK_INTRINSIC` weiterhin korrekt
|
|
||||||
- `slippage_amount(exec)` liefert erwarteten Wert (0.0001 für FIXED 0.0001)
|
|
||||||
- LONG entry +slip / SHORT entry −slip (adversarial)
|
|
||||||
- Audit/ExecutionContext serialisierbar, keine Importfehler
|
|
||||||
|
|
||||||
## Legacy-Produktions-Smoke (nach Deploy, 2 Runs A/B)
|
|
||||||
|
|
||||||
- **run_hash: `bc6e25533d22ee102b6921eeeccd8f7b7dff4ec74a3316e381007ec56b0e1b37`** (A=B, deterministisch)
|
|
||||||
- **data_hash: `d76a75496453d9c05d5690237f4621534f954f9f3e87b67eee4ae9327c5c6bb9`** (A=B, identisch Phase 8)
|
|
||||||
- **net_pnl: 196.586062** (A=B), total_trades 1, LONG 1/SHORT 0
|
|
||||||
- Trades/Fills/PnL identisch; **Legacy-Slippage unverändert**; kein V2-Audit; kein Gate-Block
|
|
||||||
|
|
||||||
## Produktions-Gate (Final Check)
|
|
||||||
|
|
||||||
- M12: `/health`=200, `/health/ready`=200, `HISTORICAL_DATA_SOURCE=UNSET` (legacy), `ALLOW_FIXTURE_DATA=UNSET` (false)
|
|
||||||
- M13: `/health`=200, `/health/ready`=200, Gates UNSET
|
|
||||||
- Keine V2-Produktivläufe, keine Fixture-Aktivierung, keine verwaisten Testprozesse
|
|
||||||
- M13-Optimizer-Parameterraum enthält **kein** `slippage_model/value/unit`; keine Execution-/Cost-Parameter optimierbar
|
|
||||||
|
|
||||||
## Bekannte Grenzen
|
|
||||||
|
|
||||||
- NONE vs FIXED(0) → unterschiedlicher run_hash (gewollt, kein Fehler)
|
|
||||||
- Fixture-E2E nur mit `ALLOW_FIXTURE_DATA=true` (test-only); danach garantiert false/unset
|
|
||||||
- M13-Optimizer nutzt das neue Slippage-Modell **nicht** im Parameterraum (Legacy-`slippage`-Feld bleibt)
|
|
||||||
- Kein Random-/Volatilitäts-Slippage implementiert (bewusst, Scope-10c)
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
---
|
|
||||||
type: Note
|
|
||||||
_organized: true
|
|
||||||
---
|
|
||||||
|
|
||||||
# Phase 10b — Semantische Korrektur REFERENCE_BID_ASK → BID_ASK_INTRINSIC
|
|
||||||
|
|
||||||
**Geändert von:** Rain Ocampo (Hermes)
|
|
||||||
**Datum:** 23.08.2026
|
|
||||||
**Grund:** Semantische Korrektur des Spread-Modells für den REFERENCE_BID_ASK-Ausführungspfad + vollständiger Beweis + kontrollierter Minimal-Deploy.
|
|
||||||
|
|
||||||
## Zusammenfassung
|
|
||||||
|
|
||||||
Phase 10b schließt die semantische Korrektur des Spread-Modells ab: Für den Ausführungspfad `REFERENCE_BID_ASK` ist der Spread **intrinsisch** (ergibt sich aus Entry-/Exit-Seite, KEIN Zusatz-Aufschlag). Deshalb gilt dort standardmäßig `spread_model = BID_ASK_INTRINSIC`, sofern nicht explizit ein anderes Spread-Modell übergeben wird. Legacy (`LEGACY_SINGLE_PRICE`) bleibt unverändert `NONE`.
|
|
||||||
|
|
||||||
Damit zeigen **ExecutionContext, Audit und run_hash dieselbe Wahrheit** — es gibt keine Sonderbehandlung nur im Audit.
|
|
||||||
|
|
||||||
## Semantische Korrektur (Option 1, User-Entscheidung)
|
|
||||||
|
|
||||||
- **REFERENCE_BID_ASK** (Default) → `spread_model = BID_ASK_INTRINSIC` (explizit übersteuerbar)
|
|
||||||
- **LEGACY_SINGLE_PRICE** → `spread_model = NONE` (unverändert)
|
|
||||||
- **V2-run_hash DARF sich ändern** (ist gewollt)
|
|
||||||
- Keine Sonderbehandlung nur im Audit — Context/Audit/Hash konsistent
|
|
||||||
|
|
||||||
## Slippage-Wording
|
|
||||||
|
|
||||||
Phase 10b verwendet **noch kein Slippage-Modell** (nicht „ignoriert grundsätzlich"). `slippage_model = NONE` im Audit.
|
|
||||||
|
|
||||||
## Fail-Closed (11 Fälle)
|
|
||||||
|
|
||||||
- fehlendes/unvollständiges Bid/Ask → `BID_ASK_REQUIRED`
|
|
||||||
- `price_basis != bid_ask` → blockiert
|
|
||||||
- `REFERENCE_BID_ASK` + Single-Price → blockiert
|
|
||||||
- `BROKER_APPROXIMATION` / `BROKER_REPLAY` / `TICK_REPLAY` → blockiert
|
|
||||||
- unbekanntes `execution_model` → blockiert
|
|
||||||
- **kein Legacy-Fallback**
|
|
||||||
|
|
||||||
## Beweis (Tests)
|
|
||||||
|
|
||||||
| Suite | Ergebnis |
|
|
||||||
|---|---|
|
|
||||||
| Phase10a (execution_context) | **15/15** grün |
|
|
||||||
| Phase10bFills | **5/5** grün |
|
|
||||||
| Phase10bEngineFills | **8/8** grün |
|
|
||||||
| Phase10bFixtureE2E | **4/4** grün |
|
|
||||||
| M13Compat | **5/5** grün |
|
|
||||||
| Gesamtsuite (Runner) | **2× alle 11 Suiten grün** |
|
|
||||||
|
|
||||||
### Beweis-Kernpunkte (Phase10a)
|
|
||||||
- A) REFERENCE_BID_ASK Default → `spread_model = BID_ASK_INTRINSIC`
|
|
||||||
- B) explizites NONE-Override → NONE
|
|
||||||
- C) LEGACY → NONE
|
|
||||||
- D) NONE vs intrinsic → **verschiedene** V2-run_hash
|
|
||||||
- E) gleiche Konfig 2× → **identischer** V2-run_hash
|
|
||||||
- F) Legacy unberührt
|
|
||||||
|
|
||||||
### Fixture-E2E (4/4)
|
|
||||||
- LONG + SHORT COMPLETED
|
|
||||||
- Audit: `execution_model=REFERENCE_BID_ASK`, `spread_model=BID_ASK_INTRINSIC`, `slippage_model=NONE`, `is_fixture=true`
|
|
||||||
- ohne `ALLOW_FIXTURE_DATA` → `FIXTURE_DATA_BLOCKED`
|
|
||||||
- Reset-Beweis (Flag an→COMPLETED, Flag aus→BLOCKED, ENV wiederhergestellt)
|
|
||||||
- kein Doppelspread
|
|
||||||
|
|
||||||
## Deployment (kontrollierter Minimal-Deploy, Backup + Rollback)
|
|
||||||
|
|
||||||
- **Backup:** `/opt/data/backup_phase10b_deploy_20260823_090949/` (m12 + m13, md5-verifiziert)
|
|
||||||
- **M12** (`Modul-12-Backtesting`): `/app/core/engine.py`, `/app/core/service.py`, `/app/core/pricing.py` (NEU), `/app/shared/historical/execution_context.py`, `/app/shared/historical/repository.py`
|
|
||||||
- **M13** (`Modul-13-Optimization`): `/app/shared/historical/execution_context.py`, `/app/shared/historical/repository.py`
|
|
||||||
- **Verifikation:** py_compile OK in beiden Containern; Restart; `/health`=200, `/health/ready`=`{"status":"ready","db":"ok"}` (M12), `/health`=200 (M13)
|
|
||||||
- **KEINE Phase 10c, keine anderen Module, keine IG-Calls/Orders**
|
|
||||||
|
|
||||||
## Legacy-Produktions-Smoke (nach Deploy)
|
|
||||||
|
|
||||||
- **run_hash: `bc6e25533d22ee102b6921eeeccd8f7b7dff4ec74a3316e381007ec56b0e1b37`** (deterministisch, 2 Runs identisch)
|
|
||||||
- **data_hash: `d76a75496453d9c05d5690237f4621534f954f9f3e87b67eee4ae9327c5c6bb9`** (identisch Phase 8)
|
|
||||||
- **RESULT: PASS** — Legacy bleibt nach 10b-Deploy byte-identisch
|
|
||||||
- **Hinweis:** Die frühere Diskrepanz `b3c2553…` vs `bc6e2553…` ist geklärt — der echte Hash aus der Run-Wahrheit ist `bc6e2553…` (`b3c2553…` war ein Tippfehler im Zwischenbericht).
|
|
||||||
|
|
||||||
## Produktions-Gate
|
|
||||||
|
|
||||||
- M12 + M13: `HISTORICAL_DATA_SOURCE=UNSET`, `ALLOW_FIXTURE_DATA=UNSET`
|
|
||||||
- Produktion bleibt auf echtem Datensatz, **nie auf Fixture**
|
|
||||||
6
vps.md
6
vps.md
|
|
@ -1,6 +0,0 @@
|
||||||
---
|
|
||||||
type: Type
|
|
||||||
_sort: title:asc
|
|
||||||
---
|
|
||||||
|
|
||||||
# VPS
|
|
||||||
Loading…
Reference in a new issue