Files
PolyTraderSharp/src/PolyTrader.Core/Models/DecisionRecord.cs
T
RichardandClaude Opus 5 6218a04fe4 Eine Roadmap statt fuenfzehn Plandokumente; Altbestand ins Archiv
Der Status des Projekts stand verstreut in elf Umsetzungsplaenen, drei
Konzepten, der Linux-Analyse und dem Projektstand - teils widersprechend, teils
wochenlang veraltet. Ab jetzt gibt es genau eine Statusquelle.

docs/ROADMAP.md (neu):
- Alle Vorhaben in vier Stufen A bis D, plus technische Schuld und Verlauf.
  Die Stufen sind eine Reihenfolge, keine Termine: jede schafft die
  Voraussetzung fuer die naechste.
- Statuszeichen: erledigt / offen / blockiert (mit Ursache) / bewusst
  zurueckgestellt / Idee, nicht beschlossen. Damit ist das, was wir NICHT bauen
  wollen, sichtbar vorgehalten statt unauffindbar in einem Plan zu schlummern.
- Inhaltlich getragen, nicht nur verlinkt: je Vorhaben Ziel, Phasen,
  Akzeptanzkriterien, offene Entscheidungen und Leitplanken aus den Quelldokumenten.
- Sichtbar gemacht, was vorher zwischen den Dokumenten verborgen lag:
  CopyTrading Phase 1 ist der Engpass der gesamten Roadmap (MarketMaking und
  BundleArbitrage haben harte Voraussetzungen darauf), und die Sniper-Metriken
  aus Phase 3.2 sind ein Spezialfall des StrategieDrift-Fingerprints - zusammen
  bauen statt doppelt.

Archiv (docs/archiv/):
- 15 Dokumente verschoben (11 Umsetzungsplaene, 3 Konzepte, ANALYSE-Linux-Portierung).
  Sie bleiben die Bauanleitungen mit Code-Bezuegen, Risikotabellen und
  Begruendungen - eingefroren ist nur ihr Status.
- archiv/README.md ordnet jedes Dokument seinem Roadmap-Punkt zu.

Verweise nachgezogen - der eigentliche Aufwand:
- 25 Markdown-Links repariert. 15 davon verschiebungsbedingt (eine Ebene
  tiefer), der Rest war schon vorher falsch: die Ideensammlung verlinkte
  Quellcode relativ zum Repo-Wurzelverzeichnis statt zu docs/.
- 12 Dateien ausserhalb von docs/ verwiesen in Kommentaren auf die Plaene
  (csproj, props, setup.json, sechs Quelldateien) - alle auf archiv/ umgebogen.
- Verweise auf Dateien, die der Fruehjahrsputz geloescht hat (Ui/,
  Program.cs, WindowMenuBar), zu Klartext entschaerft statt tote Links zu lassen.
- Gegenprobe: 85 Links geprueft, 0 kaputt. Build gruen, 476 Tests gruen.

PROJEKTSTAND.md entdoppelt: Abschnitt "Offen" verweist jetzt auf die Roadmap.
Arbeitsteilung ist damit klar - Projektstand sagt was IST, Roadmap was KOMMT.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 18:56:50 +02:00

