From 7ff32aba4d8d763affa76c68260008bd45605f40 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 12 May 2026 17:39:44 +0800
Subject: [PATCH] fix(trade): 修复网格交易逻辑并更新生产配置
---
src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java | 76 +++++++++++++++++++++++++++++++++++++-
1 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java
index 1de7805..1f3dcda 100644
--- a/src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java
@@ -260,6 +260,78 @@
}
/**
+ * 异步创建条件开仓单(价格触发后以触发价限价开仓)。
+ *
+ * <p>服务器监控价格,达到触发价后以触发价挂 GTC 限价单开仓。与止盈单不同,不设 order_type(默认开仓),
+ * reduce_only=false。
+ *
+ * @param triggerPrice 触发价格(同时也是限价执行价格)
+ * @param rule 触发规则(NUMBER_1: 最新价≥触发价时执行;NUMBER_2: 最新价≤触发价时执行)
+ * @param size 开仓张数(正=开多,负=开空)
+ * @param onSuccess 成功回调,接收 conditionOrderId
+ * @param onFailure 失败回调
+ */
+ public void placeConditionalEntryOrder(BigDecimal triggerPrice,
+ FuturesPriceTrigger.RuleEnum rule,
+ String size,
+ Consumer<String> onSuccess,
+ Runnable onFailure) {
+ executor.execute(() -> {
+ try {
+ FuturesPriceTrigger trigger = new FuturesPriceTrigger();
+ trigger.setStrategyType(FuturesPriceTrigger.StrategyTypeEnum.NUMBER_0);
+ trigger.setPriceType(FuturesPriceTrigger.PriceTypeEnum.NUMBER_0);
+ trigger.setPrice(triggerPrice.toString());
+ trigger.setRule(rule);
+ trigger.setExpiration(0);
+
+ FuturesInitialOrder initial = new FuturesInitialOrder();
+ initial.setContract(contract);
+ initial.setSize(Long.parseLong(size));
+ initial.setPrice(triggerPrice.toString());
+ initial.setTif(FuturesInitialOrder.TifEnum.GTC);
+ initial.setReduceOnly(false);
+
+ FuturesPriceTriggeredOrder order = new FuturesPriceTriggeredOrder();
+ order.setTrigger(trigger);
+ order.setInitial(initial);
+
+ TriggerOrderResponse response = futuresApi.createPriceTriggeredOrder(SETTLE, order);
+ String orderId = String.valueOf(response.getId());
+ log.info("[TradeExec] 条件开仓单已创建, trigger:{}, rule:{}, size:{}, id:{}",
+ triggerPrice, rule, size, orderId);
+ if (onSuccess != null) {
+ onSuccess.accept(orderId);
+ }
+ } catch (Exception e) {
+ log.error("[TradeExec] 条件开仓单创建失败, trigger:{}, size:{}", triggerPrice, size, e);
+ if (onFailure != null) {
+ onFailure.run();
+ }
+ }
+ });
+ }
+
+ /**
+ * 异步取消单个条件单。
+ *
+ * @param orderId 条件单 ID,为 null 时跳过
+ */
+ public void cancelConditionalOrder(String orderId) {
+ if (orderId == null) {
+ return;
+ }
+ executor.execute(() -> {
+ try {
+ futuresApi.cancelPriceTriggeredOrder(SETTLE, Long.parseLong(orderId));
+ log.info("[TradeExec] 条件单已取消, id:{}", orderId);
+ } catch (Exception e) {
+ log.warn("[TradeExec] 取消条件单失败(可能已触发), id:{}", orderId);
+ }
+ });
+ }
+
+ /**
* 构建 FuturesPriceTriggeredOrder 对象。
*
* <p>策略=0(价格触发),price_type=0(最新价),expiration=0(永不过期),
@@ -286,8 +358,8 @@
FuturesInitialOrder initial = new FuturesInitialOrder();
initial.setContract(contract);
initial.setSize(Long.parseLong(size));
- initial.setPrice("0");
- initial.setTif(FuturesInitialOrder.TifEnum.IOC);
+ initial.setPrice(triggerPrice.toString());
+ initial.setTif(FuturesInitialOrder.TifEnum.GTC);
initial.setReduceOnly(true);
FuturesPriceTriggeredOrder order = new FuturesPriceTriggeredOrder();
--
Gitblit v1.9.1