package com.xcong.excoin.modules.okxNewPrice.wangge;
|
|
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 WangGeServiceImpl implements WangGeService {
|
|
/**
|
* 初始化价格网格队列。根据配置的价格上限、下限和间隔生成一系列价格点,
|
* 并将这些价格点存入升序优先阻塞队列中。
|
*
|
* @return 返回初始化完成的升序价格队列;若初始化失败则返回null
|
*/
|
@Override
|
public PriorityBlockingQueue<AscBigDecimal> initWangGe() {
|
log.info("网格初始化中");
|
PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeQueue.getQueueAsc();
|
queueAsc.clear();
|
|
String shangxianValue = WangGeEnum.JIAGE_SHANGXIAN.getValue();
|
String xiaxianValue = WangGeEnum.JIAGE_XIAXIAN.getValue();
|
String jianjuValue = WangGeEnum.JIAN_JU.getValue();
|
String weishuValueStr = WangGeEnum.XIAOSHU_WEISHU.getValue();
|
|
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 = WangGeQueue.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);
|
}
|
}
|
|
return queueKaiCang;
|
}
|
|
/**
|
* 根据当前价格初始化平仓队列。遍历已有的升序价格队列,
|
* 将大于当前价格的所有价格点加入升序的平仓队列中。
|
*
|
* @param jiaGe 当前价格
|
* @param queueAsc 已初始化的价格升序队列
|
*/
|
@Override
|
public PriorityBlockingQueue<AscBigDecimal> initPingCang(BigDecimal jiaGe, PriorityBlockingQueue<AscBigDecimal> queueAsc) {
|
PriorityBlockingQueue<AscBigDecimal> queuePingCang = WangGeQueue.getPingCang();
|
queuePingCang.clear();
|
|
AscBigDecimal now = new AscBigDecimal(jiaGe.toString());
|
|
for (AscBigDecimal ascBigDecimal : queueAsc) {
|
if (ascBigDecimal.compareTo(now) > 0) {
|
queuePingCang.add(ascBigDecimal);
|
}
|
}
|
|
return queuePingCang;
|
}
|
|
/**
|
* 主方法,用于测试网格初始化及开仓/平仓逻辑。
|
* 示例使用固定价格"0.355"进行模拟调用。
|
*
|
* @param args 启动参数(未使用)
|
*/
|
public static void main(String[] args) {
|
for (int i = 0; i < 10; i++) {
|
WangGeServiceImpl wangGeService = new WangGeServiceImpl();
|
PriorityBlockingQueue<AscBigDecimal> queueAsc = wangGeService.initWangGe();
|
if (queueAsc != null) {
|
wangGeService.initKaiCang(new BigDecimal("91000"), queueAsc);
|
wangGeService.initPingCang(new BigDecimal("91000"), queueAsc);
|
}
|
}
|
}
|
}
|