| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.xcong.excoin.modules.okxNewPrice.celue.CaoZuoService; |
| | | import com.xcong.excoin.modules.okxNewPrice.okxWs.*; |
| | | import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums; |
| | | import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.ExchangeInfoEnum; |
| | | import com.xcong.excoin.modules.okxNewPrice.okxWs.param.TradeRequestParam; |
| | | import com.xcong.excoin.modules.okxNewPrice.utils.SSLConfig; |
| | | import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeService; |
| | | import com.xcong.excoin.utils.RedisUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.java_websocket.client.WebSocketClient; |
| | | import org.java_websocket.handshake.ServerHandshake; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.PreDestroy; |
| | | import java.math.BigDecimal; |
| | | import java.net.URI; |
| | | import java.net.URISyntaxException; |
| | | import java.util.concurrent.*; |
| | |
| | | public class OkxQuantWebSocketClient { |
| | | private final RedisUtils redisUtils; |
| | | private final ExchangeInfoEnum account; |
| | | private final CaoZuoService caoZuoService; |
| | | |
| | | private WebSocketClient webSocketClient; |
| | | private ScheduledExecutorService heartbeatExecutor; |
| | |
| | | return webSocketClient; |
| | | } |
| | | |
| | | /** |
| | | * 获取账号名称 |
| | | * @return 账号名称 |
| | | */ |
| | | public String getAccountName() { |
| | | return account.name(); |
| | | } |
| | | |
| | | public OkxQuantWebSocketClient(ExchangeInfoEnum account, |
| | | CaoZuoService caoZuoService, |
| | | RedisUtils redisUtils) { |
| | | this.account = account; |
| | | this.caoZuoService = caoZuoService; |
| | | this.redisUtils = redisUtils; |
| | | } |
| | | |
| | |
| | | // 注意:当前实现中,OrderInfoWs等类使用静态Map存储数据 |
| | | // 这会导致多账号之间的数据冲突。需要进一步修改这些类的设计,让数据存储与特定账号关联 |
| | | if (OrderInfoWs.ORDERINFOWS_CHANNEL.equals(channel)) { |
| | | OrderInfoWs.handleEvent(response, redisUtils, account.name()); |
| | | TradeRequestParam tradeRequestParam = OrderInfoWs.handleEvent(response, redisUtils, account.name()); |
| | | tradeRequestParam = caoZuoService.caoZuoZhiSunEvent(tradeRequestParam.getAccountName(), tradeRequestParam.getMarkPx(), tradeRequestParam.getPosSide()); |
| | | TradeOrderWs.orderZhiYingZhiSunEventNoState(webSocketClient, tradeRequestParam); |
| | | }else if (AccountWs.ACCOUNTWS_CHANNEL.equals(channel)) { |
| | | AccountWs.handleEvent(response, account.name()); |
| | | // String side = caoZuoService.caoZuo(account.name()); |
| | | // TradeOrderWs.orderEvent(webSocketClient, side, account.name()); |
| | | } else if (PositionsWs.POSITIONSWS_CHANNEL.equals(channel)) { |
| | | PositionsWs.handleEvent(response, account.name()); |
| | | } else if (BalanceAndPositionWs.CHANNEL_NAME.equals(channel)) { |
| | |
| | | } |
| | | |
| | | int attempt = 0; |
| | | int maxAttempts = 5; |
| | | int maxAttempts = 3; |
| | | long delayMs = 1000; |
| | | |
| | | while (attempt < maxAttempts && !isConnected.get()) { |