Files
quant-trader-service/src/test/java/com/quantai/trader/replay/TraderP0CycleRunnerTest.java
T

69 lines
3.1 KiB
Java
Raw Normal View History

2026-06-26 21:53:22 +08:00
package com.quantai.trader.replay;
import com.quantai.trader.artifact.TraderArtifactLoader;
import com.quantai.trader.domain.TraderActionFactory;
import com.quantai.trader.enums.TraderActionType;
import com.quantai.trader.evidence.EvidenceAppender;
import com.quantai.trader.model.DeterministicTraderModelService;
import com.quantai.trader.outbox.InMemoryOutboxRepository;
import com.quantai.trader.position.TraderPositionManager;
import com.quantai.trader.risk.TraderRiskGate;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import static com.quantai.trader.TestFixtures.T0;
import static com.quantai.trader.TestFixtures.properties;
import static org.assertj.core.api.Assertions.assertThat;
class TraderP0CycleRunnerTest {
@Test
void runsReplayShadowCycleThroughModelPmRiskActionOutboxAndEvidence() {
EvidenceAppender evidenceAppender = new EvidenceAppender();
InMemoryOutboxRepository outboxRepository = new InMemoryOutboxRepository();
TraderP0CycleRunner runner = new TraderP0CycleRunner(
properties(),
new TraderArtifactLoader(properties()),
new DeterministicTraderModelService(),
new TraderPositionManager(),
new TraderRiskGate(),
new TraderActionFactory(),
evidenceAppender,
outboxRepository);
TraderCycleResult result = runner.runFlatCycle(new ReplayMarketEvent(
"run-1", "BTC-USDT-PERP", T0, new BigDecimal("100"), new BigDecimal("99.5"),
new BigDecimal("1.2"), new BigDecimal("1000")));
assertThat(result.action().actionType()).isEqualTo(TraderActionType.OPEN_LONG);
assertThat(result.action().reduceOnly()).isFalse();
assertThat(outboxRepository.all()).hasSize(1);
assertThat(outboxRepository.all().getFirst().destination()).isEqualTo("SHADOW_RECORDER");
assertThat(evidenceAppender.all()).extracting("stage")
.containsExactly("MARKET_SNAPSHOT", "MODEL_OUTPUT", "PM_DECISION", "RISK_DECISION");
}
@Test
void recordsWaitActionWhenReplaySnapshotHasNoLiquidity() {
EvidenceAppender evidenceAppender = new EvidenceAppender();
InMemoryOutboxRepository outboxRepository = new InMemoryOutboxRepository();
TraderP0CycleRunner runner = new TraderP0CycleRunner(
properties(),
new TraderArtifactLoader(properties()),
new DeterministicTraderModelService(),
new TraderPositionManager(),
new TraderRiskGate(),
new TraderActionFactory(),
evidenceAppender,
outboxRepository);
TraderCycleResult result = runner.runFlatCycle(new ReplayMarketEvent(
"run-1", "BTC-USDT-PERP", T0.plusSeconds(60), new BigDecimal("100"), new BigDecimal("99.5"),
new BigDecimal("1.2"), BigDecimal.ZERO));
assertThat(result.action().actionType()).isEqualTo(TraderActionType.WAIT);
assertThat(result.action().pricePlanId()).isNull();
assertThat(outboxRepository.all()).hasSize(1);
}
}