From 5ea4b4d2477c425efd18b9b9428f707ec1ccc634 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Mon, 31 Aug 2020 17:16:00 +0800
Subject: [PATCH] modify
---
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java | 8 ++++
src/test/java/com/xcong/excoin/WholeTest.java | 8 ++++
src/main/java/com/xcong/excoin/common/contants/AppContants.java | 5 ++
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java | 57 ++++++++++++++++++++++++++--
src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java | 30 +++++++++++++--
5 files changed, 100 insertions(+), 8 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/common/contants/AppContants.java b/src/main/java/com/xcong/excoin/common/contants/AppContants.java
index f5c373e..0f9ecf0 100644
--- a/src/main/java/com/xcong/excoin/common/contants/AppContants.java
+++ b/src/main/java/com/xcong/excoin/common/contants/AppContants.java
@@ -78,4 +78,9 @@
public static final String CLOSING_ORDER_PREFIX = "closing_cnt_";
+ /**
+ * 任务进行中前缀
+ */
+ public static final String RABBIT_TYPE = "rabbit_type_";
+
}
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
index f26a9b1..f75401d 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java
@@ -1,8 +1,11 @@
package com.xcong.excoin.modules.contract.service.impl;
+import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.modules.coin.dao.MemberAccountFlowEntityDao;
import com.xcong.excoin.modules.coin.entity.MemberAccountFlowEntity;
+import com.xcong.excoin.modules.contract.dao.ContractEntrustOrderDao;
import com.xcong.excoin.modules.contract.dao.ContractHoldOrderDao;
import com.xcong.excoin.modules.contract.entity.ContractEntrustOrderEntity;
import com.xcong.excoin.modules.contract.entity.ContractHoldOrderEntity;
@@ -24,10 +27,7 @@
import com.xcong.excoin.modules.platform.entity.PlatformTradeSettingEntity;
import com.xcong.excoin.rabbit.pricequeue.OrderModel;
import com.xcong.excoin.rabbit.producer.OrderProducer;
-import com.xcong.excoin.utils.CacheSettingUtils;
-import com.xcong.excoin.utils.CalculateUtil;
-import com.xcong.excoin.utils.CoinTypeConvert;
-import com.xcong.excoin.utils.ThreadPoolUtils;
+import com.xcong.excoin.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
@@ -75,6 +75,10 @@
private MemberSettingDao memberSettingDao;
@Resource
private ContractHoldOrderDao contractHoldOrderDao;
+ @Resource
+ private ContractEntrustOrderDao contractEntrustOrderDao;
+ @Resource
+ private RedisUtils redisUtils;
public void dealOrderFromMq(List<OrderModel> list, Integer type) {
@@ -130,6 +134,23 @@
}
}
+
+
+ /**
+ * 止盈/止损后删除全仓委托平仓单
+ *
+ * @param orderNo
+ */
+ private void deleteEntrustCloseOrder(String orderNo) {
+ // 若平掉所有张数,若存在委托平仓,则删除委托平仓记录
+ List<ContractEntrustOrderEntity> entrustOrders = contractEntrustOrderDao.selectEntrustOrderByOrderNo(orderNo);
+ if (CollUtil.isNotEmpty(entrustOrders)) {
+ for (ContractEntrustOrderEntity entrustOrder : entrustOrders) {
+ contractEntrustOrderDao.deleteById(entrustOrder.getId());
+ }
+ }
+ }
+
/**
* 开多止盈
@@ -224,6 +245,11 @@
//返佣
ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE);
+
+ // 全仓模式,止盈/止损 删除委托平仓
+ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
+ deleteEntrustCloseOrder(order.getOrderNo());
+ }
}
}
}
@@ -234,6 +260,7 @@
/**
* 开空止盈
*/
+ @Transactional(rollbackFor = Exception.class)
public void dealForLessStopPro(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) {
//List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno);
//System.out.println("开空止盈订单batchno:" + batchno);
@@ -322,6 +349,11 @@
//返佣
ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE);
+
+ // 全仓模式,止盈/止损 删除委托平仓
+ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
+ deleteEntrustCloseOrder(order.getOrderNo());
+ }
}
}
}
@@ -334,6 +366,7 @@
*
* @param
*/
+ @Transactional(rollbackFor = Exception.class)
public void dealForMoreLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) {
//List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno);
//System.out.println("开多止损批次号batchno:" + batchno);
@@ -419,6 +452,11 @@
//返佣
ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE);
+
+ // 全仓模式,止盈/止损 删除委托平仓
+ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
+ deleteEntrustCloseOrder(order.getOrderNo());
+ }
}
}
}
@@ -430,6 +468,7 @@
*
* @param
*/
+ @Transactional(rollbackFor = Exception.class)
public void dealForLessLoss(List<ContractHoldOrderEntity> orderList, List<OrderModel> list) {
// List<CoinsCoinsOrder> orderList = orderMapper.selectOrderByBatchNo(batchno);
//System.out.println("开空止损批次号batchno:" + batchno);
@@ -515,6 +554,11 @@
//返佣
ThreadPoolUtils.calReturnMoney(order.getMemberId(), order.getOpeningFeeAmount(), contractOrderEntity, AgentReturnEntity.ORDER_TYPE_CLOSE);
+
+ // 全仓模式,止盈/止损 删除委托平仓
+ if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == order.getPositionType()) {
+ deleteEntrustCloseOrder(order.getOrderNo());
+ }
}
}
}
@@ -730,6 +774,11 @@
modelMap.put(model.getOrderId(), model.getOperateNo());
}
for (ContractHoldOrderEntity coinsOrder : orderList) {
+ List<Object> types = redisUtils.lGet(AppContants.RABBIT_TYPE + coinsOrder.getId(), 0, -1);
+ if(types.contains(9) || types.contains(10) || types.contains(11) || types.contains(12)) {
+ log.info("存在止盈/止损 orderId : {}, types : {}", coinsOrder.getId(), JSONObject.toJSONString(types));
+ continue;
+ }
Long orderId = coinsOrder.getId();
Integer operateNo = coinsOrder.getOperateNo();
//判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单
diff --git a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
index db65c8c..449dc44 100644
--- a/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.OrderClosingTypeEnum;
@@ -387,6 +388,13 @@
int closeCnt = entrustOrder.getSymbolCnt();
ContractHoldOrderEntity holdOrderEntity = contractHoldOrderDao.selectWholeHoldOrderByOrderType(memberId, orderType, symbol);
+
+ List<Object> types = redisUtils.lGet(AppContants.RABBIT_TYPE + holdOrderEntity.getId(), 0, -1);
+ if(types.contains(9) || types.contains(10) || types.contains(11) || types.contains(12)) {
+ log.info("存在止盈/止损 orderId : {}, types : {}", holdOrderEntity.getId(), JSONObject.toJSONString(types));
+ return;
+ }
+
BigDecimal profitOrLoss;
int closingType;
// 平多
diff --git a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
index e6dd36f..23168f6 100644
--- a/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
+++ b/src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java
@@ -1,16 +1,17 @@
package com.xcong.excoin.rabbit.pricequeue;
+import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.rabbit.producer.OrderProducer;
+import com.xcong.excoin.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import javax.annotation.Resource;
+import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
@Slf4j
@@ -19,6 +20,8 @@
@Autowired
OrderProducer orderProducer;
+ @Resource
+ private RedisUtils redisUtils;
/**
* @param symbol
@@ -74,6 +77,18 @@
}
+ private void addExecType(OrderModel model) {
+ List<Object> orderTypes = redisUtils.lGet(AppContants.RABBIT_TYPE + model.getOrderId(), 0 , -1);
+ if (CollUtil.isNotEmpty(orderTypes)) {
+ orderTypes.add(model.getType());
+ } else {
+ orderTypes = new ArrayList<>();
+ orderTypes.add(model.getType());
+ }
+
+ redisUtils.lSet(AppContants.RABBIT_TYPE + model.getOrderId(), orderTypes, 10);
+ }
+
// 处理消息 正序的 包括
// 1:买入委托2:开多3:开空4:平多5:平空6:爆仓平多7:爆仓平空8:撤单9:止盈平多10:止盈平空11:止损平多12:止损平空
public void dealAscPriceOrderAndSenMq(List<AscBigDecimal> list, String symbol) {
@@ -102,6 +117,13 @@
// 3:开空 7:爆仓平空
// 9:止盈平多 12:止损平空
for (OrderModel model : orderModelList) {
+ /*
+ 问题: 1、逐仓: 当行情大时,若设置的止损点与爆仓过于接近,则可能会出现直接爆仓,而不止损的情况
+ 2、全仓: 止盈价/止损价 设置的与委托平仓价相同,需优先处理止盈/止损
+ 解决: 将订单ID作为Key, 该订单执行的队列类型集合作为value, 用于在执行爆仓、委托平仓时,是否存在止盈/止损,若存在则不执行该爆仓和委托平仓
+ */
+ addExecType(model);
+
// 止损平空
List<OrderModel> kkzsList = new ArrayList<OrderModel>();
// 止盈平多
diff --git a/src/test/java/com/xcong/excoin/WholeTest.java b/src/test/java/com/xcong/excoin/WholeTest.java
index 8c1ab3a..e8eb9e4 100644
--- a/src/test/java/com/xcong/excoin/WholeTest.java
+++ b/src/test/java/com/xcong/excoin/WholeTest.java
@@ -15,6 +15,7 @@
import com.xcong.excoin.rabbit.pricequeue.OrderModel;
import com.xcong.excoin.rabbit.producer.OrderProducer;
import com.xcong.excoin.utils.CalculateUtil;
+import com.xcong.excoin.utils.RedisUtils;
import com.xcong.excoin.utils.ThreadPoolUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@@ -138,4 +139,11 @@
}
}
+ @Resource
+ private RedisUtils redisUtils;
+
+ @Test
+ public void redisTest() {
+ }
+
}
--
Gitblit v1.9.1