xiaoyong931011
2022-03-04 7dcfa12372a6cbaee0c36fd9e532e3df0a43c2ac
Merge branch 'bea' of http://120.27.238.55:7000/r/exchange into bea
12 files modified
112 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderDetailVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderListVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderDetailVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderListVo.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java 39 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java 2 ●●● patch | view | raw | blame | history
src/main/resources/application-prod.yml 2 ●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/TradeTest.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java
@@ -68,11 +68,11 @@
    @PostMapping(value="/submitSalesWalletCoinOrder")
    @SubmitRepeat
    public Result submitSalesWalletCoinOrder(@RequestBody @Valid SubmitSalesWalletCoinOrderDto submitSalesWalletCoinOrderDto) {
        log.debug("买卖单参数[{}]", JSONObject.toJSONString(submitSalesWalletCoinOrderDto));
        String status = redisUtils.getString("bea_start");
        if ("1".equals(status)) {
            return Result.fail("暂未开放");
        }
        log.info("买卖单参数[{}]", JSONObject.toJSONString(submitSalesWalletCoinOrderDto));
//        String status = redisUtils.getString("bea_start");
//        if ("1".equals(status)) {
//            return Result.fail("暂未开放");
//        }
        String symbol = submitSalesWalletCoinOrderDto.getSymbol();
        Integer type = submitSalesWalletCoinOrderDto.getType();
        Integer tradeType = submitSalesWalletCoinOrderDto.getTradeType();
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/ContractMoneyInfoVo.java
@@ -17,6 +17,12 @@
    @ApiModelProperty(value = "占用保证金")
    private BigDecimal beUsedBondAmount;
    @ApiModelProperty(value = "开多占用保证金")
    private BigDecimal moreBondAmount;
    @ApiModelProperty(value = "开空占用保证金")
    private BigDecimal lessBondAmount;
    @ApiModelProperty(value = "冻结保证金")
    private BigDecimal frozenBondAmount;
@@ -41,6 +47,12 @@
    @ApiModelProperty(value = "规格")
    private BigDecimal symbolSku;
    @ApiModelProperty("涨跌幅")
    private BigDecimal upOrDown;
    @ApiModelProperty(value = "未实现盈亏")
    private BigDecimal profitOrLess;
    public BigDecimal getBeUsedBondAmount() {
        return beUsedBondAmount.setScale(4, BigDecimal.ROUND_DOWN);
    }
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderDetailVo.java
@@ -23,12 +23,18 @@
    @ApiModelProperty("交易类型 1-市价2-限价")
    private int tradeType;
    @ApiModelProperty("仓位类型 1-逐仓 2-全仓")
    private int positionType;
    @ApiModelProperty("币种")
    private String symbol;
    @ApiModelProperty("张数")
    private int symbolCnt;
    @ApiModelProperty(value = "可平张数")
    private int symbolCntSale;
    @ApiModelProperty("规格")
    private BigDecimal symbolSku;
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/HoldOrderListVo.java
@@ -20,6 +20,9 @@
    @ApiModelProperty(value = "订单ID", example = "1")
    private Long id;
    @ApiModelProperty(value = "仓位类型 1-逐仓 2-全仓")
    private Integer positionType;
    @ApiModelProperty(value = "开仓均价", example = "9000.00")
    private BigDecimal openingPrice;
@@ -47,6 +50,9 @@
    @ApiModelProperty(value = "张数")
    private int symbolCnt;
    @ApiModelProperty(value = "可平张数")
    private int symbolCntSale;
    @ApiModelProperty(value = "回报率")
    private BigDecimal returnRate;
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderDetailVo.java
@@ -22,6 +22,9 @@
    @ApiModelProperty("订单类型 -1撤单,1开多,2开空,3平多,4平空")
    private int orderType;
    @ApiModelProperty("仓位类型 1-逐仓 2-全仓")
    private int positionType;
    @ApiModelProperty("订单编号")
    private String orderNo;
src/main/java/com/xcong/excoin/modules/contract/parameter/vo/OrderListVo.java
@@ -1,5 +1,6 @@
package com.xcong.excoin.modules.contract.parameter.vo;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -21,6 +22,9 @@
    @ApiModelProperty("订单类型 1开多,2开空,3平多,4平空")
    private int orderType;
    @ApiModelProperty("仓位类型 1-逐仓 2-全仓")
    private int positionType;
    @ApiModelProperty("订单状态 1成交 2撤单")
    private int orderStatus;
@@ -63,6 +67,16 @@
    @ApiModelProperty(value = "交易类型 1-市价 2-限价")
    private Integer tradeType;
    @ApiModelProperty(value = "杠杆倍率")
    private Integer leverRatio;
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    public String getOrderNo() {
        return StrUtil.isNotBlank(orderNo) ? orderNo.substring(orderNo.length() - 6) : "";
    }
    public String getOpeningFeeAmount() {
        return openingFeeAmount == null ? "" : openingFeeAmount.setScale(4, BigDecimal.ROUND_DOWN).toPlainString();
    }
src/main/java/com/xcong/excoin/modules/contract/service/impl/ContractHoldOrderServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huobi.client.model.Candlestick;
import com.xcong.excoin.common.LoginUserUtils;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.RabbitPriceTypeEnum;
@@ -149,6 +150,7 @@
        holdOrderEntity.setTradeType(ContractHoldOrderEntity.TRADE_TYPE_MARK);
        holdOrderEntity.setSymbol(submitOrderDto.getSymbol());
        holdOrderEntity.setSymbolCnt(submitOrderDto.getSymbolCnt());
        holdOrderEntity.setSymbolCntSale(submitOrderDto.getSymbolCnt());
        holdOrderEntity.setSymbolSku(lotNumber);
        holdOrderEntity.setLeverRatio(submitOrderDto.getLeverRatio());
        holdOrderEntity.setForceClosingPrice(forceClosingPrice);
@@ -467,6 +469,8 @@
        // 当前持仓列表
        List<ContractHoldOrderEntity> holdOrderEntities = contractHoldOrderDao.selectHoldOrderListByMemberId(memberEntity.getId());
        MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
        // 冻结保证金 -- 即委托单中的保证金之和
        BigDecimal frozenBondAmount = BigDecimal.ZERO;
        if (CollUtil.isNotEmpty(entrustOrderEntities)) {
@@ -477,6 +481,8 @@
        // 占用保证金 -- 即持仓单中的保证金之和
        BigDecimal beUsedBondAmount = BigDecimal.ZERO;
        BigDecimal moreBondAmount = BigDecimal.ZERO;
        BigDecimal lessBondAmount = BigDecimal.ZERO;
        // 总盈利
        BigDecimal totalProfitOrLess = BigDecimal.ZERO;
        if (CollUtil.isNotEmpty(holdOrderEntities)) {
@@ -490,10 +496,12 @@
                BigDecimal profitOrLess = BigDecimal.ZERO;
                // 开多
                if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
                    profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber);
                    moreBondAmount = moreBondAmount.add(holdOrderEntity.getBondAmount());
                    profitOrLess = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber);
                    // 开空
                } else {
                    profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt())).multiply(lotNumber);
                    lessBondAmount = lessBondAmount.add(holdOrderEntity.getBondAmount());
                    profitOrLess = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(new BigDecimal(holdOrderEntity.getSymbolCntSale())).multiply(lotNumber);
                }
                if (MemberEntity.IS_PROFIT_Y == memberEntity.getIsProfit()) {
@@ -508,23 +516,42 @@
            }
        }
        MemberWalletContractEntity walletContractEntity = memberWalletContractDao.findWalletContractByMemberIdAndSymbol(memberEntity.getId(), CoinTypeEnum.USDT.name());
        MemberLevelRateEntity rateEntity = memberLevelRateDao.selectLeverRateByMemberIdAndSymbol(memberEntity.getId(), symbol);
        ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo();
        // 权益
        BigDecimal equity = walletContractEntity.getTotalBalance().add(totalProfitOrLess);
        if (equity.compareTo(BigDecimal.ZERO) <= 0) {
            equity = BigDecimal.ZERO;
        }
        ContractMoneyInfoVo contractMoneyInfoVo = new ContractMoneyInfoVo();
        contractMoneyInfoVo.setAvailableBalance(walletContractEntity.getAvailableBalance());
        BigDecimal available = walletContractEntity.getAvailableBalance();
