| | |
| | | return; |
| | | } |
| | | |
| | | |
| | | checkProfitAndReset(); |
| | | |
| | | |
| | | if (state == StrategyState.ACTIVE && |
| | | longActive == false && |
| | | longPositionSize.compareTo(BigDecimal.ZERO) == 0){ |
| | |
| | | } |
| | | } |
| | | |
| | | /** Gate 永续合约 taker 费率 0.05% */ |
| | | private static final BigDecimal TAKER_FEE_RATE = new BigDecimal("0.0005"); |
| | | private void checkProfitAndReset() { |
| | | try { |
| | | |
| | | BigDecimal target = initialPrincipal.add(config.getExpectedProfit()); |
| | | |
| | | FuturesAccount account = futuresApi.listFuturesAccounts(SETTLE); |
| | | BigDecimal unrealisedPnl = new BigDecimal(account.getCrossUnrealisedPnl()); |
| | | BigDecimal available = new BigDecimal(account.getCrossAvailable()); |
| | | BigDecimal totalEquity = unrealisedPnl.add(available); |
| | | |
| | | // 估算平仓手续费:(多仓张数+空仓张数) × 合约面值 × 当前价 × taker费率 |
| | | BigDecimal totalSize = longPositionSize.abs().add(shortPositionSize.abs()); |
| | | BigDecimal closeContractValue = |
| | | totalSize.multiply(config.getContractMultiplier()).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO); |
| | | BigDecimal estimatedFee = closeContractValue.multiply(TAKER_FEE_RATE); |
| | | BigDecimal netEquity = totalEquity.subtract(estimatedFee); |
| | | log.info("[Gate] 盈亏检查,总张数:{}, upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}", |
| | | totalSize,unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target); |
| | | if (netEquity.compareTo(target) > 0) { |
| | | log.info("[Gate] 盈亏达标(净权益{}>目标{}),重置策略", netEquity, target); |
| | | state = StrategyState.STOPPED; |
| | | try { |
| | | futuresApi.cancelPriceTriggeredOrderList(SETTLE, config.getContract()); |
| | | } catch (ApiException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | closeExistingPositions(); |
| | | // 提交到 executor 末尾:单线程FIFO保证前面所有平仓/取消任务完成后才重置 |
| | | executor.submitTask(() -> { |
| | | try { Thread.sleep(3000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } |
| | | startGrid(); |
| | | }); |
| | | } |
| | | } catch (Exception e) { |
| | | log.warn("[Gate] 盈亏检查失败", e); |
| | | } |
| | | } |
| | | |
| | | // ---- 仓位推送回调 ---- |
| | | |
| | | /** |