开仓按照名义价值计算数量

This commit is contained in:
tony 2026-07-14 15:34:28 +08:00
parent 8ac9a8ec1a
commit 1f882561d2

View File

@ -51,6 +51,7 @@ public class AutoGridStrategy extends BaseStrategy {
private final Logger logger = LoggerFactory.getLogger(AutoGridStrategy.class); private final Logger logger = LoggerFactory.getLogger(AutoGridStrategy.class);
// 运行参数 // 运行参数
/** 每格购买价值(报价币金额),下单数量 = baseQuantity / price */
private BigDecimal baseQuantity; private BigDecimal baseQuantity;
private BigDecimal atrMultiplier; private BigDecimal atrMultiplier;
private String gridGrpScript; private String gridGrpScript;
@ -613,9 +614,15 @@ public class AutoGridStrategy extends BaseStrategy {
return; return;
} }
BigDecimal quantity = quantityFromBaseValue(normalizedPrice);
if (quantity.compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("按购买价值换算数量无效:价值={},价格={}", baseQuantity, normalizedPrice);
return;
}
String clientOrderId = buildClientOrderId("BUY", normalizedPrice); String clientOrderId = buildClientOrderId("BUY", normalizedPrice);
try { try {
JSONObject orderInfo = buildOrderRequest("buy", "open", "limit", normalizedPrice, baseQuantity); JSONObject orderInfo = buildOrderRequest("buy", "open", "limit", normalizedPrice, quantity);
orderInfo.put("clientOid", clientOrderId); orderInfo.put("clientOid", clientOrderId);
JSONObject result = bitGetClient.placeOrder(orderInfo); JSONObject result = bitGetClient.placeOrder(orderInfo);
@ -625,8 +632,9 @@ public class AutoGridStrategy extends BaseStrategy {
gridBuyOrder.exchangeOrderId = exchangeOrderId; gridBuyOrder.exchangeOrderId = exchangeOrderId;
pendingBuyOrders.put(priceKey(normalizedPrice), gridBuyOrder); pendingBuyOrders.put(priceKey(normalizedPrice), gridBuyOrder);
logger.info("挂买单成功:价格={},订单号={}", normalizedPrice, exchangeOrderId); logger.info("挂买单成功:价格={},数量={}(价值={}),订单号={}",
submitOrderSync(exchangeOrderId, clientOrderId, normalizedPrice, baseQuantity, normalizedPrice, quantity, baseQuantity, exchangeOrderId);
submitOrderSync(exchangeOrderId, clientOrderId, normalizedPrice, quantity,
OrderSide.BUY, OrderStatus.NEW); OrderSide.BUY, OrderStatus.NEW);
} catch (Exception e) { } catch (Exception e) {
logger.error("挂买单失败,价格={}", normalizedPrice, e); logger.error("挂买单失败,价格={}", normalizedPrice, e);
@ -1052,7 +1060,8 @@ public class AutoGridStrategy extends BaseStrategy {
? "POS_" + entryPrice.toPlainString() ? "POS_" + entryPrice.toPlainString()
: "SYNC_POS_" + price.toPlainString(); : "SYNC_POS_" + price.toPlainString();
if (quantity == null) { if (quantity == null) {
quantity = baseQuantity; BigDecimal refPrice = entryPrice != null ? entryPrice : price;
quantity = quantityFromBaseValue(refPrice);
} }
GridSellOrder sellOrder = new GridSellOrder(clientOid, clientPositionId, price, quantity); GridSellOrder sellOrder = new GridSellOrder(clientOid, clientPositionId, price, quantity);
sellOrder.exchangeOrderId = exchangeOrderId; sellOrder.exchangeOrderId = exchangeOrderId;
@ -1232,7 +1241,7 @@ public class AutoGridStrategy extends BaseStrategy {
JSONObject row = new JSONObject(); JSONObject row = new JSONObject();
row.put("type", "待成交买单"); row.put("type", "待成交买单");
row.put("price", formatPrice(order.buyPrice)); row.put("price", formatPrice(order.buyPrice));
row.put("quantity", baseQuantity.toPlainString()); row.put("quantity", quantityFromBaseValue(order.buyPrice).toPlainString());
row.put("takeProfit", "-"); row.put("takeProfit", "-");
rows.add(row); rows.add(row);
} }
@ -1350,6 +1359,16 @@ public class AutoGridStrategy extends BaseStrategy {
return qty.setScale(quantityPrecision, RoundingMode.DOWN); return qty.setScale(quantityPrecision, RoundingMode.DOWN);
} }
/**
* 购买价值换算为合约/币数量:数量 = baseQuantity / price
*/
private BigDecimal quantityFromBaseValue(BigDecimal price) {
if (baseQuantity == null || price == null || price.compareTo(BigDecimal.ZERO) <= 0) {
return BigDecimal.ZERO;
}
return normalizeQuantity(baseQuantity.divide(price, quantityPrecision + 8, RoundingMode.DOWN));
}
private String priceKey(BigDecimal price) { private String priceKey(BigDecimal price) {
return normalizePrice(price).toPlainString(); return normalizePrice(price).toPlainString();
} }