//        if (ContractEntrustOrderEntity.POSITION_TYPE_ALL == memberEntity.getContractPositionType()) {
//            if (totalProfitOrLess.compareTo(BigDecimal.ZERO) <= 0) {
//                available = available.add(totalProfitOrLess);
//                if (available.compareTo(BigDecimal.ZERO) <= 0) {
//                    available = BigDecimal.ZERO;
//                }
//            }
//        }
        // 获取当日k线的开盘价
        Candlestick symbolObject = (Candlestick) redisUtils.get(symbol);
        BigDecimal openPrice = symbolObject.getOpen();
        BigDecimal upOrDown = newPriceSymbol.subtract(openPrice).divide(openPrice, 8, BigDecimal.ROUND_HALF_UP);
        contractMoneyInfoVo.setBeUsedBondAmount(beUsedBondAmount);
        contractMoneyInfoVo.setFrozenBondAmount(frozenBondAmount);
        contractMoneyInfoVo.setEquity(equity);
        contractMoneyInfoVo.setAvailableBalance(available);
        contractMoneyInfoVo.setFeeRatio(tradeSetting.getFeeRatio());
        contractMoneyInfoVo.setLeverAgeRatio(tradeSetting.getLeverageRatio());
        contractMoneyInfoVo.setNewPrice(newPriceSymbol);
        contractMoneyInfoVo.setUpOrDown(upOrDown);
        contractMoneyInfoVo.setSymbolSku(cacheSettingUtils.getSymbolSku(symbol));
        contractMoneyInfoVo.setLeverRate(rateEntity.getLevelRateUp());
        contractMoneyInfoVo.setMoreBondAmount(moreBondAmount);
        contractMoneyInfoVo.setLessBondAmount(lessBondAmount);
        contractMoneyInfoVo.setProfitOrLess(totalProfitOrLess);
        return Result.ok(contractMoneyInfoVo);
    }
