Slice 3 (Fable-Fixes): K3 Demo-Resolution + M5 Demo-Score/Auto-Pause

K3 – Demo-Auto-Close bei Marktauflösung funktioniert wieder:
- System-SELLs (TraderId==0) sind vom Ownership-Check ausgenommen. Regel in reine
  CopyTradingRisk.IsAuthorizedSell(signalTraderId, positionSourceTraderId) extrahiert
  (System ODER Besitzer) und in der Engine genutzt. Vorher lehnte der Check jedes
  System-Close ab (Copy-Positionen haben SourceTraderId>0) -> Demo-Positionen
  schlossen bei Resolution nie, 30s-Loop feuerte endlos.
- Resolved-Cache (_resolvedDemoMarkets) in PollDemoExpirationsAsync: aufgeloeste
  Maerkte werden nicht erneut angefragt (kein Log-Spam / keine unnoetige API-Last).

M5 – Auto-Pause in der Demo-Phase nicht mehr wirkungslos:
- Anzeige-Spalten (CopyPnl30d etc.) zeigen Live-Kennzahlen, sobald vorhanden, sonst
  Demo-Kennzahlen -> Demo-Validierung ist sichtbar statt leer.
- Harte Auto-Pause wirkt bewusst NUR auf Live-Ergebnissen.
- Kadenz: stuendlicher Light-Check (Auto-Pause) statt nur alle 12h; schwere
  History-Analyse bleibt 12h (schliessen sich pro Tick aus, kein Doppellauf).

Tests: 5 neue (IsAuthorizedSell). Build 0 Fehler, 223 Tests gruen, --smoke-ui ok.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-09 13:33:24 +02:00
co-authored by Claude Opus 4.8
parent a3d3d50681
commit 8252219163
5 changed files with 81 additions and 23 deletions
@@ -203,5 +203,18 @@ namespace PolyTrader.Tests
{
Assert.Equal(expected, IsBelowPolymarketMinimum((decimal)shares, (decimal)usdc));
}
// ---------------- IsAuthorizedSell (K3) ----------------
[Theory]
[InlineData(0, 7, true)] // System-Signal schließt fremde Copy-Position (Demo-Resolution)
[InlineData(0, 0, true)] // System-Signal, keine Herkunft
[InlineData(7, 7, true)] // Master schließt eigene Position
[InlineData(7, 9, false)] // Master 7 darf Position von Master 9 nicht schließen
[InlineData(9, 0, false)] // echter Master darf herrenlose Position nicht kapern
public void IsAuthorizedSell_allows_owner_and_system(int signalTraderId, int positionSourceTraderId, bool expected)
{
Assert.Equal(expected, IsAuthorizedSell(signalTraderId, positionSourceTraderId));
}
}
}