Rewrite trader service for V4 P0

This commit is contained in:
Codex
2026-06-26 21:53:22 +08:00
parent 2fe4077164
commit 5d210053d0
184 changed files with 2780 additions and 6945 deletions
@@ -1,66 +0,0 @@
package com.quantai.trader.util;
import com.quantai.trader.domain.TraderDecisionCycle;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.UUID;
public final class Ids {
private static final DateTimeFormatter RUN_FORMATTER =
DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").withZone(ZoneOffset.UTC);
private Ids() {
}
public static String runId(Instant now) {
return "trader_run_" + RUN_FORMATTER.format(now) + "_" + suffix();
}
public static String cycleId(String runId, String symbol, Instant eventTime) {
return "trader_cycle_" + runId + "_" + symbol + "_" + eventTime.toEpochMilli();
}
public static String snapshotId(String cycleId) {
return "trader_snapshot_" + cycleId;
}
public static String candidateId(TraderDecisionCycle cycle, String playbookId) {
return "trader_candidate_" + cycle.cycleId() + "_" + playbookId;
}
public static String actionId(TraderDecisionCycle cycle, int sequence) {
return "trader_action_" + cycle.cycleId() + "_" + sequence;
}
public static String entryLegId(TraderDecisionCycle cycle, int index) {
return "trader_leg_" + actionId(cycle, index + 1) + "_" + index;
}
public static String positionId(String runId, String symbol, String side, int sequence) {
return "trader_position_" + runId + "_" + symbol + "_" + side + "_" + sequence;
}
public static String evidenceId(TraderDecisionCycle cycle, String stage) {
return "trader_evidence_" + cycle.cycleId() + "_" + slug(stage) + "_" + suffix();
}
public static String sampleId(TraderDecisionCycle cycle, String labelVersion) {
return "trader_sample_" + cycle.cycleId() + "_" + slug(labelVersion);
}
public static String reportId(String runId) {
return "trader_report_" + runId;
}
private static String slug(String value) {
return value.toLowerCase(Locale.ROOT).replaceAll("[^a-z0-9]+", "_");
}
private static String suffix() {
return UUID.randomUUID().toString().replace("-", "").substring(0, 8);
}
}
@@ -0,0 +1,73 @@
package com.quantai.trader.util;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Collection;
import java.util.Objects;
public final class TraderNumbers {
public static final BigDecimal ZERO = BigDecimal.ZERO;
public static final BigDecimal ONE = BigDecimal.ONE;
public static final BigDecimal HUNDRED = new BigDecimal("100");
private TraderNumbers() {
}
public static BigDecimal required(BigDecimal value, String field) {
return Objects.requireNonNull(value, field + " is required");
}
public static String requiredText(String value, String field) {
if (value == null || value.isBlank()) {
throw new IllegalArgumentException(field + " is required");
}
return value;
}
public static BigDecimal probability(BigDecimal value, String field) {
BigDecimal checked = required(value, field);
if (checked.compareTo(ZERO) < 0 || checked.compareTo(ONE) > 0) {
throw new IllegalArgumentException(field + " must be in [0,1]");
}
return checked;
}
public static BigDecimal nonNegative(BigDecimal value, String field) {
BigDecimal checked = required(value, field);
if (checked.compareTo(ZERO) < 0) {
throw new IllegalArgumentException(field + " must be >= 0");
}
return checked;
}
public static BigDecimal positive(BigDecimal value, String field) {
BigDecimal checked = required(value, field);
if (checked.compareTo(ZERO) <= 0) {
throw new IllegalArgumentException(field + " must be > 0");
}
return checked;
}
public static BigDecimal safeDivide(BigDecimal numerator, BigDecimal denominator) {
BigDecimal den = positive(denominator, "denominator");
return required(numerator, "numerator").divide(den, MathContext.DECIMAL64);
}
public static BigDecimal clamp(BigDecimal value, BigDecimal min, BigDecimal max) {
BigDecimal checked = required(value, "value");
if (min.compareTo(max) > 0) {
return ZERO;
}
if (checked.compareTo(min) < 0) {
return min;
}
if (checked.compareTo(max) > 0) {
return max;
}
return checked;
}
public static <T> Collection<T> requiredCollection(Collection<T> value, String field) {
return Objects.requireNonNull(value, field + " is required");
}
}