From 2e05d1bab1817d265d7eaef667811fe3a5dbcb67 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 16 Dec 2025 15:49:26 +0800
Subject: [PATCH] feat(okxNewPrice): 实现基于网格列表的交易策略
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/CoinEnums.java | 2
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListEnum.java | 69 ++++++
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java | 1
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListQueue.java | 79 +++++++
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java | 187 ++++++----------
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java | 1
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/PositionsWs.java | 18 +
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java | 1
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java | 11
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java | 178 ++++++++++++++++
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java | 25 +-
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListService.java | 41 +++
12 files changed, 478 insertions(+), 135 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java
index b99d26c..cdb9117 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxQuantWebSocketClient.java
@@ -174,7 +174,6 @@
try {
InstrumentsWs.handleEvent(account.name());
- wangGeService.initWangGe();
SSLConfig.configureSSL();
System.setProperty("https.protocols", "TLSv1.2,TLSv1.3");
String WS_URL = WS_URL_MONIPAN;
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
index 95139cc..125a125 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
@@ -5,6 +5,9 @@
import com.xcong.excoin.modules.okxNewPrice.okxWs.*;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.OrderParamEnums;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListEnum;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListQueue;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListService;
import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeQueue;
import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeService;
@@ -17,6 +20,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.util.Map;
import java.util.concurrent.PriorityBlockingQueue;
/**
@@ -31,6 +35,8 @@
public class CaoZuoServiceImpl implements CaoZuoService {
private final WangGeService wangGeService;
+ private final WangGeListService wangGeListService;
+ private final RedisUtils redisUtils;
/**
* 执行主要的操作逻辑,包括读取合约状态、获取市场价格信息,
@@ -40,29 +46,35 @@
*/
@Override
public String caoZuo(String accountName) {
- String posSide = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.POSSIDE.name());
- if (CoinEnums.POSSIDE_LONG.getCode().equals(posSide)){
- return caoZuoLong(accountName);
- }else if (CoinEnums.POSSIDE_SHORT.getCode().equals(posSide)){
- return caoZuoShort(accountName);
- }else{
- log.error("账户未设置持仓方向......");
- return null;
- }
- }
-
- @Override
- public String caoZuoLong(String accountName) {
- log.info("开始看涨执行操作CaoZuoServiceImpl......");
String accountReadyState = AccountWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name());
if (!CoinEnums.READY_STATE_YES.getCode().equals(accountReadyState)) {
log.info("账户通道未就绪,取消发送");
return null;
}
- BigDecimal positionsReadyState = PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name()) == null
- ? BigDecimal.ZERO : PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name());
+ String markPx = ObjectUtil.isEmpty(redisUtils.getString(CoinEnums.HE_YUE.getCode())) ? "0" : redisUtils.getString(CoinEnums.HE_YUE.getCode());
+ WangGeListEnum gridByPrice = WangGeListEnum.getGridByPrice(new BigDecimal(markPx));
+ if (gridByPrice == null){
+ log.error("没有获取到网格参数......");
+ return null;
+ }
+ Map<String, String> accountMap = InstrumentsWs.getAccountMap(accountName);
+ String wanggeName = accountMap.get(CoinEnums.WANG_GE_OLD.name());
+ /**
+ * 如果下单的网格不属于同一个网格,则先止损掉老的网格的仓位
+ */
+ if (StrUtil.isNotEmpty(wanggeName) && !wanggeName.equals(gridByPrice.name())){
+ log.error("正在止损老的网格仓位......");
+ WangGeListEnum oldWangge = WangGeListEnum.getByName(wanggeName);
+ WsMapBuild.saveStringToMap(accountMap, CoinEnums.POSSIDE.name(), oldWangge.getFang_xiang());
+ return OrderParamEnums.OUT.getValue();
+ }
+ String posSide = gridByPrice.getFang_xiang();
+ WsMapBuild.saveStringToMap(accountMap, CoinEnums.POSSIDE.name(), posSide);
+ String positionAccountName = PositionsWs.initAccountName(accountName, posSide);
+ BigDecimal positionsReadyState = PositionsWs.getAccountMap(positionAccountName).get(CoinEnums.READY_STATE.name()) == null
+ ? BigDecimal.ZERO : PositionsWs.getAccountMap(positionAccountName).get(CoinEnums.READY_STATE.name());
if (WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode()).compareTo(positionsReadyState) != 0) {
- log.info("仓位通道未就绪,取消发送");
+ log.info("仓位{}通道未就绪,取消发送",positionAccountName);
return null;
}
// 系统设置的开关,等于冷静中,则代表不开仓
@@ -106,37 +118,57 @@
}
}
- if (PositionsWs.getAccountMap(accountName).get("pos") == null){
+ if (PositionsWs.getAccountMap(positionAccountName).get("pos") == null){
log.error("没有获取到持仓信息,等待初始化......");
return null;
}
- BigDecimal pos = PositionsWs.getAccountMap(accountName).get("pos");
+ BigDecimal pos = PositionsWs.getAccountMap(positionAccountName).get("pos");
if (BigDecimal.ZERO.compareTo( pos) >= 0) {
log.error("持仓数量为零,进行初始化订单");
return OrderParamEnums.INIT.getValue();
}
// 判断是否保证金超标
- if (PositionsWs.getAccountMap(accountName).get("imr") == null){
+ if (PositionsWs.getAccountMap(positionAccountName).get("imr") == null){
log.error("没有获取到持仓信息,等待初始化......");
return null;
}
- BigDecimal ordFrozImr = PositionsWs.getAccountMap(accountName).get("imr");
+ BigDecimal ordFrozImr = PositionsWs.getAccountMap(positionAccountName).get("imr");
BigDecimal totalOrderUsdt = WsMapBuild.parseBigDecimalSafe(AccountWs.getAccountMap(accountName).get(CoinEnums.TOTAL_ORDER_USDT.name()));
if (ordFrozImr.compareTo(totalOrderUsdt) >= 0){
log.error("已满仓......");
return OrderParamEnums.HOLDING.getValue();
}
+ PriorityBlockingQueue<AscBigDecimal> ascBigDecimals = wangGeListService.initWangGe(markPx);
+ if (ascBigDecimals == null){
+ log.error("没有获取到网格队列......");
+ return null;
+ }
+ if (CoinEnums.POSSIDE_LONG.getCode().equals(posSide)){
+ return caoZuoLong(accountName);
+ }else if (CoinEnums.POSSIDE_SHORT.getCode().equals(posSide)){
+ return caoZuoShort(accountName);
+ }else{
+ log.error("账户未设置持仓方向......");
+ return null;
+ }
+ }
+
+ @Override
+ public String caoZuoLong(String accountName) {
+ log.info("开始看涨执行操作CaoZuoServiceImpl......");
try {
+
+ String positionAccountName = PositionsWs.initAccountName(accountName, CoinEnums.POSSIDE_LONG.getCode());
// 获取标记价格和平均持仓价格
- BigDecimal markPx = PositionsWs.getAccountMap(accountName).get("markPx");
- BigDecimal avgPx = PositionsWs.getAccountMap(accountName).get("avgPx");
+ BigDecimal markPx = PositionsWs.getAccountMap(positionAccountName).get("markPx");
+ BigDecimal avgPx = PositionsWs.getAccountMap(positionAccountName).get("avgPx");
log.info("开仓价格: {}, 当前价格:{},匹配队列中......", avgPx, markPx);
// 初始化网格队列
- PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeQueue.getQueueAsc();
- PriorityBlockingQueue<DescBigDecimal> queueKaiCang = wangGeService.initKaiCang(avgPx, queueAsc);
- PriorityBlockingQueue<AscBigDecimal> queuePingCang = wangGeService.initPingCang(avgPx, queueAsc);
+ PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeListQueue.getQueueAsc();
+ PriorityBlockingQueue<DescBigDecimal> queueKaiCang = wangGeListService.initKaiCang(avgPx, queueAsc);
+ PriorityBlockingQueue<AscBigDecimal> queuePingCang = wangGeListService.initPingCang(avgPx, queueAsc);
// 处理订单价格在队列中的情况
String orderPrice = OrderInfoWs.getAccountMap(accountName).get("orderPrice");
@@ -176,15 +208,15 @@
if (pingCang != null && avgPx.compareTo(pingCang.getValue()) < 0) {
log.info("开始减仓...平仓队列价格大于当前价格{}<={}", pingCang.getValue(), avgPx);
// 手续费
- BigDecimal feeValue = PositionsWs.getAccountMap(accountName).get("fee").multiply(new BigDecimal("2"));
+ BigDecimal feeValue = PositionsWs.getAccountMap(positionAccountName).get("fee").multiply(new BigDecimal("2"));
//未实现收益
- BigDecimal uplValue = PositionsWs.getAccountMap(accountName).get("upl");
+ BigDecimal uplValue = PositionsWs.getAccountMap(positionAccountName).get("upl");
//已实现收益
- BigDecimal realizedPnlValue = PositionsWs.getAccountMap(accountName).get("realizedPnl");
+ BigDecimal realizedPnlValue = PositionsWs.getAccountMap(positionAccountName).get("realizedPnl");
realizedPnlValue = realizedPnlValue.add(feeValue);
//持仓保证金
- BigDecimal imr = PositionsWs.getAccountMap(accountName).get("imr");
+ BigDecimal imr = PositionsWs.getAccountMap(positionAccountName).get("imr");
String pingCangImr = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.PING_CANG_SHOUYI.name());
BigDecimal imrValue = imr.multiply(new BigDecimal(pingCangImr));
@@ -223,91 +255,20 @@
@Override
public String caoZuoShort(String accountName) {
-
log.info("开始看空执行操作CaoZuoServiceImpl......");
- String accountReadyState = AccountWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name());
- if (!CoinEnums.READY_STATE_YES.getCode().equals(accountReadyState)) {
- log.info("账户通道未就绪,取消发送");
- return null;
- }
- BigDecimal positionsReadyState = PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name()) == null
- ? BigDecimal.ZERO : PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name());
- if (WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode()).compareTo(positionsReadyState) != 0) {
- log.info("仓位通道未就绪,取消发送");
- return null;
- }
- // 系统设置的开关,等于冷静中,则代表不开仓
- String outStr = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.OUT.name());
- if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){
- log.error("冷静中,不允许下单......");
- return null;
- }
- BigDecimal cashBal = WsMapBuild.parseBigDecimalSafe(AccountWs.getAccountMap(accountName).get("cashBal"));
-
- // 判断账户余额是否充足
- if (cashBal.compareTo(BigDecimal.ZERO) <= 0){
- log.error("账户没有钱,请充值......");
- return null;
- }
- /**
- * 判断止损抗压
- */
- // 实际亏损金额
- BigDecimal realKuiSunAmount = WsMapBuild.parseBigDecimalSafe(AccountWs.getAccountMap(accountName).get("upl"));
- log.info("未实现盈亏: {}", realKuiSunAmount);
- String zhiSunPercent = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.ZHI_SUN.name());
- BigDecimal zhiSunAmount = cashBal.multiply(new BigDecimal(zhiSunPercent));
- log.info("预期亏损金额: {}", zhiSunAmount);
- String kangYaPercent = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.KANG_CANG.name());
- BigDecimal kangYaAmount = cashBal.multiply(new BigDecimal(kangYaPercent));
- log.info("预期抗仓金额: {}", kangYaAmount);
-
- if (realKuiSunAmount.compareTo(BigDecimal.ZERO) < 0){
- realKuiSunAmount = realKuiSunAmount.multiply(new BigDecimal("-1"));
- // 账户预期亏损金额比这个还小时,立即止损
- if (realKuiSunAmount.compareTo(zhiSunAmount) > 0){
- log.error("账户冷静止损......");
- WsMapBuild.saveStringToMap(InstrumentsWs.getAccountMap(accountName), CoinEnums.OUT.name(), OrderParamEnums.OUT_YES.getValue());
- return OrderParamEnums.OUT.getValue();
- }
- // 判断抗压
- if (realKuiSunAmount.compareTo(kangYaAmount) > 0 && realKuiSunAmount.compareTo(zhiSunAmount) <= 0){
- log.error("账户紧张扛仓......");
- return OrderParamEnums.HOLDING.getValue();
- }
- }
-
- if (PositionsWs.getAccountMap(accountName).get("pos") == null){
- log.error("没有获取到持仓信息,等待初始化......");
- return null;
- }
- BigDecimal pos = PositionsWs.getAccountMap(accountName).get("pos");
- if (BigDecimal.ZERO.compareTo( pos) >= 0) {
- log.error("持仓数量为零,进行初始化订单");
- return OrderParamEnums.INIT.getValue();
- }
- // 判断是否保证金超标
- if (PositionsWs.getAccountMap(accountName).get("imr") == null){
- log.error("没有获取到持仓信息,等待初始化......");
- return null;
- }
- BigDecimal ordFrozImr = PositionsWs.getAccountMap(accountName).get("imr");
- BigDecimal totalOrderUsdt = WsMapBuild.parseBigDecimalSafe(AccountWs.getAccountMap(accountName).get(CoinEnums.TOTAL_ORDER_USDT.name()));
- if (ordFrozImr.compareTo(totalOrderUsdt) >= 0){
- log.error("已满仓......");
- return OrderParamEnums.HOLDING.getValue();
- }
-
try {
+
+
+ String positionAccountName = PositionsWs.initAccountName(accountName, CoinEnums.POSSIDE_SHORT.getCode());
// 获取标记价格和平均持仓价格
- BigDecimal markPx = PositionsWs.getAccountMap(accountName).get("markPx");
- BigDecimal avgPx = PositionsWs.getAccountMap(accountName).get("avgPx");
+ BigDecimal markPx = PositionsWs.getAccountMap(positionAccountName).get("markPx");
+ BigDecimal avgPx = PositionsWs.getAccountMap(positionAccountName).get("avgPx");
log.info("开仓价格: {}, 当前价格:{},匹配队列中......", avgPx, markPx);
// 初始化网格队列
- PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeQueue.getQueueAsc();
- PriorityBlockingQueue<DescBigDecimal> queueKaiCang = wangGeService.initKaiCang(avgPx, queueAsc);
- PriorityBlockingQueue<AscBigDecimal> queuePingCang = wangGeService.initPingCang(avgPx, queueAsc);
+ PriorityBlockingQueue<AscBigDecimal> queueAsc = WangGeListQueue.getQueueAsc();
+ PriorityBlockingQueue<DescBigDecimal> queueKaiCang = wangGeListService.initKaiCang(avgPx, queueAsc);
+ PriorityBlockingQueue<AscBigDecimal> queuePingCang = wangGeListService.initPingCang(avgPx, queueAsc);
// 处理订单价格在队列中的情况
String orderPrice = OrderInfoWs.getAccountMap(accountName).get("orderPrice");
@@ -325,15 +286,15 @@
log.info("开始减仓...减仓队列价格小于开仓价格{}>{}", kaiCang.getValue(), avgPx);
// 手续费
- BigDecimal feeValue = PositionsWs.getAccountMap(accountName).get("fee").multiply(new BigDecimal("2"));
+ BigDecimal feeValue = PositionsWs.getAccountMap(positionAccountName).get("fee").multiply(new BigDecimal("2"));
//未实现收益
- BigDecimal uplValue = PositionsWs.getAccountMap(accountName).get("upl");
+ BigDecimal uplValue = PositionsWs.getAccountMap(positionAccountName).get("upl");
//已实现收益
- BigDecimal realizedPnlValue = PositionsWs.getAccountMap(accountName).get("realizedPnl");
+ BigDecimal realizedPnlValue = PositionsWs.getAccountMap(positionAccountName).get("realizedPnl");
realizedPnlValue = realizedPnlValue.add(feeValue);
//持仓保证金
- BigDecimal imr = PositionsWs.getAccountMap(accountName).get("imr");
+ BigDecimal imr = PositionsWs.getAccountMap(positionAccountName).get("imr");
String pingCangImr = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.PING_CANG_SHOUYI.name());
BigDecimal imrValue = imr.multiply(new BigDecimal(pingCangImr));
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java
index 861a864..d8b68ce 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java
@@ -39,6 +39,5 @@
WsMapBuild.saveStringToMap(accountMap, CoinEnums.KANG_CANG.name(), CoinEnums.KANG_CANG.getCode());
WsMapBuild.saveStringToMap(accountMap, CoinEnums.PING_CANG_SHOUYI.name(), CoinEnums.PING_CANG_SHOUYI.getCode());
WsMapBuild.saveStringToMap(accountMap, CoinEnums.TOTAL_ORDER_USDTPECENT.name(), CoinEnums.TOTAL_ORDER_USDTPECENT.getCode());
- WsMapBuild.saveStringToMap(accountMap, CoinEnums.POSSIDE.name(), CoinEnums.POSSIDE.getCode());
}
}
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
index 8dc0946..c21c4de 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
@@ -5,6 +5,7 @@
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.OrderParamEnums;
+import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListEnum;
import com.xcong.excoin.modules.okxNewPrice.okxpi.MallUtils;
import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
import com.xcong.excoin.modules.okxNewPrice.utils.WsParamBuild;
@@ -112,10 +113,16 @@
}
WsMapBuild.saveStringToMap(TradeOrderWs.getAccountMap(accountName), "state", CoinEnums.ORDER_LIVE.getCode());
+ //保存上一个网格信息
+ WangGeListEnum gridByPrice = WangGeListEnum.getGridByPrice(new BigDecimal(avgPx));
+ Map<String, String> instrumentsMap = InstrumentsWs.getAccountMap(accountName);
+ WsMapBuild.saveStringToMap(instrumentsMap, CoinEnums.WANG_GE_OLD.name(), gridByPrice.name());
+
// 使用账号特定的Map
- Map<String, BigDecimal> positionsMap = PositionsWs.getAccountMap(accountName);
+ String positionAccountName = PositionsWs.initAccountName(accountName, side);
+ Map<String, BigDecimal> positionsMap = PositionsWs.getAccountMap(positionAccountName);
WsMapBuild.saveBigDecimalToMap(positionsMap, CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode()));
-
+
Map<String, String> accountWsMap = AccountWs.getAccountMap(accountName);
WsMapBuild.saveStringToMap(accountWsMap, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode());
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/PositionsWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/PositionsWs.java
index 3b08fde..b03b897 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/PositionsWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/PositionsWs.java
@@ -47,10 +47,15 @@
}
}
+ public static String initAccountName(String accountName, String posSide) {
+ return accountName+"_"+ posSide;
+ }
+
public static void initEvent(JSONObject response, String accountName) {
// log.info("订阅成功,数据初始化: {}", response.getJSONObject("arg"));
JSONObject arg = response.getJSONObject("arg");
- initParam(arg, accountName);
+ initParam(arg, accountName,CoinEnums.POSSIDE_LONG.getCode());
+ initParam(arg, accountName,CoinEnums.POSSIDE_SHORT.getCode());
}
public static void handleEvent(JSONObject response, String accountName) {
@@ -62,7 +67,8 @@
if (dataArray == null || dataArray.isEmpty()) {
// log.info("账户持仓频道数据为空,已当前价买入,并且初始化网格");
JSONObject posData = new JSONObject();
- initParam(posData, accountName);
+ initParam(posData, accountName,CoinEnums.POSSIDE_LONG.getCode());
+ initParam(posData, accountName,CoinEnums.POSSIDE_SHORT.getCode());
return;
}
@@ -104,8 +110,7 @@
last, idxPx, bePx, realizedPnl, settledPnl,
markPx,fee,fundingFee
);
-
- initParam(posData, accountName);
+ initParam(posData, accountName,posSide);
}
}
} catch (Exception e) {
@@ -113,8 +118,9 @@
}
}
- private static void initParam(JSONObject posData, String accountName) {
- Map<String, BigDecimal> accountMap = getAccountMap(accountName);
+ private static void initParam(JSONObject posData, String accountName,String posSide) {
+ String accountNamePositons = initAccountName(accountName, posSide);
+ Map<String, BigDecimal> accountMap = getAccountMap(accountNamePositons);
WsMapBuild.saveBigDecimalToMap(accountMap, "avgPx", WsMapBuild.parseBigDecimalSafe(posData.getString("avgPx")));
WsMapBuild.saveBigDecimalToMap(accountMap, "pos", WsMapBuild.parseBigDecimalSafe(posData.getString("pos")));
WsMapBuild.saveBigDecimalToMap(accountMap, "upl", WsMapBuild.parseBigDecimalSafe(posData.getString("upl")));
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
index d50dc5c..be34982 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
@@ -40,10 +40,12 @@
log.info("账户通道未就绪,取消发送");
return;
}
- BigDecimal positionsReadyState = PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name()) == null
- ? BigDecimal.ZERO : PositionsWs.getAccountMap(accountName).get(CoinEnums.READY_STATE.name());
+ String posSide = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.POSSIDE.name());
+ String positionAccountName = PositionsWs.initAccountName(accountName, posSide);
+ BigDecimal positionsReadyState = PositionsWs.getAccountMap(positionAccountName).get(CoinEnums.READY_STATE.name()) == null
+ ? BigDecimal.ZERO : PositionsWs.getAccountMap(positionAccountName).get(CoinEnums.READY_STATE.name());
if (WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_YES.getCode()).compareTo(positionsReadyState) != 0) {
- log.info("仓位通道未就绪,取消发送");
+ log.info("仓位{}通道未就绪,取消发送",positionAccountName);
return;
}
// 校验必要参数
@@ -51,7 +53,6 @@
log.warn("下单参数 side 为空,取消发送");
return;
}
- String posSide = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.POSSIDE.name());
// 校验必要参数
if (StrUtil.isBlank(posSide)) {
log.warn("下单参数 posSide 为空,取消发送");
@@ -66,7 +67,7 @@
}else if (OrderParamEnums.OUT.getValue().equals(side)){
log.info("当前状态为止损");
side = OrderParamEnums.SELL.getValue();
- buyCnt = String.valueOf(PositionsWs.getAccountMap(accountName).get("pos"));
+ buyCnt = String.valueOf(PositionsWs.getAccountMap(positionAccountName).get("pos"));
}else if (OrderParamEnums.INIT.getValue().equals(side)){
log.info("当前状态为初始化");
side = OrderParamEnums.BUY.getValue();
@@ -78,7 +79,7 @@
buyCnt = String.valueOf(new BigDecimal(buyCntTime).multiply(new BigDecimal(buyCntStr)));
}else if (OrderParamEnums.SELL.getValue().equals(side)){
log.info("当前状态为减仓");
- buyCnt = String.valueOf(PositionsWs.getAccountMap(accountName).get("pos"));
+ buyCnt = String.valueOf(PositionsWs.getAccountMap(positionAccountName).get("pos"));
}else{
log.warn("交易状态异常,取消发送");
return;
@@ -90,14 +91,14 @@
}else if (OrderParamEnums.OUT.getValue().equals(side)){
log.info("当前状态为止损");
side = OrderParamEnums.BUY.getValue();
- buyCnt = String.valueOf(PositionsWs.getAccountMap(accountName).get("pos"));
+ buyCnt = String.valueOf(PositionsWs.getAccountMap(positionAccountName).get("pos"));
}else if (OrderParamEnums.INIT.getValue().equals(side)){
log.info("当前状态为初始化");
side = OrderParamEnums.SELL.getValue();
buyCnt = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.BUY_CNT_INIT.name());
}else if (OrderParamEnums.BUY.getValue().equals(side)){
log.info("当前状态为减仓");
- buyCnt = String.valueOf(PositionsWs.getAccountMap(accountName).get("pos"));
+ buyCnt = String.valueOf(PositionsWs.getAccountMap(positionAccountName).get("pos"));
}else if (OrderParamEnums.SELL.getValue().equals(side)){
log.info("当前状态为加仓");
String buyCntTime = getAccountMap(accountName).get("buyCntTime");
@@ -135,11 +136,11 @@
log.info("发送下单频道:{},数量:{}", side, buyCnt);
WsMapBuild.saveStringToMap(getAccountMap(accountName), "buyCntTime",String.valueOf(BigDecimal.ONE));
- WsMapBuild.saveStringToMap(getAccountMap(accountName), "clOrdId", clOrdId);
- WsMapBuild.saveStringToMap(getAccountMap(accountName), "state", CoinEnums.ORDER_FILLED.getCode());
+ WsMapBuild.saveStringToMap(getAccountMap(accountName), "clOrdId", clOrdId);
+ WsMapBuild.saveStringToMap(getAccountMap(accountName), "state", CoinEnums.ORDER_FILLED.getCode());
- WsMapBuild.saveBigDecimalToMap(PositionsWs.getAccountMap(accountName), CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode()));
- WsMapBuild.saveStringToMap(AccountWs.getAccountMap(accountName), CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode());
+ WsMapBuild.saveBigDecimalToMap(PositionsWs.getAccountMap(positionAccountName), CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode()));
+ WsMapBuild.saveStringToMap(AccountWs.getAccountMap(accountName), CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode());
} catch (Exception e) {
log.error("下单构建失败", e);
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/CoinEnums.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/CoinEnums.java
index 7198159..e212ad2 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/CoinEnums.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/CoinEnums.java
@@ -36,6 +36,8 @@
USDT("USDT","USDT"),
+ WANG_GE_OLD("上一个网格wang_ge_old", "0"),
+
READY_STATE("是否准备就绪ready_state", "1"),
READY_STATE_YES("准备就绪ready_state", "1"),
READY_STATE_NO("未准备就绪ready_state", "0"),
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java
index 892913a..aa1256d 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java
@@ -13,6 +13,7 @@
OUT_YES("冷静中", "冷静中"),
ORDERING("操作下单中", "ORDERING"),
+ LIMIT("限价止损", "limit"),
OUT("止损", "out"),
INIT("初始化", "init"),
HOLDING("持仓", "holding"),
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListEnum.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListEnum.java
new file mode 100644
index 0000000..06d6cf7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListEnum.java
@@ -0,0 +1,69 @@
+package com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList;
+
+import lombok.Getter;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Administrator
+ * 网格数据枚举 数据
+ * todo 后期考虑优化为可配置项
+ */
+@Getter
+public enum WangGeListEnum {
+ UP("上层做空", "2", "3000", "3200", "10", "short", "3214"),
+ CENTER("中间指定一个方向", "2", "3000", "2700", "5", "long", "2986"),
+ DOWN("下层做多", "2", "2500", "2700", "10", "long", "2586");
+
+ private String name;
+ private String xiaoshu_weishu;
+ private String jiage_shangxian;
+ private String jiage_xiaxian;
+ private String jian_ju;
+ private String fang_xiang;
+ private String zhi_sun_dian;
+
+ WangGeListEnum(String name, String xiaoshu_weishu, String jiage_shangxian, String jiage_xiaxian, String jian_ju, String fang_xiang, String zhi_sun_dian) {
+ this.name = name;
+ this.xiaoshu_weishu = xiaoshu_weishu;
+ this.jiage_shangxian = jiage_shangxian;
+ this.jiage_xiaxian = jiage_xiaxian;
+ this.jian_ju = jian_ju;
+ this.fang_xiang = fang_xiang;
+ this.fang_xiang = zhi_sun_dian;
+ }
+
+ /**
+ * 根据价格获取匹配的网格信息
+ * @param price 待比较的价格
+ * @return 匹配的网格枚举信息,如果没有匹配项则返回null
+ */
+ public static WangGeListEnum getGridByPrice(BigDecimal price) {
+ for (WangGeListEnum grid : WangGeListEnum.values()) {
+ BigDecimal upperLimit = new BigDecimal(grid.jiage_shangxian);
+ BigDecimal lowerLimit = new BigDecimal(grid.jiage_xiaxian);
+
+ // 确保上限大于下限
+ if (upperLimit.compareTo(lowerLimit) > 0) {
+ // 检查价格是否在区间内
+ if (price.compareTo(lowerLimit) >= 0 && price.compareTo(upperLimit) <= 0) {
+ return grid;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 根据枚举名称获取枚举
+ */
+ public static WangGeListEnum getByName(String name) {
+ for (WangGeListEnum grid : WangGeListEnum.values()) {
+ if (grid.name.equals(name)) {
+ return grid;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListQueue.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListQueue.java
new file mode 100644
index 0000000..70ae5a0
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListQueue.java
@@ -0,0 +1,79 @@
+package com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList;
+
+import com.xcong.excoin.rabbit.pricequeue.AscBigDecimal;
+import com.xcong.excoin.rabbit.pricequeue.DescBigDecimal;
+
+import java.util.concurrent.PriorityBlockingQueue;
+
+/**
+ * 网格交易队列管理类
+ *
+ * 用于管理系统中各种网格交易相关的优先级阻塞队列,
+ * 包括完整的网格队列、平仓队列和开仓队列。
+ *
+ * @author Administrator
+ */
+public class WangGeListQueue {
+
+ //------------------------------------------------------------------------------------------------------------------
+ //------------------------------------------------------------------------------------------------------------------
+ // todo 系统启动后,初始化网格队列
+ /**
+ * 完整的网格 头元素最小
+ */
+ public static PriorityBlockingQueue<AscBigDecimal> QUEUE_ASC = null;
+
+
+ //------------------------------------------------------------------------------------------------------------------
+ //------------------------------------------------------------------------------------------------------------------
+ // todo 当用户下了第一单后,根据开仓价格初始化网格平仓队列和开仓队列
+ /**
+ * 网格平仓队列 头元素最小
+ */
+ public static PriorityBlockingQueue<AscBigDecimal> QUEUE_PINGCANG_ASC = null;
+
+ /**
+ * 网格开仓队列 头元素最大
+ */
+ public static PriorityBlockingQueue<DescBigDecimal> QUEUE_KAICANG_DESC = null;
+
+ /**
+ * 获取完整的网格队列(升序)
+ * 如果队列未初始化则创建新的优先级阻塞队列
+ *
+ * @return 返回升序排列的PriorityBlockingQueue队列,队列头部元素最小
+ */
+ public static PriorityBlockingQueue<AscBigDecimal> getQueueAsc() {
+ if (QUEUE_ASC == null) {
+ QUEUE_ASC = new PriorityBlockingQueue<AscBigDecimal>();
+ }
+ return QUEUE_ASC;
+ }
+
+ /**
+ * 获取网格平仓队列(升序)
+ * 如果队列未初始化则创建新的优先级阻塞队列
+ *
+ * @return 返回升序排列的PriorityBlockingQueue队列,队列头部元素最小
+ */
+ public static PriorityBlockingQueue<AscBigDecimal> getPingCang() {
+ if (QUEUE_PINGCANG_ASC == null) {
+ QUEUE_PINGCANG_ASC = new PriorityBlockingQueue<AscBigDecimal>();
+ }
+ return QUEUE_PINGCANG_ASC;
+ }
+
+ /**
+ * 获取网格开仓队列(降序)
+ * 如果队列未初始化则创建新的优先级阻塞队列
+ *
+ * @return 返回降序排列的PriorityBlockingQueue队列,队列头部元素最大
+ */
+ public static PriorityBlockingQueue<DescBigDecimal> getKaiCang() {
+ if (QUEUE_KAICANG_DESC == null) {
+ QUEUE_KAICANG_DESC = new PriorityBlockingQueue<DescBigDecimal>();
+ }
+ return QUEUE_KAICANG_DESC;
+ }
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListService.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListService.java
new file mode 100644
index 0000000..b8b304a
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListService.java
@@ -0,0 +1,41 @@
+package com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList;
+
+import com.xcong.excoin.rabbit.pricequeue.AscBigDecimal;
+import com.xcong.excoin.rabbit.pricequeue.DescBigDecimal;
+
+import java.math.BigDecimal;
+import java.util.concurrent.PriorityBlockingQueue;
+
+/**
+ * 网格交易服务接口
+ * 定义了网格交易的核心操作方法,包括初始化网格、开仓和平仓等操作
+ * @author Administrator
+ */
+public interface WangGeListService {
+
+ /**
+ * 初始化网格交易
+ * 创建并初始化用于网格交易的价格队列,按照价格升序排列
+ * @return 初始化结果信息,返回按价格升序排列的阻塞队列
+ */
+ PriorityBlockingQueue<AscBigDecimal> initWangGe(String markPx);
+
+ /**
+ * 初始化开仓操作
+ * 根据指定价格初始化开仓队列,将开仓价格点加入到价格队列中
+ * @param jiaGe 开仓价格
+ * @param queueAsc 价格队列,用于存储按升序排列的价格点
+ */
+ PriorityBlockingQueue<DescBigDecimal> initKaiCang(BigDecimal jiaGe, PriorityBlockingQueue<AscBigDecimal> queueAsc);
+
+ /**
+ * 初始化平仓操作
+ * 根据指定价格初始化平仓队列,将平仓价格点加入到价格队列中
+ * @param jiaGe 开仓价格
+ * @param queueAsc 价格队列,用于存储按升序排列的价格点
+ */
+ PriorityBlockingQueue<AscBigDecimal> initPingCang(BigDecimal jiaGe, PriorityBlockingQueue<AscBigDecimal> queueAsc);
+
+
+}
+
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..1627d61
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/wanggeList/WangGeListServiceImpl.java
@@ -0,0 +1,178 @@
+package com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList;
+
+import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeEnum;
+import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeQueue;
+import com.xcong.excoin.modules.okxNewPrice.wangge.WangGeService;
+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 = WangGeQueue.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 = 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);
+ }
+ }
+ 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 = WangGeQueue.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