69 lines
3.1 KiB
Java
69 lines
3.1 KiB
Java
|
|
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);
|
||
|
|
}
|
||
|
|
}
|