test: Entry-Candle-Stop-Semantik + maxPositions-Determinismus festgenagelt, Grenzen dokumentiert

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 20:43:44 +00:00
parent 8ad1516665
commit 25a37f74db
2 changed files with 53 additions and 1 deletions

View File

@@ -58,6 +58,9 @@ export function runBacktest(candles15ByPair: Map<Pair, Candle[]>, cfg: BacktestC
const ctx = byPair.get(pair)!;
const bucket = Math.floor(ts / H4) * H4;
// Bekannte Grenze: 4h-Bars eines Pairs werden erst verarbeitet, wenn dessen
// nächste 15m-Candle eintrifft — bei Datenlücken eines Pairs verschiebt sich
// dessen Verarbeitung relativ zu anderen Pairs (betrifft maxPositions-Reihenfolge).
// 1) Neu abgeschlossene 4h-Candles dieses Pairs verarbeiten (alles < aktueller Bucket)
while (ctx.next4h < ctx.c4h.length && ctx.c4h[ctx.next4h].ts < bucket) {
const i = ctx.next4h++;
@@ -94,7 +97,10 @@ export function runBacktest(candles15ByPair: Map<Pair, Candle[]>, cfg: BacktestC
}
}
// 2) Stop-Check auf der 15m-Candle
// 2) Stop-Check auf der 15m-Candle.
// Bewusst AUCH auf der Entry-Candle (Entry = Open-Zeitpunkt dieser Candle,
// ihre gesamte Range liegt nach dem Fill — eine echte Stop-Order wäre aktiv).
// Pessimistisch-realistisch, nicht "wegoptimieren".
const pos = portfolio.positions.get(pair);
if (pos && candle.low <= pos.stop) {
const exitPrice = candle.open < pos.stop ? candle.open : pos.stop; // Gap → schlechterer Fill