fix: Testdaten-Arithmetik im Trump-Cycle-Test (200 Candles = 50h < 60h Hold)

Plan-Bug: 300 Candles = 75h > holdHours — Position schloss innerhalb der
Testdaten, Tests 1/3/4 erwarteten aber offene Positionen. Implementierung war korrekt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 08:29:35 +00:00
parent 7f1589a7df
commit a297d83849
2 changed files with 8 additions and 8 deletions

View File

@@ -695,7 +695,7 @@ const fresh = (): TrumpLiveState => ({ cash: 10_000, positions: [], cursorTs: T0
describe('processTrumpCycle', () => { describe('processTrumpCycle', () => {
test('Event → Buy am Open der ersten Candle nach eventTs, 20% Equity', () => { test('Event → Buy am Open der ersten Candle nach eventTs, 20% Equity', () => {
const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 300)]]); const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 200)]]);
const events = [{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }]; const events = [{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }];
const r = processTrumpCycle(candles, events, fresh(), CFG); const r = processTrumpCycle(candles, events, fresh(), CFG);
expect(r.positions).toHaveLength(1); expect(r.positions).toHaveLength(1);
@@ -721,7 +721,7 @@ describe('processTrumpCycle', () => {
}); });
test('Event verfällt, wenn Pair schon belegt (consumed, kein 2. Trade)', () => { test('Event verfällt, wenn Pair schon belegt (consumed, kein 2. Trade)', () => {
const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 300)]]); const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 200)]]);
const events = [ const events = [
{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 }, { id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 },
{ id: 2, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }, { id: 2, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 },
@@ -734,8 +734,8 @@ describe('processTrumpCycle', () => {
test('maxPositions blockiert, Event verfällt', () => { test('maxPositions blockiert, Event verfällt', () => {
const cfg = { ...CFG, maxPositions: 1 }; const cfg = { ...CFG, maxPositions: 1 };
const candles = new Map([ const candles = new Map([
['BTC_USDT' as Pair, flat('BTC_USDT', 300)], ['BTC_USDT' as Pair, flat('BTC_USDT', 200)],
['ETH_USDT' as Pair, flat('ETH_USDT', 300, 50)], ['ETH_USDT' as Pair, flat('ETH_USDT', 200, 50)],
]); ]);
const events = [ const events = [
{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 }, { id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 },

View File

@@ -20,7 +20,7 @@ const fresh = (): TrumpLiveState => ({ cash: 10_000, positions: [], cursorTs: T0
describe('processTrumpCycle', () => { describe('processTrumpCycle', () => {
test('Event → Buy am Open der ersten Candle nach eventTs, 20% Equity', () => { test('Event → Buy am Open der ersten Candle nach eventTs, 20% Equity', () => {
const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 300)]]); const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 200)]]);
const events = [{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }]; const events = [{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }];
const r = processTrumpCycle(candles, events, fresh(), CFG); const r = processTrumpCycle(candles, events, fresh(), CFG);
expect(r.positions).toHaveLength(1); expect(r.positions).toHaveLength(1);
@@ -46,7 +46,7 @@ describe('processTrumpCycle', () => {
}); });
test('Event verfällt, wenn Pair schon belegt (consumed, kein 2. Trade)', () => { test('Event verfällt, wenn Pair schon belegt (consumed, kein 2. Trade)', () => {
const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 300)]]); const candles = new Map([['BTC_USDT' as Pair, flat('BTC_USDT', 200)]]);
const events = [ const events = [
{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 }, { id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 },
{ id: 2, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 }, { id: 2, instrument: 'BTC_USDT' as Pair, eventTs: T0 + M15 + 1 },
@@ -59,8 +59,8 @@ describe('processTrumpCycle', () => {
test('maxPositions blockiert, Event verfällt', () => { test('maxPositions blockiert, Event verfällt', () => {
const cfg = { ...CFG, maxPositions: 1 }; const cfg = { ...CFG, maxPositions: 1 };
const candles = new Map([ const candles = new Map([
['BTC_USDT' as Pair, flat('BTC_USDT', 300)], ['BTC_USDT' as Pair, flat('BTC_USDT', 200)],
['ETH_USDT' as Pair, flat('ETH_USDT', 300, 50)], ['ETH_USDT' as Pair, flat('ETH_USDT', 200, 50)],
]); ]);
const events = [ const events = [
{ id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 }, { id: 1, instrument: 'BTC_USDT' as Pair, eventTs: T0 + 1 },