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>
97 lines
4.8 KiB
C#
97 lines
4.8 KiB
C#
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;
|
||
}
|
||
}
|