| | |
| | | private volatile BigDecimal shortPositionSize = BigDecimal.ZERO; |
| | | private Long userId; |
| | | private volatile BigDecimal initialPrincipal = BigDecimal.ZERO; |
| | | private volatile GateKlineWebSocketClient wsClient; |
| | | |
| | | public GateGridTradeService(GateConfig config) { |
| | | this.config = config; |
| | |
| | | |
| | | //初始化0位置的开仓,并且用空的开仓价格,作为价格基准来划分网格 |
| | | if (state == StrategyState.WAITING_KLINE) { |
| | | if (wsClient == null || !wsClient.areAllSubscribed()) { |
| | | return; |
| | | } |
| | | state = StrategyState.OPENING; |
| | | log.info("[Gate] 首根K线到达,开基底仓位 多空各{}张...", config.getBaseQuantity()); |
| | | executor.openLong(config.getBaseQuantity(), (orderId) -> { |
| | |
| | | triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_1, |
| | | ORDER_TYPE_CLOSE_SHORT, |
| | | "1", |
| | | config.getQuantity(), |
| | | profitId -> { |
| | | elem.setShortStopLossOrderId(profitId); |
| | | GridElement.refreshIndices(); |
| | |
| | | triggerPrice, |
| | | FuturesPriceTrigger.RuleEnum.NUMBER_2, |
| | | ORDER_TYPE_CLOSE_LONG, |
| | | "-1", |
| | | negate(config.getQuantity()), |
| | | profitId -> { |
| | | elem.setLongStopLossOrderId(profitId); |
| | | GridElement.refreshIndices(); |
| | |
| | | public Long getUserId() { return userId; } |
| | | /** @return 当前策略状态 */ |
| | | public StrategyState getState() { return state; } |
| | | /** 注入WS客户端,用于订阅状态检查 */ |
| | | public void setWsClient(GateKlineWebSocketClient wsClient) { this.wsClient = wsClient; } |
| | | } |