Files
quant-trader-service/src/main/java/com/quantai/trader/domain/TraderAction.java
T
2026-06-26 21:53:22 +08:00

55 lines
2.1 KiB
Java

package com.quantai.trader.domain;
import static com.quantai.trader.util.TraderNumbers.*;
import com.quantai.trader.enums.PositionSide;
import com.quantai.trader.enums.TraderActionType;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Objects;
public record TraderAction(
String actionId,
String runId,
String cycleId,
String modelOutputId,
String pmDecisionId,
String riskDecisionId,
TraderActionType actionType,
String symbol,
PositionSide side,
String pricePlanId,
String pricePlanConfigHash,
BigDecimal positionRatio,
BigDecimal quantity,
BigDecimal stopPrice,
BigDecimal targetPrice,
boolean reduceOnly,
String idempotencyKey,
String reason,
Map<String, Object> actionContextJson
) {
public TraderAction {
actionId = requiredText(actionId, "actionId");
runId = requiredText(runId, "runId");
cycleId = requiredText(cycleId, "cycleId");
modelOutputId = requiredText(modelOutputId, "modelOutputId");
pmDecisionId = requiredText(pmDecisionId, "pmDecisionId");
riskDecisionId = requiredText(riskDecisionId, "riskDecisionId");
actionType = Objects.requireNonNull(actionType, "actionType is required");
symbol = requiredText(symbol, "symbol");
side = Objects.requireNonNull(side, "side is required");
idempotencyKey = requiredText(idempotencyKey, "idempotencyKey");
reason = requiredText(reason, "reason");
actionContextJson = Map.copyOf(actionContextJson == null ? Map.of() : actionContextJson);
if (actionType.increasesExposure()) {
pricePlanId = requiredText(pricePlanId, "pricePlanId");
pricePlanConfigHash = requiredText(pricePlanConfigHash, "pricePlanConfigHash");
positionRatio = positive(positionRatio, "positionRatio");
}
if (actionType.reducesExposure() && !reduceOnly) {
throw new IllegalArgumentException("reduce/close action must be reduceOnly");
}
}
}