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:
co-authored by
Claude Opus 4.8
parent
a3d3d50681
commit
8252219163
@@ -613,9 +613,13 @@ namespace PolyTraderSharp.Services
|
||||
}
|
||||
|
||||
bool removed = account.OpenPositions.TryRemove(signal.TokenId, out var openPos);
|
||||
|
||||
// Defense-in-depth: Verify the removed position actually belongs to this trader
|
||||
if (removed && openPos != null && openPos.SourceTraderId != signal.TraderId)
|
||||
|
||||
// Defense-in-depth: Verify the removed position actually belongs to this trader.
|
||||
// K3: System-Signale (TraderId == 0, z.B. Demo-Auto-Close bei Marktauflösung) sind vom
|
||||
// Ownership-Check ausgenommen (CopyTradingRisk.IsAuthorizedSell) – sie gehören keinem
|
||||
// Master und würden sonst IMMER abgelehnt (Copy-Positionen haben SourceTraderId > 0),
|
||||
// sodass Demo-Positionen bei Resolution nie schließen und der 30s-Loop endlos feuert.
|
||||
if (removed && openPos != null && !CopyTradingRisk.IsAuthorizedSell(signal.TraderId, openPos.SourceTraderId))
|
||||
{
|
||||
// Wrong trader! Put the position back and treat as not found.
|
||||
account.OpenPositions.TryAdd(signal.TokenId, openPos);
|
||||
|
||||
Reference in New Issue
Block a user