feat(okxNewPrice): 新增止损冷静机制并优化订单状态控制
- 在 CaoZuoServiceImpl 中新增对止损状态的检查,防止重复下单
- 增加 instrumentsOutKey 标识交易是否处于冷静期
- 当持仓盈亏超过保证金时,设置 out 状态为“冷静中”
- 初始化时将 out 状态设为“操作中”
- 修复 OrderInfoWs 中状态更新逻辑,确保状态正确重置
- 新增 OrderParamEnums 枚举值用于标识冷静状态
- TradeOrderWs 中增加对空方向参数的校验保护
| | |
| | | // 构造Redis键名 |
| | | final String coinCode = CoinEnums.HE_YUE.getCode(); |
| | | final String instrumentsStateKey = InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + coinCode + ":state"; |
| | | final String instrumentsOutKey = InstrumentsWs.INSTRUMENTSWS_CHANNEL+":" + coinCode+":out"; |
| | | final String positionsMarkPxKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":markPx"; |
| | | final String positionsAvgPxKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":avgPx"; |
| | | final String positionsOrderPriceKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":orderPrice"; |
| | |
| | | @Override |
| | | public String caoZuo() { |
| | | log.info("开始执行操作CaoZuoServiceImpl......"); |
| | | String outStr = (String) redisUtils.get(instrumentsOutKey); |
| | | if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){ |
| | | log.error("止损过了......冷静一下,等待下次入场......"); |
| | | return null; |
| | | } |
| | | |
| | | // 获取合约执行操作状态 |
| | | String state = (String) redisUtils.get(instrumentsStateKey); |
| | |
| | | return OrderParamEnums.ORDERING.getValue(); |
| | | } |
| | | if (OrderParamEnums.STATE_3.getValue().equals(state)){ |
| | | log.error("持仓盈亏超过下单总保证金,止损冷静一天......"); |
| | | log.error("持仓盈亏超过下单总保证金,冷静止损......"); |
| | | redisUtils.set(instrumentsOutKey, OrderParamEnums.OUT_YES.getValue(), 0); |
| | | return OrderParamEnums.OUT.getValue(); |
| | | } |
| | | if (OrderParamEnums.STATE_2.getValue().equals(state)){ |
| | |
| | | && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":minSz", "2", 0) |
| | | && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":instIdCode", CoinEnums.HE_YUE.getCode(), 0) |
| | | && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":state", OrderParamEnums.STATE_0.getValue(), 0) |
| | | && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":out", OrderParamEnums.OUT_NO.getValue(), 0) |
| | | ; |
| | | if (!setResult) { |
| | | log.warn("Redis set operation failed for key: account:{}", CoinEnums.HE_YUE.getCode()); |
| | |
| | | && StrUtil.isNotBlank(stateStr) |
| | | && state.equals(stateStr) |
| | | ){ |
| | | redisUtils.set(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state", OrderParamEnums.STATE_1.getValue(), 0); |
| | | redisUtils.set(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state", OrderParamEnums.STATE_0.getValue(), 0); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | public static void orderEvent(WebSocketClient webSocketClient, RedisUtils redisUtils, String side) { |
| | | |
| | | log.info("开始执行TradeOrderWs......"); |
| | | if (StrUtil.isBlank( side)){ |
| | | log.warn("止损了,下次再战..."); |
| | | return; |
| | | } |
| | | |
| | | String buyCnt = null; |
| | | String ctval = getRedisValue(redisUtils, InstrumentsWs.INSTRUMENTSWS_CHANNEL, ":ctVal"); |
| | |
| | | |
| | | @Getter |
| | | public enum OrderParamEnums { |
| | | OUT_NO("操作中", "操作中"), |
| | | OUT_YES("冷静中", "冷静中"), |
| | | |
| | | ORDERING("操作下单中", "ORDERING"), |
| | | OUT("止损", "out"), |
| | | INIT("初始化", "init"), |