refactor(okx): 重构账户与仓位数据处理逻辑
- 提取账户参数初始化方法 initParam 至 AccountWs 类
- 新增账户与仓位就绪状态枚举及状态管理
- 移除冗余的下单状态 STATE 相关逻辑
- 优化操作服务中的通道就绪检查逻辑
- 调整订单完成后的状态更新逻辑,确保数据一致性
- 统一 WebSocket 订阅成功事件处理方式
- 简化仓位数据处理流程并增强可读性
| | |
| | | log.error("WebSocket登录失败, code: {}, msg: {}", code, response.getString("msg")); |
| | | } |
| | | } else if ("subscribe".equals(event)) { |
| | | log.info("订阅成功: {}", response.getJSONObject("arg")); |
| | | subscribeEvent(response); |
| | | } else if ("error".equals(event)) { |
| | | log.error("订阅错误: code={}, msg={}", |
| | | response.getString("code"), response.getString("msg")); |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("处理WebSocket消息失败: {}", message, e); |
| | | } |
| | | } |
| | | |
| | | private void subscribeEvent(JSONObject response) { |
| | | String channel = response.getString("channel"); |
| | | if (OrderInfoWs.ORDERINFOWS_CHANNEL.equals(channel)) { |
| | | OrderInfoWs.initEvent(response); |
| | | } |
| | | if (AccountWs.ACCOUNTWS_CHANNEL.equals(channel)) { |
| | | AccountWs.initEvent(response); |
| | | } |
| | | if (PositionsWs.POSITIONSWS_CHANNEL.equals(channel)) { |
| | | PositionsWs.initEvent(response); |
| | | } |
| | | } |
| | | |
| | |
| | | OrderInfoWs.handleEvent(response, redisUtils); |
| | | }else if (AccountWs.ACCOUNTWS_CHANNEL.equals(channel)) { |
| | | AccountWs.handleEvent(response); |
| | | String side = caoZuoService.caoZuo(); |
| | | TradeOrderWs.orderEvent(webSocketClient, side); |
| | | } else if (PositionsWs.POSITIONSWS_CHANNEL.equals(channel)) { |
| | | PositionsWs.handleEvent(response); |
| | | } else if (BalanceAndPositionWs.CHANNEL_NAME.equals(channel)) { |
| | | BalanceAndPositionWs.handleEvent(response); |
| | | } |
| | | String side = caoZuoService.caoZuo(); |
| | | TradeOrderWs.orderEvent(webSocketClient, side); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public String caoZuo() { |
| | | log.info("开始执行操作CaoZuoServiceImpl......"); |
| | | String accountReadyState = AccountWs.ACCOUNTWSMAP.get(CoinEnums.READY_STATE.name()); |
| | | if (!CoinEnums.READY_STATE_YES.getCode().equals(accountReadyState)) { |
| | | log.info("账户通道未就绪,取消发送"); |
| | | return null; |
| | | } |
| | | BigDecimal positionsReadyState = PositionsWs.POSITIONSWSMAP.get(CoinEnums.READY_STATE.name()); |
| | | if (WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode()).compareTo(positionsReadyState) != 0) { |
| | | log.info("仓位通道未就绪,取消发送"); |
| | | return null; |
| | | } |
| | | // 系统设置的开关,等于冷静中,则代表不开仓 |
| | | String outStr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.OUT.name()); |
| | | if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){ |
| | | log.error("冷静中,不允许下单......"); |
| | | return null; |
| | | } |
| | | BigDecimal cashBal = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("cashBal")); |
| | | BigDecimal availBal = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("availBal")); |
| | | |
| | | // 判断账户余额是否充足 |
| | | if (cashBal.compareTo(BigDecimal.ZERO) <= 0){ |
| | |
| | | if (realKuiSunAmount.compareTo(zhiSunAmount) > 0){ |
| | | log.error("账户冷静止损......"); |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.OUT.name(), OrderParamEnums.OUT_YES.getValue()); |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | return OrderParamEnums.OUT.getValue(); |
| | | } |
| | | // 判断抗压 |
| | |
| | | } |
| | | } |
| | | |
| | | // 系统设置的开关,等于冷静中,则代表不开仓 |
| | | String outStr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.OUT.name()); |
| | | if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){ |
| | | log.error("冷静中,不允许下单......"); |
| | | return null; |
| | | } |
| | | |
| | | // 判断当前是否有正在进行的订单操作 |
| | | String state = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.STATE.name()); |
| | | log.info(OrderParamEnums.getNameByValue(state)); |
| | | if (OrderParamEnums.STATE_4.getValue().equals(state)){ |
| | | log.warn("正在下单中,等待下单结束..."); |
| | | return null; |
| | | } |
| | | if (OrderParamEnums.STATE_3.getValue().equals(state)){ |
| | | log.error("冷静中,不允许下单......"); |
| | | return null; |
| | | } |
| | | if (OrderParamEnums.STATE_2.getValue().equals(state)){ |
| | | log.error("账户紧张扛仓......"); |
| | | return null; |
| | | } |
| | | if (OrderParamEnums.STATE_0.getValue().equals(state)){ |
| | | log.error("参数异常,不允许开仓......"); |
| | | return null; |
| | | } |
| | | |
| | | |
| | | |
| | | if (PositionsWs.POSITIONSWSMAP.get("pos") == null){ |
| | | log.error("没有获取到持仓信息,等待初始化......"); |
| | | return null; |
| | |
| | | BigDecimal pos = PositionsWs.POSITIONSWSMAP.get("pos"); |
| | | if (BigDecimal.ZERO.compareTo( pos) >= 0) { |
| | | log.error("持仓数量为零,进行初始化订单"); |
| | | boolean flag = WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | if ( flag){ |
| | | return OrderParamEnums.INIT.getValue(); |
| | | }else{ |
| | | return null; |
| | | } |
| | | return OrderParamEnums.INIT.getValue(); |
| | | } |
| | | // 判断是否保证金超标 |
| | | if (PositionsWs.POSITIONSWSMAP.get("imr") == null){ |
| | |
| | | // 处理订单价格在队列中的情况 |
| | | String orderPrice = OrderInfoWs.ORDERINFOWSMAP.get("orderPrice"); |
| | | handleOrderPriceInQueues(orderPrice, queueKaiCang, queuePingCang); |
| | | |
| | | boolean orderPriceFlag = WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice", String.valueOf(markPx)); |
| | | // 判断是加仓还是减仓 |
| | | if (avgPx.compareTo(markPx) > 0) { |
| | | log.info("开始加仓..."); |
| | |
| | | DescBigDecimal kaiCang = queueKaiCang.peek(); |
| | | if (kaiCang != null && markPx.compareTo(kaiCang.getValue()) <= 0 && avgPx.compareTo(kaiCang.getValue()) >= 0) { |
| | | log.info("开始加仓...开仓队列价格大于当前价格{}>{}", kaiCang.getValue(), markPx); |
| | | boolean orderPriceFlag = WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice", String.valueOf(markPx)); |
| | | boolean stateFlag = WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | boolean buyCntTimeFlag = buyCntTimeEvent(avgPx, markPx); |
| | | if (orderPriceFlag && stateFlag && buyCntTimeFlag){ |
| | | if (buyCntTimeFlag){ |
| | | log.info("加仓参数准备成功......"); |
| | | return OrderParamEnums.BUY.getValue(); |
| | | }else{ |
| | |
| | | AscBigDecimal pingCang = queuePingCang.peek(); |
| | | if (pingCang != null && markPx.compareTo(pingCang.getValue()) >= 0 && avgPx.compareTo(pingCang.getValue()) < 0) { |
| | | log.info("开始减仓...平仓队列价格小于当前价格{}<={}", pingCang.getValue(), markPx); |
| | | boolean orderPriceFlag = WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice", String.valueOf(markPx)); |
| | | if (orderPriceFlag){ |
| | | // 判断当前是否盈利 |
| | | BigDecimal uplValue = PositionsWs.POSITIONSWSMAP.get("upl"); |
| | | BigDecimal imr = PositionsWs.POSITIONSWSMAP.get("imr"); |
| | | BigDecimal realizedPnlValue = PositionsWs.POSITIONSWSMAP.get("realizedPnl"); |
| | | String pingCangImr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.PING_CANG_SHOUYI.name()); |
| | | BigDecimal imrValue = imr.multiply(new BigDecimal(pingCangImr)); |
| | | // 判断当前是否盈利 |
| | | BigDecimal uplValue = PositionsWs.POSITIONSWSMAP.get("upl"); |
| | | BigDecimal imr = PositionsWs.POSITIONSWSMAP.get("imr"); |
| | | BigDecimal realizedPnlValue = PositionsWs.POSITIONSWSMAP.get("realizedPnl"); |
| | | String pingCangImr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.PING_CANG_SHOUYI.name()); |
| | | BigDecimal imrValue = imr.multiply(new BigDecimal(pingCangImr)); |
| | | |
| | | if (realizedPnlValue.compareTo(BigDecimal.ZERO) <= 0) { |
| | | BigDecimal realizedPnlValueZheng = realizedPnlValue.multiply(new BigDecimal("-1")); |
| | | if (uplValue.compareTo(realizedPnlValue) > 0 && uplValue.compareTo(imrValue.add(realizedPnlValueZheng)) >= 0) { |
| | | log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue); |
| | | boolean stateFlag = WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | if (stateFlag){ |
| | | log.info("减仓参数准备成功......"); |
| | | return OrderParamEnums.SELL.getValue(); |
| | | }else{ |
| | | log.error("减仓参数准备失败......"); |
| | | return null; |
| | | } |
| | | }else{ |
| | | log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue); |
| | | return OrderParamEnums.HOLDING.getValue(); |
| | | } |
| | | }else { |
| | | if (uplValue.compareTo(imrValue) >= 0) { |
| | | log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue); |
| | | boolean stateFlag = WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | if (stateFlag){ |
| | | log.info("减仓参数准备成功......"); |
| | | return OrderParamEnums.SELL.getValue(); |
| | | }else{ |
| | | log.error("减仓参数准备失败......"); |
| | | return null; |
| | | } |
| | | }else{ |
| | | log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue); |
| | | return OrderParamEnums.HOLDING.getValue(); |
| | | } |
| | | if (realizedPnlValue.compareTo(BigDecimal.ZERO) <= 0) { |
| | | BigDecimal realizedPnlValueZheng = realizedPnlValue.multiply(new BigDecimal("-1")); |
| | | if (uplValue.compareTo(realizedPnlValue) > 0 && uplValue.compareTo(imrValue.add(realizedPnlValueZheng)) >= 0) { |
| | | log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue); |
| | | return OrderParamEnums.SELL.getValue(); |
| | | }else{ |
| | | log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue); |
| | | return OrderParamEnums.HOLDING.getValue(); |
| | | } |
| | | }else{ |
| | | log.error("减仓参数准备失败......"); |
| | | return null; |
| | | }else { |
| | | if (uplValue.compareTo(imrValue) >= 0) { |
| | | log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue); |
| | | return OrderParamEnums.SELL.getValue(); |
| | | }else{ |
| | | log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue); |
| | | return OrderParamEnums.HOLDING.getValue(); |
| | | } |
| | | } |
| | | } else { |
| | | log.info("未触发减仓......,等待"); |
| | |
| | | } |
| | | } |
| | | |
| | | public static void initEvent(JSONObject response) { |
| | | log.info("订阅成功: {}", response.getJSONObject("arg")); |
| | | JSONObject arg = response.getJSONObject("arg"); |
| | | initParam(arg); |
| | | } |
| | | |
| | | /** |
| | | * 处理账户频道推送的数据 |
| | | * |
| | |
| | | JSONObject detail = detailsArray.getJSONObject(j); |
| | | // log.info("账户详情: {}", JSONUtil.formatJsonStr(String.valueOf(detail))); |
| | | //需要获取的参数 |
| | | String ccyKey = "ccy"; |
| | | String availBalKey = "availBal"; |
| | | String cashBalKey = "cashBal"; |
| | | String eqKey = "eq"; |
| | | String uplKey = "upl"; |
| | | |
| | | String ccy = WsMapBuild.parseStringSafe( detail.getString(ccyKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, ccyKey, ccy); |
| | | |
| | | String availBal = WsMapBuild.parseStringSafe(detail.getString(availBalKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, availBalKey, availBal); |
| | | |
| | | String cashBal = WsMapBuild.parseStringSafe(detail.getString(cashBalKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, cashBalKey, cashBal); |
| | | |
| | | String eq = WsMapBuild.parseStringSafe(detail.getString(eqKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, eqKey, eq); |
| | | |
| | | String upl = WsMapBuild.parseStringSafe(detail.getString(uplKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, uplKey, upl); |
| | | |
| | | BigDecimal cashBalDecimal = WsMapBuild.parseBigDecimalSafe(cashBal); |
| | | if (cashBalDecimal.compareTo(BigDecimal.ZERO) == 0) { |
| | | log.warn("账户频道无效的账户余额数据,跳过处理"); |
| | | continue; |
| | | } |
| | | |
| | | // 根据可用余额计算下单总保证金 |
| | | String total_order_usdtpecent = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.TOTAL_ORDER_USDTPECENT.name()); |
| | | BigDecimal total_order_usdt_factor = WsMapBuild.parseBigDecimalSafe(total_order_usdtpecent); |
| | | BigDecimal totalOrderUsdt = cashBalDecimal.multiply(total_order_usdt_factor).setScale(2, RoundingMode.DOWN); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, CoinEnums.TOTAL_ORDER_USDT.name(), String.valueOf(totalOrderUsdt)); |
| | | |
| | | log.info( |
| | | "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 全仓未实现盈亏: {}, 下单总保证金: {}", |
| | | ccy, availBal, cashBal, eq, upl, totalOrderUsdt |
| | | ); |
| | | initParam(detail); |
| | | } |
| | | } catch (Exception innerEx) { |
| | | log.warn("处理账户频道数据失败", innerEx); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | public static final String ccyKey = "ccy"; |
| | | public static final String availBalKey = "availBal"; |
| | | public static final String cashBalKey = "cashBal"; |
| | | public static final String eqKey = "eq"; |
| | | public static final String uplKey = "upl"; |
| | | private static void initParam(JSONObject detail) { |
| | | |
| | | String ccy = WsMapBuild.parseStringSafe( detail.getString(ccyKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, ccyKey, ccy); |
| | | |
| | | String availBal = WsMapBuild.parseStringSafe(detail.getString(availBalKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, availBalKey, availBal); |
| | | |
| | | String cashBal = WsMapBuild.parseStringSafe(detail.getString(cashBalKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, cashBalKey, cashBal); |
| | | |
| | | String eq = WsMapBuild.parseStringSafe(detail.getString(eqKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, eqKey, eq); |
| | | |
| | | String upl = WsMapBuild.parseStringSafe(detail.getString(uplKey)); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, uplKey, upl); |
| | | |
| | | BigDecimal cashBalDecimal = WsMapBuild.parseBigDecimalSafe(cashBal); |
| | | // 根据可用余额计算下单总保证金 |
| | | String total_order_usdtpecent = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.TOTAL_ORDER_USDTPECENT.name()); |
| | | BigDecimal total_order_usdt_factor = WsMapBuild.parseBigDecimalSafe(total_order_usdtpecent); |
| | | BigDecimal totalOrderUsdt = cashBalDecimal.multiply(total_order_usdt_factor).setScale(2, RoundingMode.DOWN); |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, CoinEnums.TOTAL_ORDER_USDT.name(), String.valueOf(totalOrderUsdt)); |
| | | |
| | | WsMapBuild.saveStringToMap(ACCOUNTWSMAP, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_YES.getCode()); |
| | | |
| | | log.info( |
| | | "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 全仓未实现盈亏: {}, 下单总保证金: {}", |
| | | ccy, availBal, cashBal, eq, upl, totalOrderUsdt |
| | | ); |
| | | } |
| | | } |
| | | |
| | |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.CTVAL.name(), CoinEnums.CTVAL.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.TICKSZ.name(), CoinEnums.TICKSZ.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.MINSZ.name(), CoinEnums.MINSZ.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_1.getValue()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.OUT.name(), OrderParamEnums.OUT_NO.getValue()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.LEVERAGE.name(), CoinEnums.LEVERAGE.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.BUY_CNT.name(), CoinEnums.BUY_CNT.getCode()); |
| | |
| | | } |
| | | } |
| | | |
| | | public static void initEvent(JSONObject response) { |
| | | log.info("订阅成功: {}", response.getJSONObject("arg")); |
| | | } |
| | | |
| | | |
| | | private static final String DATA_KEY = "data"; |
| | | private static final String INSTID_KEY = "instId"; |
| | |
| | | && state.equals(stateStr) |
| | | ){ |
| | | //记录成交均价 |
| | | if (StrUtil.isBlank(ORDERINFOWSMAP.get("orderPrice"))){ |
| | | if (ORDERINFOWSMAP.get("orderPrice") == null){ |
| | | WsMapBuild.saveStringToMap(ORDERINFOWSMAP, "orderPrice",avgPx); |
| | | } |
| | | WsMapBuild.saveStringToMap(TradeOrderWs.TRADEORDERWSMAP, "state", CoinEnums.ORDER_LIVE.getCode()); |
| | | if (OrderParamEnums.SELL.getValue().equals(side)){ |
| | | WsMapBuild.saveBigDecimalToMap(PositionsWs.POSITIONSWSMAP, "pos", BigDecimal.ZERO); |
| | | } |
| | | |
| | | if (OrderParamEnums.BUY.getValue().equals(side)){ |
| | | WsMapBuild.saveBigDecimalToMap(PositionsWs.POSITIONSWSMAP, "pos", new BigDecimal(accFillSz)); |
| | | } |
| | | |
| | | String outStr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.OUT.name()); |
| | | if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){ |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_3.getValue()); |
| | | }else{ |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_1.getValue()); |
| | | } |
| | | WsMapBuild.saveBigDecimalToMap(PositionsWs.POSITIONSWSMAP, CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode())); |
| | | WsMapBuild.saveStringToMap(AccountWs.ACCOUNTWSMAP, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode()); |
| | | |
| | | log.info("订单详情已完成: {}, 自定义编号: {}", CoinEnums.HE_YUE.getCode(), clOrdId); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | public static void initEvent(JSONObject response) { |
| | | log.info("订阅成功,数据初始化: {}", response.getJSONObject("arg")); |
| | | JSONObject arg = response.getJSONObject("arg"); |
| | | initParam(arg); |
| | | } |
| | | |
| | | public static void handleEvent(JSONObject response) { |
| | | |
| | | |
| | |
| | | if (dataArray == null || dataArray.isEmpty()) { |
| | | log.info("账户持仓频道数据为空,已当前价买入,并且初始化网格"); |
| | | JSONObject posData = new JSONObject(); |
| | | processPositionData(posData); |
| | | initParam(posData); |
| | | return; |
| | | } |
| | | |
| | |
| | | markPx |
| | | ); |
| | | |
| | | processPositionData(posData); |
| | | initParam(posData); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | } |
| | | |
| | | private static void processPositionData(JSONObject posData) { |
| | | private static void initParam(JSONObject posData) { |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, "avgPx", WsMapBuild.parseBigDecimalSafe(posData.getString("avgPx"))); |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, "pos", WsMapBuild.parseBigDecimalSafe(posData.getString("pos"))); |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, "upl", WsMapBuild.parseBigDecimalSafe(posData.getString("upl"))); |
| | |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, "bePx", WsMapBuild.parseBigDecimalSafe(posData.getString("bePx"))); |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, "realizedPnl", WsMapBuild.parseBigDecimalSafe(posData.getString("realizedPnl"))); |
| | | |
| | | WsMapBuild.saveBigDecimalToMap(POSITIONSWSMAP, CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode())); |
| | | } |
| | | } |
| | |
| | | public static void orderEvent(WebSocketClient webSocketClient, String side) { |
| | | |
| | | log.info("开始执行TradeOrderWs......"); |
| | | String accountReadyState = AccountWs.ACCOUNTWSMAP.get(CoinEnums.READY_STATE.name()); |
| | | if (!CoinEnums.READY_STATE_YES.getCode().equals(accountReadyState)) { |
| | | log.info("账户通道未就绪,取消发送"); |
| | | return; |
| | | } |
| | | BigDecimal positionsReadyState = PositionsWs.POSITIONSWSMAP.get(CoinEnums.READY_STATE.name()); |
| | | if (WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode()).compareTo(positionsReadyState) != 0) { |
| | | log.info("仓位通道未就绪,取消发送"); |
| | | return; |
| | | } |
| | | // 校验必要参数 |
| | | if (StrUtil.isBlank(side)) { |
| | | log.warn("下单参数 side 为空,取消发送"); |
| | |
| | | WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "clOrdId", clOrdId); |
| | | WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "state", CoinEnums.ORDER_FILLED.getCode()); |
| | | |
| | | |
| | | |
| | | WsMapBuild.saveBigDecimalToMap(PositionsWs.POSITIONSWSMAP, CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode())); |
| | | WsMapBuild.saveStringToMap(AccountWs.ACCOUNTWSMAP, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode()); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("下单构建失败", e); |
| | |
| | | USDT("USDT","USDT"), |
| | | |
| | | |
| | | READY_STATE("是否准备就绪ready_state", "1"), |
| | | READY_STATE_YES("准备就绪ready_state", "1"), |
| | | READY_STATE_NO("未准备就绪ready_state", "0"), |
| | | |
| | | PING_CANG_SHOUYI("平仓收益比例", "0.5"), |
| | | //下单的总保障金为账户总金额cashBal * TOTAL_ORDER_USDT用来做保证金 |
| | | TOTAL_ORDER_USDTPECENT("总保证金比例total_order_usdtpecent","0.2"), |
| | |
| | | BUY_CNT("每次开仓的张数buyCnt","0.2"), |
| | | BUY_CNT_TIME("每次开仓张数的倍数基础值buyCntTime","10"), |
| | | OUT("是否允许下单out","操作中"), |
| | | STATE("初始下单状态不允许下单state","0"), |
| | | CTVAL("合约面值ctVal","0.1"), |
| | | TICKSZ("下单价格精度tickSz","2"), |
| | | MINSZ("最小下单数小数位minSz","2"), |
| | |
| | | INIT("初始化", "init"), |
| | | HOLDING("持仓", "holding"), |
| | | BUY("买", "buy"), |
| | | SELL("卖", "sell"), |
| | | |
| | | |
| | | STATE_4("操作下单中", "4"), |
| | | STATE_3("止损......冷静一下", "3"), |
| | | STATE_2("抗压......", "2"), |
| | | STATE_1("允许开仓", "1"), |
| | | STATE_0("不允许开仓", "0"), |
| | | |
| | | SELL("卖", "sell") |
| | | ; |
| | | |
| | | private String name; |