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 initWangGe(String markPx) { log.info("网格初始化中"); PriorityBlockingQueue 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 initKaiCang(BigDecimal jiaGe, PriorityBlockingQueue queueAsc) { PriorityBlockingQueue 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 initPingCang(BigDecimal jiaGe, PriorityBlockingQueue queueAsc) { PriorityBlockingQueue 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 queueAsc = wangGeService.initWangGe(openPx); if (queueAsc != null) { wangGeService.initKaiCang(new BigDecimal(orderPx), queueAsc); wangGeService.initPingCang(new BigDecimal(orderPx), queueAsc); } } }