97 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
namespace PolyTraderSharp.Models
{
/// <summary>Ausgang einer Handelsentscheidung im Entscheidungsjournal.</summary>
public enum TradeDecision
{
Executed, // Aktion ausgeführt (Order platziert / Demo-Fill / Leiter gestartet)
Rejected, // aktiv abgelehnt (Risk-/Plausibilitätsregel)
Skipped, // bewusst übersprungen (z. B. ExitPending, Spam-Blockade, Modus)
Failed // versucht, aber fehlgeschlagen (z. B. Order-Fehler)
}
/// <summary>
/// Strukturierter Grund einer Entscheidung (statt Freitext). Wird als STRING persistiert
/// neue Werte können gefahrlos ergänzt werden. Die Codes decken die heutigen
/// TradeReasoning-/Reject-Stellen von Engine, Leiter und Monitor ab.
/// </summary>
public enum DecisionReason
{
None = 0,
// ----- Modus / Zustand -----
ModeInactive, // Live-/Demo-Trading deaktiviert
SellOnlyModeBuyBlocked, // SellOnly-Modus blockiert BUY
TraderInactive, // Master nicht gefunden / inaktiv
AccountInactive, // Account nicht gefunden / inaktiv
// ----- BUY-Pfad -----
MaxBuyPriceExceeded, // Signalpreis über MaxBuyPrice
ExitPendingBuySkip, // H3: SELL-Leiter aktiv kein Zukauf
TimeWindowLimitReached, // Zeitfenster-Budget (6h/24h/72h/None) erschöpft
MarketBudgetExhausted, // PerMarket-Budget erschöpft
PerMasterLimitReached, // PerMaster-Budget erschöpft
InsufficientBalance, // verfügbares Guthaben reicht nicht
BelowPolymarketMinimum, // Order unter Minimum (Shares/USDC)
MarketExpiredOrTooClose, // EndDate-Filter
DuplicateOrPendingOrder, // bereits offene/pending Order
// ----- SELL-Pfad -----
SellSpamBlock, // SELL <20s nach letztem SELL
LadderAlreadyActive, // Eskalationsleiter läuft bereits
PositionNotFound, // keine passende Position im Portfolio
OwnershipMismatch, // Position gehört anderem Trader (Safety)
PartialSellBelowThreshold, // Teilverkauf unter Signifikanz-Schwelle
MasterPositionInconsistent, // Master hält laut Tracking 0 Shares
SyncGracePeriod, // kein Tracking + Haltezeit < Schonfrist
// ----- Ausführung -----
OrderPlaced, // Order erfolgreich platziert
OrderFailed, // CLOB-Fehler beim Platzieren
DemoFilled, // Demo-Fill gebucht
DemoClosed, // Demo-Position geschlossen
LadderStarted, // SELL-Leiter gestartet
LadderStartFailed, // Leiter-Startorder fehlgeschlagen
LadderDustAbort, // H4: Dust-Rest unter Minimum Leiter beendet
ProfitTargetTriggered, // Take-Profit hat Exit ausgelöst
SystemResolutionClose // System-Close bei Marktauflösung (TraderId==0)
}
/// <summary>
/// Eine Zeile im Entscheidungsjournal (core_decision_journal): JEDE Handelsentscheidung
/// ausgeführt, abgelehnt oder übersprungen strukturiert und abfragbar. Grundlage für
/// Supervisor-Analysen („warum (nicht) gehandelt?") und Counterfactual-Auswertungen
/// (MarketSlug/EndDate sind dafür bewusst enthalten). Siehe docs/archiv/konzepte/KONZEPT-Modul-Supervisor.md.
/// </summary>
public class DecisionRecord
{
public long Id { get; set; } // DB-Autoincrement
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
/// <summary>Korrelation: verbindet Signal → Entscheidungen → Orders → ClosedTrade.</summary>
public string SignalId { get; set; } = string.Empty;
public string ModuleName { get; set; } = string.Empty;
public int AccountId { get; set; }
public bool IsDemo { get; set; }
public int SourceTraderId { get; set; }
public string TokenId { get; set; } = string.Empty;
public string MarketSlug { get; set; } = string.Empty; // counterfactual-ready
public string MarketQuestion { get; set; } = string.Empty;
public string Side { get; set; } = string.Empty; // BUY/SELL
public decimal SignalPrice { get; set; }
public DateTime? MarketEndDate { get; set; } // counterfactual-ready
public TradeDecision Decision { get; set; }
public DecisionReason Reason { get; set; }
/// <summary>Kompakte Kontext-Zahlen als JSON (Limitwerte, Budgets, berechnete Größen …).</summary>
public string ContextJson { get; set; } = string.Empty;
/// <summary>Menschlicher Begründungstext (wie bisher im Log).</summary>
public string Message { get; set; } = string.Empty;
}
}