Administrator
18 hours ago d09d51ddc4c768083387cf7660bb8060aa8b48f2
src/main/java/com/xcong/excoin/modules/gateApi/GateTradeExecutor.java
@@ -38,19 +38,33 @@
 *
 * <h3>调用链</h3>
 * <pre>
 *   GateGridTradeService.onKline → executor.openLong/openShort (基底双开 + 网格触发)
 *   GateGridTradeService.onPositionUpdate → executor.placeTakeProfit (开仓成交后设止盈)
 *   // 基底双开
 *   GateGridTradeService.init → executor.openLong / executor.openShort
 *
 *   // 网格条件开仓
 *   GateGridTradeService.tryGenerateQueues / processShortGrid / processLongGrid
 *     → executor.placeConditionalEntryOrder(价格触发后市价 IOC 开仓)
 *     → executor.cancelConditionalOrder(取消对方方向旧条件单)
 *
 *   // 止盈
 *   GateGridTradeService.onPositionUpdate → executor.placeTakeProfit(开仓后设止盈条件单)
 *
 *   // 停止
 *   GateGridTradeService.stopGrid → executor.cancelAllPriceTriggeredOrders
 * </pre>
 *
 * @author Administrator
 * <h3>遗留方法(当前策略未使用)</h3>
 * {@link #placeGridLimitOrder(BigDecimal, String, Consumer, Runnable)} 和
 * {@link #cancelOrder(String)} 为旧版限价单策略的遗留方法,保留以备后续使用。
 */
@Slf4j
public class GateTradeExecutor {
    private static final String SETTLE = "usdt";
    /** Gate U 本位合约 REST API */
    private final FuturesApi futuresApi;
    /** 合约名称(如 ETH_USDT) */
    private final String contract;
    /** 交易线程池:单线程 + 有界队列 + 背压策略 */
@@ -94,7 +108,7 @@
     * @param onSuccess 成交成功回调(可为 null)
     * @param onFailure 成交失败回调(可为 null)
     */
    public void openLong(String quantity, Runnable onSuccess, Runnable onFailure) {
    public void openLong(String quantity, Consumer<String> onSuccess, Runnable onFailure) {
        openPosition(quantity, "t-grid-long", "开多", onSuccess, onFailure);
    }
@@ -105,7 +119,7 @@
     * @param onSuccess 成交成功回调(可为 null)
     * @param onFailure 成交失败回调(可为 null)
     */
    public void openShort(String quantity, Runnable onSuccess, Runnable onFailure) {
    public void openShort(String quantity, Consumer<String> onSuccess, Runnable onFailure) {
        openPosition(quantity, "t-grid-short", "开空", onSuccess, onFailure);
    }
@@ -118,7 +132,7 @@
     * @param onSuccess 成功回调
     * @param onFailure 失败回调
     */
    private void openPosition(String size, String text, String label, Runnable onSuccess, Runnable onFailure) {
    private void openPosition(String size, String text, String label, Consumer<String> onSuccess, Runnable onFailure) {
        executor.execute(() -> {
            try {
                FuturesOrder order = new FuturesOrder();
@@ -129,8 +143,9 @@
                order.setText(text);
                FuturesOrder result = futuresApi.createFuturesOrder(SETTLE, order, null);
                log.info("[TradeExec] {}成功, 价格:{}, id:{}", label, result.getFillPrice(), result.getId());
                String orderId = String.valueOf(result.getId());
                if (onSuccess != null) {
                    onSuccess.run();
                    onSuccess.accept(orderId);
                }
            } catch (Exception e) {
                log.error("[TradeExec] {}失败", label, e);
@@ -210,7 +225,10 @@
    }
    /**
     * 异步挂限价单(GTC),用于网格限价开仓。
     * <b>遗留方法 — 当前条件单策略未使用</b>
     *
     * <p>异步挂限价单(GTC),用于旧版网格限价开仓。当前策略改用
     * {@link #placeConditionalEntryOrder(BigDecimal, FuturesPriceTrigger.RuleEnum, String, Consumer, Runnable)}。
     *
     * @param price     限价价格
     * @param size      下单张数(正=多 / 负=空)
@@ -241,7 +259,9 @@
    }
    /**
     * 异步取消指定订单。
     * <b>遗留方法 — 当前条件单策略未使用</b>
     *
     * <p>异步取消指定限价单。当前策略改用 {@link #cancelConditionalOrder(String)}。
     *
     * @param orderId 订单 ID,为 null 时跳过
     */