src/main/java/com/xcong/excoin/rabbit/consumer/OperateOrderPriceConsumer.java
@@ -17,8 +17,7 @@
 * @author helius
 */
@Component
@Deprecated
@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job-contract", havingValue = "true")
@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job", havingValue = "true")
public class OperateOrderPriceConsumer {
src/main/java/com/xcong/excoin/rabbit/consumer/WebsocketPriceConsumer.java
@@ -24,7 +24,6 @@
 */
@Slf4j
@Component
@Deprecated
@ConditionalOnProperty(prefix = "app", name = "rabbit-consumer", havingValue = "true")
public class WebsocketPriceConsumer {
src/main/java/com/xcong/excoin/rabbit/init/OrderProducerInit.java
@@ -27,7 +27,7 @@
 */
@Slf4j
@Component
@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job-contract", havingValue = "true")
@ConditionalOnProperty(prefix = "app", name = "newest-price-update-job", havingValue = "true")
@Deprecated
public class OrderProducerInit {
src/main/resources/application-prod.yml
@@ -98,7 +98,7 @@
  exchange-trade: true
  day-line: true
  other-job: true
  loop-job: false
  loop-job: true
  rabbit-consumer: true
  block-job: true
src/test/java/com/xcong/excoin/TradeTest.java
@@ -5,11 +5,13 @@
import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity;
import com.xcong.excoin.modules.coin.service.OrderCoinService;
import com.xcong.excoin.trade.CoinTrader;
import com.xcong.excoin.trade.CoinTraderFactory;
import com.xcong.excoin.utils.CoinTypeConvert;
import com.xcong.excoin.utils.RedisUtils;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@@ -45,4 +47,16 @@
    public void gbz() {
        System.out.println(redisUtils.getString(CoinTypeConvert.convertToKey("GBZ"+"/USDT")));
    }
    @Resource
    private CoinTraderFactory factory;
    @Test
    public void traderTest() {
        OrderCoinsEntity coinsEntity = orderCoinsDao.selectById(19);
        String symbol = coinsEntity.getSymbol();
        CoinTrader trader = factory.getTrader(symbol);
        trader.trade(coinsEntity);
    }
}