From 6e5fc909944bd710348427bb3aa30bfdba0be940 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 10 Jul 2026 11:55:07 +0800
Subject: [PATCH] refactor(gateApi): 移除首次挂单成交标记及相关逻辑
---
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java | 515 ++++++++++++++++++++++++++++++++-------------------------
1 files changed, 288 insertions(+), 227 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
index 0975e60..7a47a33 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -138,8 +138,6 @@
private volatile int accumulatedLongLossCount = 0;
/** 空头累计止损张数(加仓订单成交后归零) */
private volatile int accumulatedShortLossCount = 0;
- /** 是否首次挂单成交(初始化后重置为 true,首次成交后置 false) */
- private volatile boolean firstFillAfterInit = true;
private volatile BigDecimal lastKlinePrice;
private volatile BigDecimal markPrice = BigDecimal.ZERO;
@@ -309,7 +307,6 @@
shortActive = false;
accumulatedLongLossCount = 0;
accumulatedShortLossCount = 0;
- firstFillAfterInit = true;
shortPriceQueue.clear();
longPriceQueue.clear();
totalShortPriceQueue.clear();
@@ -397,18 +394,18 @@
checkProfitAndReset();
-// if (state == StrategyState.ACTIVE &&
-// longActive == false &&
-// longPositionSize.compareTo(BigDecimal.ZERO) == 0){
-// processShortGrid(closePrice);
-// }
-//
-//
-// if (state == StrategyState.ACTIVE &&
-// shortActive == false &&
-// shortPositionSize.compareTo(BigDecimal.ZERO) == 0){
-// processLongGrid(closePrice);
-// }
+ if (state == StrategyState.ACTIVE &&
+ longActive == false &&
+ longPositionSize.compareTo(BigDecimal.ZERO) == 0){
+ processShortGrid(closePrice);
+ }
+
+
+ if (state == StrategyState.ACTIVE &&
+ shortActive == false &&
+ shortPositionSize.compareTo(BigDecimal.ZERO) == 0){
+ processLongGrid(closePrice);
+ }
}
/** Gate 永续合约 taker 费率 0.05% */
@@ -631,11 +628,6 @@
if (shortGridElement.isHasShortOrder() && StrUtil.isNotEmpty(tradeId) && !tradeId.equals("0") ){
int filledQty = Integer.parseInt(shortGridElement.getShortTraderParam().getQuantity());
shortEntryTraderIdParam(shortGridElement, null, false);
- // 首次挂单成交,取消初始化阶段挂的所有止盈单
- if (firstFillAfterInit) {
- cancelAllInitialTakeProfits();
- firstFillAfterInit = false;
- }
// [Gate-需求2] 加仓后先撤空仓所有止盈+止损,再查交易所持仓后重挂
cancelAllShortTakeProfitsAndStopLosses();
// REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底
@@ -643,37 +635,37 @@
extendShortStopLoss(posSize, shortGridElement.getId());
log.info("[Gate] 空单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
- int tpGridId = 0;
- GridElement tpElem = GridElement.findById(tpGridId);
- // 已有止盈单先取消再重挂
- String existingShortTpId = tpElem.getShortTakeProfitOrderId();
- if (existingShortTpId != null) {
- executor.cancelConditionalOrder(existingShortTpId, oid -> {
- shortTakeProfitTraderIdParam(tpElem, null, false);
- log.info("[Gate] 空仓止盈取消(gridId:{}),准备重挂", tpGridId);
- });
- }
- BigDecimal tpPrice = tpElem.getGridPrice();
- int finalTpGridId = tpGridId;
- executor.placeTakeProfit(
- tpPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- ORDER_TYPE_CLOSE_SHORT,
- config.getQuantity(),
- profitId -> {
- shortTakeProfitTraderIdParam(tpElem, profitId, true);
- log.info("[Gate] 空仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
- finalTpGridId, tpPrice, profitId);
- }
- );
+// int tpGridId = 0;
+// GridElement tpElem = GridElement.findById(tpGridId);
+// // 已有止盈单先取消再重挂
+// String existingShortTpId = tpElem.getShortTakeProfitOrderId();
+// if (existingShortTpId != null) {
+// executor.cancelConditionalOrder(existingShortTpId, oid -> {
+// shortTakeProfitTraderIdParam(tpElem, null, false);
+// log.info("[Gate] 空仓止盈取消(gridId:{}),准备重挂", tpGridId);
+// });
+// }
+// BigDecimal tpPrice = tpElem.getGridPrice();
+// int finalTpGridId = tpGridId;
+// executor.placeTakeProfit(
+// tpPrice,
+// FuturesPriceTrigger.RuleEnum.NUMBER_2,
+// ORDER_TYPE_CLOSE_SHORT,
+// config.getQuantity(),
+// profitId -> {
+// shortTakeProfitTraderIdParam(tpElem, profitId, true);
+// log.info("[Gate] 空仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
+// finalTpGridId, tpPrice, profitId);
+// }
+// );
-// // 空仓持仓超过baseQuantity时,先找多仓第一个止损位置,从该位置向下挂止盈(间隔=1)
-// BigDecimal shortBaseQty = new BigDecimal(config.getBaseQuantity());
-// BigDecimal shortGridQty = new BigDecimal(config.getQuantity());
-// if (BigDecimal.valueOf(posSize).compareTo(shortBaseQty) > 0) {
-// BigDecimal shortExcess = BigDecimal.valueOf(posSize).subtract(shortBaseQty);
-// int shortExcessCount = shortExcess.divide(shortGridQty, 0, RoundingMode.DOWN).intValue();
-//
+ // 空仓持仓超过baseQuantity时,先找多仓第一个止损位置,从该位置向下挂止盈(间隔=1)
+ BigDecimal shortBaseQty = new BigDecimal(config.getBaseQuantity());
+ BigDecimal shortGridQty = new BigDecimal(config.getQuantity());
+ if (BigDecimal.valueOf(posSize).compareTo(shortBaseQty) > 0) {
+ BigDecimal shortExcess = BigDecimal.valueOf(posSize).subtract(shortBaseQty);
+ int shortExcessCount = shortExcess.divide(shortGridQty, 0, RoundingMode.DOWN).intValue();
+
// // 找多仓第一个(最近的)止损位置
// int firstLongSlId = 0;
// for (GridElement e : config.getGridElements()) {
@@ -683,33 +675,28 @@
// }
// }
// }
-//
-// for (int i = 0; i < shortExcessCount; i++) {
-// int tpGridId;
-// if (firstLongSlId != 0) {
-// tpGridId = firstLongSlId - i; // 从多仓第一个止损位置开始,向下挂,间隔=1
-// } else {
-// tpGridId = shortGridElement.getId() - 2 * (i + 1); // 无多仓止损时回退原逻辑
-// }
-// GridElement tpElem = GridElement.findById(tpGridId);
-// if (tpElem == null || tpElem.getShortTakeProfitOrderId() != null) {
-// continue;
-// }
-// BigDecimal tpPrice = tpElem.getGridPrice();
-// int finalTpGridId = tpGridId;
-// executor.placeTakeProfit(
-// tpPrice,
-// FuturesPriceTrigger.RuleEnum.NUMBER_2,
-// ORDER_TYPE_CLOSE_SHORT,
-// config.getQuantity(),
-// profitId -> {
-// shortTakeProfitTraderIdParam(tpElem, profitId, true);
-// log.info("[Gate] 空仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
-// finalTpGridId, tpPrice, profitId);
-// }
-// );
-// }
-// }
+
+ for (int i = 0; i < shortExcessCount; i++) {
+ int tpGridId = shortGridElement.getId() - 2 * (i + 1);
+ GridElement tpElem = GridElement.findById(tpGridId);
+ if (tpElem == null || tpElem.getShortTakeProfitOrderId() != null) {
+ continue;
+ }
+ BigDecimal tpPrice = tpElem.getGridPrice();
+ int finalTpGridId = tpGridId;
+ executor.placeTakeProfit(
+ tpPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_2,
+ ORDER_TYPE_CLOSE_SHORT,
+ config.getQuantity(),
+ profitId -> {
+ shortTakeProfitTraderIdParam(tpElem, profitId, true);
+ log.info("[Gate] 空仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
+ finalTpGridId, tpPrice, profitId);
+ }
+ );
+ }
+ }
}
}
GridElement longGridElement = GridElement.findByLongOrderId(orderId);
@@ -718,11 +705,6 @@
int filledQty = Integer.parseInt(longGridElement.getLongTraderParam().getQuantity());
longEntryTraderIdParam(longGridElement, null, false);
- // 首次挂单成交,取消初始化阶段挂的所有止盈单
- if (firstFillAfterInit) {
- cancelAllInitialTakeProfits();
- firstFillAfterInit = false;
- }
// [Gate-需求2] 加仓后先撤多仓所有止盈+止损,再查交易所持仓后重挂
cancelAllLongTakeProfitsAndStopLosses();
// REST 查询可能因交易所延迟返回旧值,与 WS 本地缓存取最大值兜底
@@ -730,37 +712,37 @@
extendLongStopLoss(posSize, longGridElement.getId());
log.info("[Gate] 多单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize);
- int tpGridId = 0;
- GridElement tpElem = GridElement.findById(tpGridId);
- // 已有止盈单先取消再重挂
- String existingLongTpId = tpElem.getLongTakeProfitOrderId();
- if (existingLongTpId != null) {
- executor.cancelConditionalOrder(existingLongTpId, oid -> {
- longTakeProfitTraderIdParam(tpElem, null, false);
- log.info("[Gate] 多仓止盈取消(gridId:{}),准备重挂", tpGridId);
- });
- }
- BigDecimal tpPrice = tpElem.getGridPrice();
- int finalTpGridId = tpGridId;
- executor.placeTakeProfit(
- tpPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- ORDER_TYPE_CLOSE_LONG,
- negate(config.getQuantity()),
- profitId -> {
- longTakeProfitTraderIdParam(tpElem, profitId, true);
- log.info("[Gate] 多仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
- finalTpGridId, tpPrice, profitId);
- }
- );
+// int tpGridId = 0;
+// GridElement tpElem = GridElement.findById(tpGridId);
+// // 已有止盈单先取消再重挂
+// String existingLongTpId = tpElem.getLongTakeProfitOrderId();
+// if (existingLongTpId != null) {
+// executor.cancelConditionalOrder(existingLongTpId, oid -> {
+// longTakeProfitTraderIdParam(tpElem, null, false);
+// log.info("[Gate] 多仓止盈取消(gridId:{}),准备重挂", tpGridId);
+// });
+// }
+// BigDecimal tpPrice = tpElem.getGridPrice();
+// int finalTpGridId = tpGridId;
+// executor.placeTakeProfit(
+// tpPrice,
+// FuturesPriceTrigger.RuleEnum.NUMBER_1,
+// ORDER_TYPE_CLOSE_LONG,
+// negate(config.getQuantity()),
+// profitId -> {
+// longTakeProfitTraderIdParam(tpElem, profitId, true);
+// log.info("[Gate] 多仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
+// finalTpGridId, tpPrice, profitId);
+// }
+// );
-// // 多仓持仓超过baseQuantity时,先找空仓第一个止损位置,从该位置向上挂止盈(间隔=1)
-// BigDecimal longBaseQty = new BigDecimal(config.getBaseQuantity());
-// BigDecimal longGridQty = new BigDecimal(config.getQuantity());
-// if (BigDecimal.valueOf(posSize).compareTo(longBaseQty) > 0) {
-// BigDecimal longExcess = BigDecimal.valueOf(posSize).subtract(longBaseQty);
-// int longExcessCount = longExcess.divide(longGridQty, 0, RoundingMode.DOWN).intValue();
-//
+ // 多仓持仓超过baseQuantity时,先找空仓第一个止损位置,从该位置向上挂止盈(间隔=1)
+ BigDecimal longBaseQty = new BigDecimal(config.getBaseQuantity());
+ BigDecimal longGridQty = new BigDecimal(config.getQuantity());
+ if (BigDecimal.valueOf(posSize).compareTo(longBaseQty) > 0) {
+ BigDecimal longExcess = BigDecimal.valueOf(posSize).subtract(longBaseQty);
+ int longExcessCount = longExcess.divide(longGridQty, 0, RoundingMode.DOWN).intValue();
+
// // 找空仓第一个(最近的)止损位置
// int firstShortSlId = 0;
// for (GridElement e : config.getGridElements()) {
@@ -770,33 +752,28 @@
// }
// }
// }
-//
-// for (int i = 0; i < longExcessCount; i++) {
-// int tpGridId;
-// if (firstShortSlId != 0) {
-// tpGridId = firstShortSlId + i; // 从空仓第一个止损位置开始,向上挂,间隔=1
-// } else {
-// tpGridId = longGridElement.getId() + 2 * (i + 1); // 无空仓止损时回退原逻辑
-// }
-// GridElement tpElem = GridElement.findById(tpGridId);
-// if (tpElem == null || tpElem.getLongTakeProfitOrderId() != null) {
-// continue;
-// }
-// BigDecimal tpPrice = tpElem.getGridPrice();
-// int finalTpGridId = tpGridId;
-// executor.placeTakeProfit(
-// tpPrice,
-// FuturesPriceTrigger.RuleEnum.NUMBER_1,
-// ORDER_TYPE_CLOSE_LONG,
-// negate(config.getQuantity()),
-// profitId -> {
-// longTakeProfitTraderIdParam(tpElem, profitId, true);
-// log.info("[Gate] 多仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
-// finalTpGridId, tpPrice, profitId);
-// }
-// );
-// }
-// }
+
+ for (int i = 0; i < longExcessCount; i++) {
+ int tpGridId = longGridElement.getId() + 2 * (i + 1);
+ GridElement tpElem = GridElement.findById(tpGridId);
+ if (tpElem == null || tpElem.getLongTakeProfitOrderId() != null) {
+ continue;
+ }
+ BigDecimal tpPrice = tpElem.getGridPrice();
+ int finalTpGridId = tpGridId;
+ executor.placeTakeProfit(
+ tpPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ ORDER_TYPE_CLOSE_LONG,
+ negate(config.getQuantity()),
+ profitId -> {
+ longTakeProfitTraderIdParam(tpElem, profitId, true);
+ log.info("[Gate] 多仓止盈挂单, gridId:{}, 触发价:{}, takeProfitId:{}",
+ finalTpGridId, tpPrice, profitId);
+ }
+ );
+ }
+ }
}
}
}
@@ -877,42 +854,42 @@
baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId());
baseGridElement.setHasShortOrder(true);
- // 空仓止损对应的多仓止盈:多仓止盈挂在ID=3
- int tpGridIdLong = 3;
- GridElement tpElemLong = GridElement.findById(tpGridIdLong);
- BigDecimal triggerPriceLong = tpElemLong.getGridPrice();
- String sizeLong = config.getBaseQuantity();
- executor.placeTakeProfit(
- triggerPriceLong,
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- ORDER_TYPE_CLOSE_LONG,
- negate(sizeLong),
- profitId -> {
- tpElemLong.setLongTakeProfitOrderId(profitId);
- GridElement.refreshIndices();
- log.info("[Gate] 多仓止盈已挂(gridId:{}多止盈), 触发价:{}, takeProfitId:{}",
- tpGridIdLong, triggerPriceLong, profitId);
- }
- );
-
-
- // 多仓止损对应的空仓止盈:空仓止盈挂在ID=-3
- int tpGridIdShort = -3;
- GridElement tpElemShort = GridElement.findById(tpGridIdShort);
- BigDecimal triggerPriceShort = tpElemShort.getGridPrice();
- String sizeShort = config.getBaseQuantity();
- executor.placeTakeProfit(
- triggerPriceShort,
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- ORDER_TYPE_CLOSE_SHORT,
- sizeShort,
- profitId -> {
- tpElemShort.setShortTakeProfitOrderId(profitId);
- GridElement.refreshIndices();
- log.info("[Gate] 空仓止盈已挂(gridId:{}空止盈), 触发价:{}, takeProfitId:{}",
- tpGridIdShort, triggerPriceShort, profitId);
- }
- );
+// // 空仓止损对应的多仓止盈:多仓止盈挂在ID=3
+// int tpGridIdLong = 3;
+// GridElement tpElemLong = GridElement.findById(tpGridIdLong);
+// BigDecimal triggerPriceLong = tpElemLong.getGridPrice();
+// String sizeLong = config.getBaseQuantity();
+// executor.placeTakeProfit(
+// triggerPriceLong,
+// FuturesPriceTrigger.RuleEnum.NUMBER_1,
+// ORDER_TYPE_CLOSE_LONG,
+// negate(sizeLong),
+// profitId -> {
+// tpElemLong.setLongTakeProfitOrderId(profitId);
+// GridElement.refreshIndices();
+// log.info("[Gate] 多仓止盈已挂(gridId:{}多止盈), 触发价:{}, takeProfitId:{}",
+// tpGridIdLong, triggerPriceLong, profitId);
+// }
+// );
+//
+//
+// // 多仓止损对应的空仓止盈:空仓止盈挂在ID=-3
+// int tpGridIdShort = -3;
+// GridElement tpElemShort = GridElement.findById(tpGridIdShort);
+// BigDecimal triggerPriceShort = tpElemShort.getGridPrice();
+// String sizeShort = config.getBaseQuantity();
+// executor.placeTakeProfit(
+// triggerPriceShort,
+// FuturesPriceTrigger.RuleEnum.NUMBER_2,
+// ORDER_TYPE_CLOSE_SHORT,
+// sizeShort,
+// profitId -> {
+// tpElemShort.setShortTakeProfitOrderId(profitId);
+// GridElement.refreshIndices();
+// log.info("[Gate] 空仓止盈已挂(gridId:{}空止盈), 触发价:{}, takeProfitId:{}",
+// tpGridIdShort, triggerPriceShort, profitId);
+// }
+// );
// int shortTime = 2;
// GridElement elemShort = GridElement.findById(shortTime);
@@ -1694,32 +1671,11 @@
}
}
- int interval = 1;
- if (furthestSlId == 0) {
- furthestSlId = gridId;
- interval = 2;
- }
- int stopLossCount = filledQty;
- log.info("[Gate] 多仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}张止损单", furthestSlId, filledQty, stopLossCount);
- int newSlId = furthestSlId - interval;
- GridElement elem = GridElement.findById(newSlId);
- if (elem == null) {
- return;
- }
- BigDecimal triggerPrice = elem.getGridPrice();
- int finalSlId = newSlId;
- executor.placeTakeProfit(
- triggerPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_2,
- ORDER_TYPE_CLOSE_LONG,
- negate(String.valueOf(stopLossCount)),
- profitId -> {
- elem.setLongStopLossOrderId(profitId);
- GridElement.refreshIndices();
- log.info("[Gate] 多仓止损追加, gridId:{}, 触发价:{}, stopLossId:{}", finalSlId, triggerPrice, profitId);
- }
- );
-
+// int interval = 1;
+// if (furthestSlId == 0) {
+// furthestSlId = gridId;
+// interval = 2;
+// }
// int stopLossCount = filledQty / Integer.parseInt(config.getQuantity());
// log.info("[Gate] 多仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, stopLossCount);
// for (int i = 0; i < stopLossCount; i++) {
@@ -1742,6 +1698,69 @@
// }
// );
// }
+
+ int parseInt = Integer.parseInt(config.getQuantity());
+ int total = filledQty - parseInt;
+ if (total > parseInt) {
+ String firstNum = String.valueOf(total);
+ log.info("[Gate] 多仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, 2);
+ int newSlId = gridId - 2;
+ GridElement elem = GridElement.findById(newSlId);
+ if (elem != null) {
+ BigDecimal triggerPrice = elem.getGridPrice();
+ int finalSlId = newSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_2,
+ ORDER_TYPE_CLOSE_LONG,
+ negate(firstNum),
+ profitId -> {
+ elem.setLongStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 多仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, firstNum, profitId);
+ }
+ );
+ }
+ int newSecendSlId = gridId - 3;
+ GridElement elemSecend = GridElement.findById(newSecendSlId);
+ if (elemSecend != null) {
+ BigDecimal triggerPrice = elemSecend.getGridPrice();
+ int finalSlId = newSecendSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_2,
+ ORDER_TYPE_CLOSE_LONG,
+ negate(config.getQuantity()),
+ profitId -> {
+ elemSecend.setLongStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 多仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, config.getQuantity(), profitId);
+ }
+ );
+ }
+ }
+ if (total == parseInt){
+ String firstNum = config.getQuantity();
+ log.info("[Gate] 多仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, 1);
+ int newSlId = gridId - 2;
+ GridElement elem = GridElement.findById(newSlId);
+ if (elem != null) {
+ BigDecimal triggerPrice = elem.getGridPrice();
+ int finalSlId = newSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_2,
+ ORDER_TYPE_CLOSE_LONG,
+ negate(firstNum),
+ profitId -> {
+ elem.setLongStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 多仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, firstNum, profitId);
+ }
+ );
+ }
+ }
+
}
private void extendShortStopLoss(int filledQty, int gridId) {
@@ -1752,32 +1771,11 @@
}
}
- int interval = 1;
- if (furthestSlId == 0) {
- furthestSlId = gridId;
- interval = 2;
- }
- int stopLossCount = filledQty ;
- log.info("[Gate] 空仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}张止损单", furthestSlId, filledQty, stopLossCount);
- int newSlId = furthestSlId + interval;
- GridElement elem = GridElement.findById(newSlId);
- if (elem == null) {
- return;
- }
- BigDecimal triggerPrice = elem.getGridPrice();
- int finalSlId = newSlId;
- executor.placeTakeProfit(
- triggerPrice,
- FuturesPriceTrigger.RuleEnum.NUMBER_1,
- ORDER_TYPE_CLOSE_SHORT,
- String.valueOf(stopLossCount),
- profitId -> {
- elem.setShortStopLossOrderId(profitId);
- GridElement.refreshIndices();
- log.info("[Gate] 空仓止损追加, gridId:{}, 触发价:{}, stopLossId:{}", finalSlId, triggerPrice, profitId);
- }
- );
-
+// int interval = 1;
+// if (furthestSlId == 0) {
+// furthestSlId = gridId;
+// interval = 2;
+// }
// int stopLossCount = filledQty / Integer.parseInt(config.getQuantity());
// log.info("[Gate] 空仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, stopLossCount);
// for (int i = 0; i < stopLossCount; i++) {
@@ -1800,6 +1798,69 @@
// }
// );
// }
+
+ int parseInt = Integer.parseInt(config.getQuantity());
+ int total = filledQty - parseInt;
+ if (total > parseInt) {
+ String firstNum = String.valueOf(total);
+ log.info("[Gate] 空仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, 2);
+ int newSlId = gridId + 2;
+ GridElement elem = GridElement.findById(newSlId);
+ if (elem != null) {
+ BigDecimal triggerPrice = elem.getGridPrice();
+ int finalSlId = newSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ ORDER_TYPE_CLOSE_SHORT,
+ firstNum,
+ profitId -> {
+ elem.setShortStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 空仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, firstNum, profitId);
+ }
+ );
+ }
+ int newSecendSlId = gridId + 2;
+ GridElement elemSecend = GridElement.findById(newSecendSlId);
+ if (elemSecend != null) {
+ BigDecimal triggerPrice = elemSecend.getGridPrice();
+ int finalSlId = newSecendSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ ORDER_TYPE_CLOSE_SHORT,
+ config.getQuantity(),
+ profitId -> {
+ elemSecend.setShortStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 空仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, config.getQuantity(), profitId);
+ }
+ );
+ }
+ }
+ if (total == parseInt) {
+ String firstNum = config.getQuantity();
+ log.info("[Gate] 空仓追挂止损, 当前最远止损gridId:{}, 成交{}张, 追加{}个止损单", furthestSlId, filledQty, 1);
+ int newSlId = gridId + 2;
+ GridElement elem = GridElement.findById(newSlId);
+ if (elem != null) {
+ BigDecimal triggerPrice = elem.getGridPrice();
+ int finalSlId = newSlId;
+ executor.placeTakeProfit(
+ triggerPrice,
+ FuturesPriceTrigger.RuleEnum.NUMBER_1,
+ ORDER_TYPE_CLOSE_SHORT,
+ firstNum,
+ profitId -> {
+ elem.setShortStopLossOrderId(profitId);
+ GridElement.refreshIndices();
+ log.info("[Gate] 空仓止损追加, gridId:{}, 触发价:{}, 数量:{}, stopLossId:{}", finalSlId, triggerPrice, firstNum, profitId);
+ }
+ );
+ }
+ }
+
}
// ---- 工具 ----
--
Gitblit v1.9.1