Helius
2020-08-31 5ea4b4d2477c425efd18b9b9428f707ec1ccc634
modify
5 files modified
108 ■■■■■ changed files
src/main/java/com/xcong/excoin/common/contants/AppContants.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/OrderWebsocketServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/RabbitOrderServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/pricequeue/WebsocketPriceService.java 30 ●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/WholeTest.java 8 ●●●●● patch | view | raw | blame | history
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_";
}
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();
                //判断当前订单是否是最新的爆仓价 不相等时直接进入下一个订单
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;
        // 平多
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>();
                // 止盈平多
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() {
    }
}