Files
quant-trader-service/src/main/java/com/quantai/trader/domain/TraderActionFactory.java
T
2026-06-26 22:17:48 +08:00

55 lines
2.3 KiB
Java

package com.quantai.trader.domain;
import com.quantai.trader.enums.PositionSide;
import com.quantai.trader.enums.TraderActionType;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Map;
@Component
public class TraderActionFactory {
public TraderAction create(TraderPositionManagerDecision pmDecision, TraderRiskDecision riskDecision, String symbol) {
TraderActionType finalAction = riskDecision.finalAction();
PositionSide side = sideFor(finalAction, pmDecision.side());
return new TraderAction(
"action_" + pmDecision.cycleId(),
pmDecision.runId(),
pmDecision.cycleId(),
pmDecision.modelOutputId(),
pmDecision.pmDecisionId(),
riskDecision.riskDecisionId(),
finalAction,
symbol,
side,
finalAction.increasesExposure() ? pmDecision.pricePlanId() : null,
finalAction.increasesExposure() ? pmDecision.pricePlanConfigHash() : null,
ratioFor(finalAction, pmDecision),
null,
pmDecision.stopPrice(),
pmDecision.targetPrice(),
finalAction.reducesExposure(),
"idem_" + pmDecision.runId() + "_" + pmDecision.cycleId() + "_" + finalAction,
riskDecision.allowAction() ? pmDecision.reason() : riskDecision.blocker(),
Map.of("riskAllowed", riskDecision.allowAction()));
}
private BigDecimal ratioFor(TraderActionType action, TraderPositionManagerDecision pmDecision) {
return switch (action) {
case OPEN_LONG, OPEN_SHORT -> pmDecision.targetPositionRatio();
case ADD_LONG, ADD_SHORT -> pmDecision.addRatio();
case REDUCE_LONG, REDUCE_SHORT -> pmDecision.reduceRatio();
case WAIT, HOLD, CLOSE_LONG, CLOSE_SHORT, MOVE_STOP, CANCEL -> null;
};
}
private PositionSide sideFor(TraderActionType action, PositionSide pmSide) {
return switch (action) {
case OPEN_LONG, ADD_LONG, REDUCE_LONG, CLOSE_LONG -> PositionSide.LONG;
case OPEN_SHORT, ADD_SHORT, REDUCE_SHORT, CLOSE_SHORT -> PositionSide.SHORT;
case WAIT, CANCEL -> PositionSide.NONE;
case HOLD, MOVE_STOP -> pmSide;
};
}
}