| | |
| | | } |
| | | } else { |
| | | if (longActive && state == StrategyState.ACTIVE) { |
| | | log.info("[Gate] 多仓持仓归零,重置策略"); |
| | | handlePositionZeroAndReset("多仓"); |
| | | // log.info("[Gate] 多仓持仓归零,重置策略"); |
| | | // handlePositionZeroAndReset("多仓"); |
| | | } |
| | | longActive = false; |
| | | longPositionSize = BigDecimal.ZERO; |
| | |
| | | } |
| | | } else { |
| | | if (shortActive && state == StrategyState.ACTIVE) { |
| | | log.info("[Gate] 空仓持仓归零,重置策略"); |
| | | handlePositionZeroAndReset("空仓"); |
| | | // log.info("[Gate] 空仓持仓归零,重置策略"); |
| | | // handlePositionZeroAndReset("空仓"); |
| | | } |
| | | shortActive = false; |
| | | shortPositionSize = BigDecimal.ZERO; |
| | |
| | | shortEntryQty = 1; |
| | | extendShortStopLoss(filledQty); |
| | | log.info("[Gate] 空单成交 gridId:{}, qty:{}, 追挂止损", shortGridElement.getId(), filledQty); |
| | | checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId()); |
| | | // checkMaxPositionAndPlaceTakeProfit(false, shortGridElement.getId()); |
| | | } |
| | | } |
| | | GridElement longGridElement = GridElement.findByLongOrderId(orderId); |
| | |
| | | longEntryQty = 1; |
| | | extendLongStopLoss(filledQty); |
| | | log.info("[Gate] 多单成交 gridId:{}, qty:{}, 追挂止损", longGridElement.getId(), filledQty); |
| | | checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId()); |
| | | // checkMaxPositionAndPlaceTakeProfit(true, longGridElement.getId()); |
| | | } |
| | | } |
| | | } |
| | |
| | | baseGridElement.setShortOrderId(baseShortTraderParam.getEntryOrderId()); |
| | | baseGridElement.setHasShortOrder(true); |
| | | |
| | | for (int id = 2; id <= 11; id++) { |
| | | int shortTime = Integer.parseInt(config.getBaseQuantity()) + 1; |
| | | for (int id = 2; id <= shortTime; id++) { |
| | | GridElement elem = GridElement.findById(id); |
| | | if (elem == null) { |
| | | continue; |
| | |
| | | ); |
| | | } |
| | | |
| | | for (int id = -2; id >= -11; id--) { |
| | | |
| | | int longTime = Integer.parseInt(config.getBaseQuantity()) + 1; |
| | | for (int id = -2; id >= -longTime; id--) { |
| | | GridElement elem = GridElement.findById(id); |
| | | if (elem == null) { |
| | | continue; |
| | |
| | | ); |
| | | } |
| | | |
| | | log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~11, 多仓止损: -2~-11"); |
| | | log.info("[Gate] 止损单已全部挂完, 空仓止损: 2~{}, 多仓止损: -2~-{}", shortTime, longTime); |
| | | state = StrategyState.ACTIVE; |
| | | } |
| | | } |
| | |
| | | BigDecimal totalEquity = unrealisedPnl.add(available); |
| | | |
| | | // 估算平仓手续费:(多仓张数+空仓张数) × 合约面值 × 当前价 × taker费率 |
| | | BigDecimal closeContractValue = longPositionSize.add(shortPositionSize) |
| | | .multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO); |
| | | BigDecimal totalSize = longPositionSize.abs().add(shortPositionSize.abs()); |
| | | BigDecimal closeContractValue = |
| | | totalSize.multiply(CT_VAL).multiply(lastKlinePrice != null ? lastKlinePrice : BigDecimal.ZERO); |
| | | BigDecimal estimatedFee = closeContractValue.multiply(TAKER_FEE_RATE); |
| | | BigDecimal netEquity = totalEquity.subtract(estimatedFee); |
| | | |
| | | BigDecimal target = initialPrincipal.add(config.getExpectedProfit()); |
| | | log.info("[Gate] 盈亏检查 upl:{}, avail:{}, 合计:{}, 估手续费:{}, 净权益:{}, 目标:{}", |
| | | unrealisedPnl, available, totalEquity, estimatedFee, netEquity, target); |
| | | 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; |