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