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); } }