feat(okxNewPrice): 实现动态开仓张数计算逻辑
- 新增 BUY_CNT_TIME 枚举值用于配置开仓张数倍数基础值
- 在初始化和加仓时调用 buyCntTimeEvent 方法计算动态开仓张数
- 修改 TradeOrderWs 中的开仓张数计算方式,支持基于 buyCntTime 的动态调整
- 引入 RoundingMode 类以支持数值舍入模式
- 更新 InstrumentsWs 初始化逻辑,加入 BUY_CNT_TIME 参数配置
| | |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.concurrent.PriorityBlockingQueue; |
| | | |
| | | /** |
| | |
| | | if (BigDecimal.ZERO.compareTo( pos) >= 0) { |
| | | log.error("持仓数量为零,进行初始化订单"); |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | buyCntTimeEvent(new BigDecimal(CoinEnums.BUY_CNT.name()),new BigDecimal(CoinEnums.BUY_CNT.name())); |
| | | return OrderParamEnums.INIT.getValue(); |
| | | } |
| | | // 判断是否保证金超标 |
| | |
| | | log.info("开始加仓...开仓队列价格大于当前价格{}>{}", kaiCang.getValue(), markPx); |
| | | WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice",String.valueOf(markPx)); |
| | | WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue()); |
| | | buyCntTimeEvent(avgPx,markPx); |
| | | return OrderParamEnums.BUY.getValue(); |
| | | } else { |
| | | log.info("未触发加仓......,等待"); |
| | |
| | | } |
| | | } |
| | | |
| | | private void buyCntTimeEvent(BigDecimal avgPx, BigDecimal markPx){ |
| | | //判断当前价格和开仓价格直接间隔除以间距,取整,获取的数量是否大于等于0,如果大于0,则下单基础张数*倍数 |
| | | String buyCntTime = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.BUY_CNT_TIME.name()); |
| | | BigDecimal subtract = avgPx.subtract(markPx); |
| | | BigDecimal divide = subtract.divide(new BigDecimal(buyCntTime), 0, RoundingMode.DOWN).add(BigDecimal.ONE); |
| | | WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "buyCntTime",String.valueOf(divide)); |
| | | } |
| | | |
| | | /** |
| | | * 根据订单价格更新开仓和平仓队列的内容。 |
| | | * 若该价格不在对应队列中则加入;若已存在,则从队列中移除。 |
| | |
| | | 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()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.BUY_CNT_TIME.name(), CoinEnums.BUY_CNT_TIME.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.ZHI_SUN.name(), CoinEnums.ZHI_SUN.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.KANG_CANG.name(), CoinEnums.KANG_CANG.getCode()); |
| | | WsMapBuild.saveStringToMap(INSTRUMENTSWSMAP, CoinEnums.PING_CANG_SHOUYI.name(), CoinEnums.PING_CANG_SHOUYI.getCode()); |
| | |
| | | }else if (OrderParamEnums.INIT.getValue().equals(side)){ |
| | | log.info("当前状态为初始化"); |
| | | side = OrderParamEnums.BUY.getValue(); |
| | | buyCnt = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.BUY_CNT.name()); |
| | | String buyCntTime = OrderInfoWs.ORDERINFOWSMAP.get("buyCntTime"); |
| | | String buyCntStr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.BUY_CNT.name()); |
| | | buyCnt = String.valueOf(new BigDecimal(buyCntTime).multiply(new BigDecimal(buyCntStr))); |
| | | }else if (OrderParamEnums.BUY.getValue().equals(side)){ |
| | | log.info("当前状态为加仓"); |
| | | buyCnt = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.BUY_CNT.name()); |
| | | String buyCntTime = OrderInfoWs.ORDERINFOWSMAP.get("buyCntTime"); |
| | | String buyCntStr = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.BUY_CNT.name()); |
| | | buyCnt = String.valueOf(new BigDecimal(buyCntTime).multiply(new BigDecimal(buyCntStr))); |
| | | }else if (OrderParamEnums.SELL.getValue().equals(side)){ |
| | | log.info("当前状态为减仓"); |
| | | buyCnt = String.valueOf(PositionsWs.POSITIONSWSMAP.get("pos")); |
| | |
| | | |
| | | PING_CANG_SHOUYI("平仓收益比例", "0.2"), |
| | | //下单的总保障金为账户总金额cashBal * TOTAL_ORDER_USDT用来做保证金 |
| | | TOTAL_ORDER_USDTPECENT("总保证金比例total_order_usdtpecent","0.1"), |
| | | TOTAL_ORDER_USDTPECENT("总保证金比例total_order_usdtpecent","0.2"), |
| | | TOTAL_ORDER_USDT("总保证金totalOrderUsdt","0"), |
| | | KANG_CANG("抗压比例KANG_CANG","0.5"), |
| | | ZHI_SUN("止损比例ZHI_SUN","0.2"), |
| | | //每次下单的张数 |
| | | BUY_CNT("每次开仓的张数buyCnt","0.2"), |
| | | BUY_CNT_TIME("每次开仓张数的倍数基础值buyCntTime","10"), |
| | | OUT("是否允许下单out","操作中"), |
| | | STATE("初始下单状态不允许下单state","0"), |
| | | CTVAL("合约面值ctVal","0.1"), |