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));
|
log.info("获取的网格参数: {}", gridByPrice);
|
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;
|
}
|
|
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);
|
}
|
}
|
}
|