From 269e8765fabd893d47a1ce276304256650c8e99e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 16 Dec 2025 18:08:03 +0800
Subject: [PATCH] fix(okxWs): 调整账户持仓为空时的处理逻辑

---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java |  175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 175 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java
new file mode 100644
index 0000000..d53c41d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java
@@ -0,0 +1,175 @@
+package com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList;
+
+import com.xcong.excoin.rabbit.pricequeue.AscBigDecimal;
+import com.xcong.excoin.rabbit.pricequeue.DescBigDecimal;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.concurrent.PriorityBlockingQueue;
+
+/**
+ * 网格交易服务实现类,用于初始化价格网格、开仓和平仓操作。
+ *
+ * @author Administrator
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WangGeListServiceImpl implements WangGeListService {
+
+    /**
+     * 初始化价格网格队列。根据配置的价格上限、下限和间隔生成一系列价格点,
+     * 并将这些价格点存入升序优先阻塞队列中。
+     *
+     * @return 返回初始化完成的升序价格队列;若初始化失败则返回null
+     */
+    @Override
+    public PriorityBlockingQueue<AscBigDecimal> initWangGe(String markPx) {
+        log.info("网格初始化中");
+        PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeListQueue.getQueueAsc();
+        queueAsc.clear();
+
+        //获取WangGeListEnum全部网格参数
+        WangGeListEnum gridByPrice = WangGeListEnum.getGridByPrice(new BigDecimal(markPx));
+        if (gridByPrice == null){
+            log.error("没有获取到网格参数......");
+            return null;
+        }
+
+        String shangxianValue = gridByPrice.getJiage_shangxian();
+        String xiaxianValue = gridByPrice.getJiage_xiaxian();
+        String jianjuValue = gridByPrice.getJian_ju();
+        String weishuValueStr = gridByPrice.getXiaoshu_weishu();
+
+        try {
+            BigDecimal shangxian = new BigDecimal(shangxianValue);
+            BigDecimal xiaxian = new BigDecimal(xiaxianValue);
+            BigDecimal jianju = new BigDecimal(jianjuValue);
+
+            if (jianju.compareTo(BigDecimal.ZERO) == 0) {
+                log.error("价格间隔不能为0");
+                return null;
+            }
+
+            int weishu = Integer.parseInt(weishuValueStr);
+            BigDecimal diff = shangxian.subtract(xiaxian);
+            int count = diff.divide(jianju, 0, RoundingMode.DOWN).intValue();
+
+            BigDecimal currentStep = BigDecimal.ZERO;
+            for (int i = 0; i <= count; i++) {
+                BigDecimal stepMultiplier = currentStep.multiply(jianju);
+                BigDecimal wangGeJiaGe = xiaxian.add(stepMultiplier).setScale(weishu, RoundingMode.DOWN);
+                AscBigDecimal ascBigDecimal = new AscBigDecimal(wangGeJiaGe.toString());
+                queueAsc.add(ascBigDecimal);
+                currentStep = currentStep.add(BigDecimal.ONE);
+            }
+
+            if (queueAsc.isEmpty()) {
+                log.info("网格初始化失败");
+                return null;
+            }
+
+            log.info("网格初始化成功");
+            return queueAsc;
+        } catch (NumberFormatException e) {
+            log.error("解析价格参数失败", e);
+            return null;
+        } catch (Exception e) {
+            log.error("初始化网格发生未知异常", e);
+            return null;
+        }
+    }
+
+    /**
+     * 根据当前价格初始化开仓队列。遍历已有的升序价格队列,
+     * 将小于当前价格的所有价格点加入降序的开仓队列中。
+     *
+     * @param jiaGe   当前价格
+     * @param queueAsc 已初始化的价格升序队列
+     */
+    @Override
+    public PriorityBlockingQueue<DescBigDecimal> initKaiCang(BigDecimal jiaGe, PriorityBlockingQueue<AscBigDecimal> queueAsc) {
+        PriorityBlockingQueue<DescBigDecimal> queueKaiCang = WangGeListQueue.getKaiCang();
+        queueKaiCang.clear();
+
+        AscBigDecimal now = new AscBigDecimal(jiaGe.toString());
+
+        for (AscBigDecimal ascBigDecimal : queueAsc) {
+            if (ascBigDecimal.compareTo(now) < 0) {
+                DescBigDecimal kaiCangJia = new DescBigDecimal(ascBigDecimal.getValue().toString());
+                queueKaiCang.add(kaiCangJia);
+            }
+        }
+        StringBuilder kaiCangStr = new StringBuilder();
+        kaiCangStr.append("下限队列: [");
+        boolean first = true;
+        for (DescBigDecimal item : queueKaiCang) {
+            if (!first) {
+                kaiCangStr.append(", ");
+            }
+            kaiCangStr.append(item.getValue());
+            first = false;
+        }
+        kaiCangStr.append("]");
+        log.info(kaiCangStr.toString());
+
+        return queueKaiCang;
+    }
+
+    /**
+     * 根据当前价格初始化平仓队列。遍历已有的升序价格队列,
+     * 将大于当前价格的所有价格点加入升序的平仓队列中。
+     *
+     * @param jiaGe   当前价格
+     * @param queueAsc 已初始化的价格升序队列
+     */
+    @Override
+    public PriorityBlockingQueue<AscBigDecimal> initPingCang(BigDecimal jiaGe, PriorityBlockingQueue<AscBigDecimal> queueAsc) {
+        PriorityBlockingQueue<AscBigDecimal> queuePingCang = WangGeListQueue.getPingCang();
+        queuePingCang.clear();
+
+        AscBigDecimal now = new AscBigDecimal(jiaGe.toString());
+
+        for (AscBigDecimal ascBigDecimal : queueAsc) {
+            if (ascBigDecimal.compareTo(now) > 0) {
+                queuePingCang.add(ascBigDecimal);
+            }
+        }
+
+        StringBuilder pingCangStr = new StringBuilder();
+        pingCangStr.append("上限队列: [");
+        boolean first = true;
+        for (AscBigDecimal item : queuePingCang) {
+            if (!first) {
+                pingCangStr.append(", ");
+            }
+            pingCangStr.append(item.getValue());
+            first = false;
+        }
+        pingCangStr.append("]");
+        log.info(pingCangStr.toString());
+
+        return queuePingCang;
+    }
+
+    /**
+     * 主方法,用于测试网格初始化及开仓/平仓逻辑。
+     * 示例使用固定价格"0.355"进行模拟调用。
+     *
+     * @param args 启动参数(未使用)
+     */
+    public static void main(String[] args) {
+        WangGeListServiceImpl wangGeService = new WangGeListServiceImpl();
+        String openPx = "2875";
+        String markPx = "2905";
+        String orderPx = "2895";
+        PriorityBlockingQueue<AscBigDecimal> queueAsc = wangGeService.initWangGe(openPx);
+        if (queueAsc != null) {
+            wangGeService.initKaiCang(new BigDecimal(orderPx), queueAsc);
+            wangGeService.initPingCang(new BigDecimal(orderPx), queueAsc);
+        }
+    }
+}

--
Gitblit v1.9.1