Administrator
3 days ago 8bd17219604732859e0df2b5a2882a76f4915813
refactor(gateApi): 优化 Gate API 调用和异常处理

- 添加了必要的 IOException 导入
- 将合约从 ETH_USDT 更改为 BTC_USDT
- 统一使用 execute() 方法执行 API 调用
- 合并捕获 ApiException 和 IOException 异常
- 优化导入语句,使用通配符导入模型类
- 在初始化方法中调整代码顺序,先清理旧订单再设置持仓模式
- 使用新的 API 方法更新双向持仓复合位置交叉模式
- 添加更多异常处理和错误打印逻辑
2 files modified
53 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/Example.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/Example.java
@@ -10,6 +10,8 @@
import io.gate.gateapi.models.*;
import io.gate.gateapi.api.AccountApi;
import java.io.IOException;
public class Example {
    public static void main(String[] args) {
        ApiClient defaultClient = Configuration.getDefaultApiClient();
@@ -21,7 +23,7 @@
        try {
            String contract = "ETH_USDT";
            String contract = "BTC_USDT";
            String settle = "usdt";
            //保证金模式 isolated/cross
            String marginMode = "cross";
@@ -60,14 +62,12 @@
                    contract,
                    leverage,
                    marginMode,
                    null);
                    null).execute();
        } catch (GateApiException e) {
            System.err.println(String.format("Gate api exception, label: %s, message: %s", e.getErrorLabel(), e.getMessage()));
            e.printStackTrace();
        } catch (ApiException e) {
        } catch (ApiException | IOException e) {
            System.err.println("Exception when calling AccountApi#getAccountDetail");
            System.err.println("Status code: " + e.getCode());
            System.err.println("Response headers: " + e.getResponseHeaders());
            e.printStackTrace();
        }
    }
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -5,13 +5,10 @@
import io.gate.gateapi.GateApiException;
import io.gate.gateapi.api.AccountApi;
import io.gate.gateapi.api.FuturesApi;
import io.gate.gateapi.models.AccountDetail;
import io.gate.gateapi.models.FuturesAccount;
import io.gate.gateapi.models.FuturesOrder;
import io.gate.gateapi.models.FuturesPriceTrigger;
import io.gate.gateapi.models.Position;
import io.gate.gateapi.models.*;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
@@ -155,25 +152,41 @@
            this.initialPrincipal = new BigDecimal(account.getTotal());
            log.info("[Gate] 初始本金: {} USDT", initialPrincipal);
            futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
            log.info("[Gate] 旧条件单已清除");
            closeExistingPositions();
            //设置持仓模式为双向持仓
            Boolean inDualMode = account.getInDualMode();
            if (!inDualMode) {
                futuresApi.setDualModeCall(SETTLE,true,null);
                try {
                    futuresApi.setDualModeCall(SETTLE,true,null).execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (!config.getPositionMode().equals(account.getPositionMode())) {
                futuresApi.setPositionMode(SETTLE, config.getPositionMode());
            if (!config.getMarginMode().equals(account.getMarginMode())) {
                UpdateDualCompPositionCrossModeRequest updateDualCompPositionCrossModeRequest = new UpdateDualCompPositionCrossModeRequest();
                updateDualCompPositionCrossModeRequest.setMode(config.getMarginMode());
                updateDualCompPositionCrossModeRequest.setContract(config.getContract());
                try {
                    futuresApi.updateDualCompPositionCrossModeCall(SETTLE, updateDualCompPositionCrossModeRequest, null).execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            log.info("[Gate] 持仓模式: {} 余额: {}", config.getPositionMode(), account.getAvailable());
            futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract());
            log.info("[Gate] 旧条件单已清除");
            closeExistingPositions();
            futuresApi.updateDualModePositionLeverageCall(
                    SETTLE, config.getContract(), config.getLeverage(),
                    config.getMarginMode(), null);
            try {
                futuresApi.updateDualModePositionLeverageCall(
                        SETTLE, config.getContract(), config.getLeverage(),
                        config.getMarginMode(), null).execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
            log.info("[Gate] 杠杆: {}x {}", config.getLeverage(), config.getMarginMode());
        } catch (GateApiException e) {
            log.error("[Gate] 初始化失败, label:{}, msg:{}", e.getErrorLabel(), e.getMessage());