新版仿ok交易所-后端
1
zj
2025-10-30 14c1946eae86a86f8d1edee6cf3bdaf7572fc966
1
25 files modified
1 files added
288 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/data/AdminKlineController.java 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/facade/MarketQuotationsFacade.java 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/KineTask.java 65 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java 12 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/robot/RobotModelTask.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/summary/SummaryCrawl.java 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiAssetsController.java 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java 8 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiMoneyLogController.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java 8 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java 16 ●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java 10 ●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java 4 ●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/future/dto/FuturesParaDTO.java 6 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/job/AbstractGetDataJob.java 8 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/HobiDataServiceImpl.java 12 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/XinLangDataServiceImpl.java 10 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/XueQiuDataServiceImpl.java 12 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java 11 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java 10 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/etf/KlineConfigService.java 2 ●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/etf/MarketService.java 30 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java 32 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/future/FuturesParaService.java 2 ●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/impl/StrongLevelCalculationServiceImpl.java 8 ●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java 6 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/data/AdminKlineController.java
@@ -45,7 +45,7 @@
     */
    @ApiOperation(value = "kline初始化")
    @GetMapping(value = {"klineInit.action", "klineInitConfig.action"})
    public Result<String> klineInit(@RequestParam(required = true) String paraInitSymbol ) throws Exception {
    public Result<String> klineInit(@RequestParam(required = false) String paraInitSymbol ) throws Exception {
trading-order-admin/src/main/java/com/yami/trading/admin/facade/MarketQuotationsFacade.java
@@ -113,7 +113,7 @@
        if (currentValue == null) {
            marketQuotationsAdjust.setNewPrice(Arith.str(realtime.getClose(), decimal));
        } else {
            marketQuotationsAdjust.setNewPrice(realtime.getClose().subtract(currentValue).setScale(decimal, RoundingMode.HALF_UP).toPlainString());
            marketQuotationsAdjust.setNewPrice(realtime.getClose().subtract(currentValue).setScale(decimal, RoundingMode.DOWN).toPlainString());
        }
        marketQuotationsAdjust.setPips(Arith.str(item.getPips(), decimal));
        marketQuotationsAdjust.setAfterValue(Arith.str(realtime.getClose(), decimal));
trading-order-admin/src/main/java/com/yami/trading/admin/task/KineTask.java
New file
@@ -0,0 +1,65 @@
package com.yami.trading.admin.task;
import com.yami.trading.bean.item.domain.Item;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.huobi.data.internal.KlineInitService;
import com.yami.trading.huobi.data.internal.KlineService;
import com.yami.trading.service.item.ItemService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
 * @program: trading-order-master
 * @description:
 * @create: 2025-10-30 15:49
 **/
@Component
public class KineTask {
    private final AtomicBoolean syncINStockData = new AtomicBoolean(false);
    private final Lock syncINStockDataLock = new ReentrantLock();
    @Autowired
    private KlineInitService klineInitService ;
    @Autowired
    private ItemService itemService;
    /**
     * 同步系统所需要的股票
     */
    @Scheduled(cron = "0 0 0/1 * * ?")
    public void syncINStockData() {
        if (syncINStockData.get()) { // 判断任务是否在处理中
            return;
        }
        if (syncINStockDataLock.tryLock()) {
            try {
                syncINStockData.set(true); // 设置处理中标识为true
                String symbols = itemService.list().stream().map(Item::getSymbol).collect(Collectors.joining(","));
                try {
                    klineInitService.klineInit(symbols);
                }catch (Exception e){
                    throw new YamiShopBindException("定时任务k线图初始化失败");
                }
            } finally {
                syncINStockDataLock.unlock();
                syncINStockData.set(false); // 设置处理中标识为false
            }
        }
    }
}
trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimePushJob.java
@@ -120,12 +120,12 @@
        map.put("high", realtime.getHigh());
        map.put("low", realtime.getLow());
        if( realtime.getVolume() != null){
            map.put("volume", realtime.getVolume().setScale(2, RoundingMode.HALF_UP));
            map.put("volume", realtime.getVolume().setScale(2, RoundingMode.DOWN));
        }else{
            map.put("volume", realtime.getVolume());
        }
        if( realtime.getAmount() != null){
            map.put("amount", realtime.getAmount().setScale(2, RoundingMode.HALF_UP));
            map.put("amount", realtime.getAmount().setScale(2, RoundingMode.DOWN));
        }else{
            map.put("amount", realtime.getAmount());
        }
@@ -157,13 +157,13 @@
            if (!map.containsKey(key)) {
                map.put(key, stringObjectMap.get(key));
                BigDecimal open = realtime.getClose();
                map.put("open", open != null ? open.setScale(decimal, RoundingMode.HALF_UP) : null);
                map.put("open", open != null ? open.setScale(decimal, RoundingMode.DOWN) : null);
                BigDecimal close = realtime.getClose();
                map.put("close", close != null ? close.setScale(decimal, RoundingMode.HALF_UP) : null);
                map.put("close", close != null ? close.setScale(decimal, RoundingMode.DOWN) : null);
                BigDecimal high = realtime.getHigh();
                map.put("high", high != null ? high.setScale(decimal, RoundingMode.HALF_UP) : null);
                map.put("high", high != null ? high.setScale(decimal, RoundingMode.DOWN) : null);
                BigDecimal low = realtime.getLow();
                map.put("low", low != null ? low.setScale(decimal, RoundingMode.HALF_UP) : null);
                map.put("low", low != null ? low.setScale(decimal, RoundingMode.DOWN) : null);
            }
        }
trading-order-admin/src/main/java/com/yami/trading/admin/task/robot/RobotModelTask.java
@@ -100,7 +100,7 @@
                    percent = BigDecimal.ZERO;
                } else {
                    chg = close.subtract(open);
                    percent = chg.divide(open, 10, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
                    percent = chg.divide(open, 10, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
                    ;
                }
                model.setKLineData(JSONObject.toJSONString(klines));
@@ -314,7 +314,7 @@
            percent = BigDecimal.ZERO;
        } else {
            chg = close.subtract(open);
            percent = chg.divide(open, 10, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
            percent = chg.divide(open, 10, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
            ;
        }
        robotModel.setKLineData(JSONObject.toJSONString(klines));
trading-order-admin/src/main/java/com/yami/trading/admin/task/summary/SummaryCrawl.java
@@ -751,7 +751,7 @@
        if(content.contains("null")){
            return "-";
        }
        return new BigDecimal(content).setScale(scale, RoundingMode.HALF_UP).toPlainString();
        return new BigDecimal(content).setScale(scale, RoundingMode.DOWN).toPlainString();
    }
    public static String formatMoney(String moneyStr) {
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiAssetsController.java
@@ -49,7 +49,7 @@
        Map<String, String> data = new HashMap<String, String>();
        DecimalFormat df2 = new DecimalFormat("#.##");
        // 向下取整
        df2.setRoundingMode(RoundingMode.HALF_UP);
        df2.setRoundingMode(RoundingMode.DOWN);
        String partyId = SecurityUtils.getCurrentUserId();
        if ("".equals(partyId) || null == partyId) {
            // 当前外汇资产
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java
@@ -422,14 +422,14 @@
        map.put("price", order.getPrice());
        map.put("stop_price_profit", order.getStopPriceProfit());
        if( order.getStopPriceLoss() !=null) {
            map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.HALF_UP));
            map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.DOWN));
        }else{
            map.put("stop_price_loss", null);
        }
        map.put("price_type", order.getOrderPriceType());
        map.put("state", order.getState());
        map.put("amount", order.getVolume().multiply(order.getUnitAmount()).setScale(4, RoundingMode.HALF_UP));
        map.put("amount", order.getVolume().multiply(order.getUnitAmount()).setScale(4, RoundingMode.DOWN));
        map.put("amount_open", order.getVolumeOpen().multiply(order.getUnitAmount()));
        map.put("fee", order.getFee());
        map.put("deposit", order.getDeposit());
@@ -606,9 +606,9 @@
            Realtime realtime = realtimeMap.get(data.getSymbol());
            BigDecimal mark_price = realtime.getClose();
            if(data.getDirection().equalsIgnoreCase("buy")){
                expectedProfitAndLoss += data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.HALF_UP)).doubleValue();
                expectedProfitAndLoss += data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.DOWN)).doubleValue();
            }else{
                expectedProfitAndLoss -= data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.HALF_UP)).doubleValue();
                expectedProfitAndLoss -= data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.DOWN)).doubleValue();
            }
            //手续费
            double fee = Double.parseDouble(data.getFee().toString());
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiMoneyLogController.java
@@ -78,8 +78,8 @@
        for (MoneyLog log : (List<MoneyLog>) page.getRecords()) {
            log.setContent_type(log.getContentType());
            log.setWallet_type(log.getWalletType());
            log.setAmount_after(log.getAmountAfter().setScale(4, RoundingMode.HALF_UP));
            log.setAmount_before(log.getAmountBefore().setScale(4, RoundingMode.HALF_UP));
            log.setAmount_after(log.getAmountAfter().setScale(4, RoundingMode.DOWN));
            log.setAmount_before(log.getAmountBefore().setScale(4, RoundingMode.DOWN));
            if (Constants.MONEYLOG_CONTENT_FINANCE_PROFIT.equals(log.getContentType())) {
                log.setAmount(log.getAmount().add(new BigDecimal(amount)));
trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java
@@ -126,10 +126,10 @@
            map.put("decimals", decimal);
            map.put("ts", ts);
            map.put("current_time", kline.getCurrentTime());
            map.put("open", open.setScale(decimal, RoundingMode.HALF_UP));
            map.put("close", close.setScale(decimal, RoundingMode.HALF_UP));
            map.put("high", high.setScale(decimal, RoundingMode.HALF_UP));
            map.put("low", low.setScale(decimal, RoundingMode.HALF_UP));
            map.put("open", open.setScale(decimal, RoundingMode.DOWN));
            map.put("close", close.setScale(decimal, RoundingMode.DOWN));
            map.put("high", high.setScale(decimal, RoundingMode.DOWN));
            map.put("low", low.setScale(decimal, RoundingMode.DOWN));
            map.put("volume", kline.getVolume());
            list.add(map);
        }
trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
@@ -66,18 +66,18 @@
                d.setType(bySymbol.getType());
                d.setName(bySymbol.getName());
                Integer decimals = bySymbol.getDecimals();
                d.setClose(d.getClose().setScale(decimals, RoundingMode.HALF_UP));
                d.setOpen(d.getOpen().setScale(decimals, RoundingMode.HALF_UP));
                d.setHigh(d.getHigh().setScale(decimals, RoundingMode.HALF_UP));
                d.setLow(d.getLow().setScale(decimals, RoundingMode.HALF_UP));
                d.setClose(d.getClose().setScale(decimals, RoundingMode.DOWN));
                d.setOpen(d.getOpen().setScale(decimals, RoundingMode.DOWN));
                d.setHigh(d.getHigh().setScale(decimals, RoundingMode.DOWN));
                d.setLow(d.getLow().setScale(decimals, RoundingMode.DOWN));
                BigDecimal bigDecimal = BigDecimal.valueOf(1, decimals);
                d.setAsk(d.getClose().add(bigDecimal).setScale(decimals, RoundingMode.HALF_UP));
                d.setBid(d.getClose().subtract(bigDecimal).setScale(decimals, RoundingMode.HALF_UP));
                d.setAsk(d.getClose().add(bigDecimal).setScale(decimals, RoundingMode.DOWN));
                d.setBid(d.getClose().subtract(bigDecimal).setScale(decimals, RoundingMode.DOWN));
                if(d.getVolume()!=null){
                    d.setVolume(d.getVolume().setScale(2, RoundingMode.HALF_UP));
                    d.setVolume(d.getVolume().setScale(2, RoundingMode.DOWN));
                }
                if(d.getAmount()!=null){
                    d.setAmount(d.getAmount().setScale(2, RoundingMode.HALF_UP));
                    d.setAmount(d.getAmount().setScale(2, RoundingMode.DOWN));
                }
                d.setSymbolData(bySymbol.getSymbolData());
trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java
@@ -207,7 +207,7 @@
        if(unitAmount == null){
            unitAmount = BigDecimal.ZERO;
        }
        BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.DOWN);
        return bigDecimal1.toPlainString();
    }
@@ -219,7 +219,7 @@
        if(unitAmount == null){
            unitAmount = BigDecimal.ZERO;
        }
        BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.DOWN);
        return bigDecimal2.toPlainString();
    }
@@ -237,8 +237,8 @@
        if(unitAmount == null){
            unitAmount = BigDecimal.ZERO;
        }
        BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.DOWN);
        BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.DOWN);
        return bigDecimal1.toPlainString()+"/"+bigDecimal2.toPlainString();
    }
@@ -249,6 +249,6 @@
        if(depositOpen == null){
            depositOpen = BigDecimal.ZERO;
        }
        return deposit.setScale(2, RoundingMode.HALF_UP).toPlainString()+"/"+depositOpen.setScale(2, RoundingMode.HALF_UP).toPlainString();
        return deposit.setScale(2, RoundingMode.DOWN).toPlainString()+"/"+depositOpen.setScale(2, RoundingMode.DOWN).toPlainString();
    }
}
trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Realtime.java
@@ -172,7 +172,7 @@
            return BigDecimal.ZERO;
        }
        BigDecimal changeRatio = close.subtract(open).divide(open, 10, RoundingMode.HALF_UP);
        BigDecimal changeRatio = close.subtract(open).divide(open, 10, RoundingMode.DOWN);
        changeRatio = changeRatio.multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN);
        return changeRatio;
@@ -180,7 +180,7 @@
    }
    public BigDecimal getNetChange() {
        BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP);
        BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.DOWN);
        netChange = netChange.setScale(4, RoundingMode.DOWN);
        return netChange;
    }
trading-order-bean/src/main/java/com/yami/trading/bean/future/dto/FuturesParaDTO.java
@@ -73,9 +73,9 @@
    public void divide(){
        this.setProfitRatio(profitRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
        this.setProfitRatioMax(profitRatioMax.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP));
        this.setUnitFee(unitFee.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP));
        this.setProfitRatio(profitRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
        this.setProfitRatioMax(profitRatioMax.divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN));
        this.setUnitFee(unitFee.divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN));
    }
}
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/job/AbstractGetDataJob.java
@@ -76,7 +76,7 @@
                        AdjustmentValueCache.getDelayValue().remove(symbol);
                    } else {
                        // 本次调整值
                        BigDecimal currentValue_frequency = delayValue.getValue().divide(new BigDecimal(frequency), decimal, RoundingMode.HALF_UP);
                        BigDecimal currentValue_frequency = delayValue.getValue().divide(new BigDecimal(frequency), decimal, RoundingMode.DOWN);
                        if (currentValue == null) {
                            AdjustmentValueCache.getCurrentValue().put(symbol, currentValue_frequency);
@@ -99,14 +99,14 @@
                currentValue = AdjustmentValueCache.getCurrentValue().get(realtime.getSymbol());
                if (currentValue != null && currentValue.compareTo(BigDecimal.ZERO) != 0) {
                    realtime.setClose(realtime.getClose().add(currentValue).setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setClose(realtime.getClose().add(currentValue).setScale(decimal, RoundingMode.DOWN));
                    BigDecimal ask = realtime.getAsk();
                    if(ask!=null){
                        realtime.setAsk(ask.add(currentValue).setScale(decimal, RoundingMode.HALF_UP));
                        realtime.setAsk(ask.add(currentValue).setScale(decimal, RoundingMode.DOWN));
                    }
                    BigDecimal bid = realtime.getBid();
                    if(bid!=null){
                        realtime.setBid(bid.add(currentValue).setScale(decimal, RoundingMode.HALF_UP));
                        realtime.setBid(bid.add(currentValue).setScale(decimal, RoundingMode.DOWN));
                    }
                    // realtime.setVolume(Arith.add(realtime.getVolume(), Arith.mul(Arith.div(currentValue, realtime.getClose()), realtime.getVolume())));
                    // realtime.setAmount(Arith.add(realtime.getAmount(), Arith.mul(Arith.div(currentValue, realtime.getClose()), realtime.getAmount())));
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/HobiDataServiceImpl.java
@@ -569,14 +569,14 @@
                    realtime.setSymbol(currency);
                    realtime.setName(currency);
                    realtime.setTs(realtimeJson.getLong("timestamp"));
                    realtime.setOpen(realtimeJson.getBigDecimal("open").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setClose(realtimeJson.getBigDecimal("mid").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setHigh(realtimeJson.getBigDecimal("high").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setLow(realtimeJson.getBigDecimal("low").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setOpen(realtimeJson.getBigDecimal("open").setScale(decimal, RoundingMode.DOWN));
                    realtime.setClose(realtimeJson.getBigDecimal("mid").setScale(decimal, RoundingMode.DOWN));
                    realtime.setHigh(realtimeJson.getBigDecimal("high").setScale(decimal, RoundingMode.DOWN));
                    realtime.setLow(realtimeJson.getBigDecimal("low").setScale(decimal, RoundingMode.DOWN));
                    realtime.setAmount(BigDecimal.ZERO);
                    realtime.setVolume(BigDecimal.ZERO);
                    realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setBid(realtimeJson.getBigDecimal("bid").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.DOWN));
                    realtime.setBid(realtimeJson.getBigDecimal("bid").setScale(decimal, RoundingMode.DOWN));
                    list.add(realtime);
                }
            } else {
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/XinLangDataServiceImpl.java
@@ -118,13 +118,13 @@
                realtime.setSymbol(symbol);
                realtime.setTs(timestamp);
                realtime.setName(symbol);
                realtime.setOpen(BigDecimal.valueOf(Double.parseDouble(split[5])).setScale(decimal, RoundingMode.HALF_UP));
                realtime.setHigh(BigDecimal.valueOf(Double.parseDouble(split[6])).setScale(decimal, RoundingMode.HALF_UP));
                realtime.setLow(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.HALF_UP));
                realtime.setOpen(BigDecimal.valueOf(Double.parseDouble(split[5])).setScale(decimal, RoundingMode.DOWN));
                realtime.setHigh(BigDecimal.valueOf(Double.parseDouble(split[6])).setScale(decimal, RoundingMode.DOWN));
                realtime.setLow(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.DOWN));
                if(StringUtils.isNotEmpty(split[1])){
                    realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[1])).setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[1])).setScale(decimal, RoundingMode.DOWN));
                }else{
                    realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.DOWN));
                }
                realtime.setMarketCapital(0L);
                realtime.setFloatMarketCapital(0L);
trading-order-huobi/src/main/java/com.yami.trading.huobi/hobi/internal/XueQiuDataServiceImpl.java
@@ -343,10 +343,10 @@
                        timestamp = timestamp / 1000;
                    }
                    realtime.setTs(timestamp);
                    realtime.setOpen(jsonObject.getBigDecimal("open").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setClose(jsonObject.getBigDecimal("current").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setHigh(jsonObject.getBigDecimal("high").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setLow(jsonObject.getBigDecimal("low").setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setOpen(jsonObject.getBigDecimal("open").setScale(decimal, RoundingMode.DOWN));
                    realtime.setClose(jsonObject.getBigDecimal("current").setScale(decimal, RoundingMode.DOWN));
                    realtime.setHigh(jsonObject.getBigDecimal("high").setScale(decimal, RoundingMode.DOWN));
                    realtime.setLow(jsonObject.getBigDecimal("low").setScale(decimal, RoundingMode.DOWN));
                    realtime.setMarketCapital(jsonObject.getLong("market_capital"));
                    realtime.setFloatMarketCapital(jsonObject.getLong("float_market_capital"));
                    realtime.setPeForecast(jsonObject.getBigDecimal("pe_forecast"));
@@ -356,12 +356,12 @@
                    if (amount == null) {
                        amount = BigDecimal.ZERO;
                    }
                    realtime.setAmount(amount.setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setAmount(amount.setScale(decimal, RoundingMode.DOWN));
                    BigDecimal volume = jsonObject.getBigDecimal("volume");
                    if (volume == null) {
                        volume = BigDecimal.ZERO;
                    }
                    realtime.setVolume(volume.setScale(decimal, RoundingMode.HALF_UP));
                    realtime.setVolume(volume.setScale(decimal, RoundingMode.DOWN));
//                    realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.HALF_UP));
//                    realtime.setBid(realtimeJson.getBigDecimal("pb").setScale(decimal, RoundingMode.HALF_UP));
                    list.add(realtime);
trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java
@@ -241,7 +241,8 @@
        Wallet wallet = this.walletService.findByUserId(order.getPartyId());
        BigDecimal amountBefore = wallet.getMoney();
        BigDecimal totalAmountCost = order.getDeposit().add(order.getFee());
        log.info("amountBefore:"+amountBefore);
        log.info("totalAmountCost:"+totalAmountCost);
        if (amountBefore.compareTo(totalAmountCost) < 0) {
            throw new YamiShopBindException("not sufficient funds");
        }
@@ -378,4 +379,12 @@
        return list(queryWrapper);
    }
    public static void main(String[] args) {
        System.out.println();
        if (new BigDecimal("1432.34").compareTo(new BigDecimal("1432.34")) < 0) {
            throw new YamiShopBindException("not sufficient funds");
        }
    }
}
trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java
@@ -526,7 +526,7 @@
        BigDecimal point = close.subtract(order.getTradeAvgPrice());
        BigDecimal profit = point.multiply(new BigDecimal("0.01")).multiply(order.getVolumeOpen()).setScale(4, BigDecimal.ROUND_DOWN);;
        BigDecimal rentalProfit = order.getDeposit().add(profit);
        BigDecimal rate = volume.divide(order.getVolumeOpen(), 2, RoundingMode.HALF_UP);
        BigDecimal rate = volume.divide(order.getVolumeOpen(), 2, RoundingMode.DOWN);
        order.setAmountClose(order.getAmountClose().add(profit));
        order.setVolume(order.getVolume().subtract(volume));
        order.setDeposit(order.getDeposit().subtract(order.getDepositOpen().multiply(rate)));
@@ -803,13 +803,13 @@
        map.put("trade_avg_price", order.getTradeAvgPrice());
        map.put("close_avg_price", order.getCloseAvgPrice());
        if (order.getStopPriceProfit() != null) {
            map.put("stop_price_profit", order.getStopPriceProfit().setScale(4, RoundingMode.HALF_UP));
            map.put("stop_price_profit", order.getStopPriceProfit().setScale(4, RoundingMode.DOWN));
        }else{
            map.put("stop_price_profit", order.getStopPriceProfit());
        }
        if (order.getStopPriceLoss() != null) {
            map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.HALF_UP));
            map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.DOWN));
        }else{
            map.put("stop_price_loss", order.getStopPriceLoss());
        }
@@ -819,10 +819,10 @@
        map.put("fee", order.getFee());
        map.put("deposit", order.getDeposit());
        map.put("deposit_open", order.getDepositOpen());
        map.put("change_ratio", order.getChangeRatio().setScale(2, RoundingMode.HALF_UP));
        map.put("change_ratio", order.getChangeRatio().setScale(2, RoundingMode.DOWN));
        if(order.getProfit()!=null){
            map.put("profit", order.getProfit().setScale(2, RoundingMode.HALF_UP));
            map.put("profit", order.getProfit().setScale(2, RoundingMode.DOWN));
        }else{
            map.put("profit", order.getProfit());
        }
trading-order-service/src/main/java/com/yami/trading/service/etf/KlineConfigService.java
@@ -345,7 +345,7 @@
        BigDecimal range = upperBound.subtract(lowerBound);
        BigDecimal randomValue = range.multiply(BigDecimal.valueOf(Math.random())).add(lowerBound);
        return randomValue.setScale(3, RoundingMode.HALF_UP);
        return randomValue.setScale(3, RoundingMode.DOWN);
    }
    private void printResult(List<Kline> originalSecKline) {
trading-order-service/src/main/java/com/yami/trading/service/etf/MarketService.java
@@ -90,10 +90,10 @@
        realtime.setName(symbol);
        realtime.setTs(kline.getTs() / 1000);
        realtime.setOpen(kline.getOpen().setScale(decimal, RoundingMode.HALF_UP));
        realtime.setClose(kline.getClose().setScale(decimal, RoundingMode.HALF_UP));
        realtime.setHigh(kline.getHigh().setScale(decimal, RoundingMode.HALF_UP));
        realtime.setLow(kline.getLow().setScale(decimal, RoundingMode.HALF_UP));
        realtime.setOpen(kline.getOpen().setScale(decimal, RoundingMode.DOWN));
        realtime.setClose(kline.getClose().setScale(decimal, RoundingMode.DOWN));
        realtime.setHigh(kline.getHigh().setScale(decimal, RoundingMode.DOWN));
        realtime.setLow(kline.getLow().setScale(decimal, RoundingMode.DOWN));
//        realtime.setMarketCapital(realtimeJson.getLong("marketCapital"));
//        realtime.setFloatMarketCapital(realtimeJson.getLong("floatMarketCapital"));
//        realtime.setPeForecast(realtimeJson.getBigDecimal("peForecast"));
@@ -104,11 +104,11 @@
        BigDecimal lastAmount = (BigDecimal) Optional.ofNullable(redisTemplate.opsForHash().get(RedisKeys.SYMBOL_AMOUNT_VOLUME + symbol, "amount")).orElse(BigDecimal.ZERO);
        BigDecimal amount = Optional.of(kline.getAmount()).orElse(BigDecimal.ZERO);
        realtime.setAmount(lastAmount.add(amount).setScale(decimal, RoundingMode.HALF_UP));
        realtime.setAmount(lastAmount.add(amount).setScale(decimal, RoundingMode.DOWN));
        BigDecimal lastVolume = (BigDecimal) Optional.ofNullable(redisTemplate.opsForHash().get(RedisKeys.SYMBOL_AMOUNT_VOLUME + symbol, "volume")).orElse(BigDecimal.ZERO);
        BigDecimal volume = Optional.of(kline.getVolume()).orElse(BigDecimal.ZERO);
        realtime.setVolume(lastVolume.add(volume).setScale(decimal, RoundingMode.HALF_UP));
        realtime.setVolume(lastVolume.add(volume).setScale(decimal, RoundingMode.DOWN));
        realtime.setAsk(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(realtime.getLow(), realtime.getClose(), random)));
        realtime.setBid(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(realtime.getHigh(), realtime.getClose(), random)));
@@ -159,10 +159,10 @@
                List<Realtime> realtimes = dataService.realtime(IXIC);
                if (CollectionUtils.isNotEmpty(realtimes)) {
                    Realtime realtime = realtimes.get(0);
                    BigDecimal ratio = realtime.getClose().divide(realtime.getOpen(), 10, RoundingMode.HALF_UP);
                    BigDecimal close = ratio.multiply(kline.getClose()).setScale(2, RoundingMode.HALF_UP);
                    BigDecimal low = ratio.multiply(kline.getLow()).setScale(2, RoundingMode.HALF_UP);
                    BigDecimal high = ratio.multiply(kline.getHigh()).setScale(2, RoundingMode.HALF_UP);
                    BigDecimal ratio = realtime.getClose().divide(realtime.getOpen(), 10, RoundingMode.DOWN);
                    BigDecimal close = ratio.multiply(kline.getClose()).setScale(2, RoundingMode.DOWN);
                    BigDecimal low = ratio.multiply(kline.getLow()).setScale(2, RoundingMode.DOWN);
                    BigDecimal high = ratio.multiply(kline.getHigh()).setScale(2, RoundingMode.DOWN);
                    retKline.setClose(close);
                    retKline.setLow(low);
                    retKline.setHigh(high);
@@ -286,15 +286,15 @@
            buy = new DepthEntry();
            // 买
            BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue();
            buy.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue());
            buy.setAmount(enlarge * volumeSplit.get(i).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue());
            BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue();
            buy.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue());
            buy.setAmount(enlarge * volumeSplit.get(i).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue());
            // 卖
            sell = new DepthEntry();
            sell.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getHigh(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue());
            sell.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getHigh(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue());
            sell.setAmount(enlarge * volumeSplit.get(i + 5).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue());
            sell.setAmount(enlarge * volumeSplit.get(i + 5).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue());
            depth.getAsks().add(sell);
trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
@@ -262,17 +262,17 @@
            toDayProfitLoss = (marketValue - (openPrice * volume));
            profitLoss = marketValue - cost;
            ExchangeSymbolDto exchangeSymbolDto = new ExchangeSymbolDto();
            exchangeSymbolDto.setVolume(new BigDecimal(volume).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setPositionVolume(new BigDecimal(volume).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setPrice(new BigDecimal(price).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setVolume(new BigDecimal(volume).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setPositionVolume(new BigDecimal(volume).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setPrice(new BigDecimal(price).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setName(name);
            exchangeSymbolDto.setSymbol(key);
            exchangeSymbolDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setToDayProfitLossPercentage(calculateProfitPercentage(openPrice, currentPrice));
            exchangeSymbolDto.setCurrentPrice(new BigDecimal(currentPrice).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setOpenPrice(new BigDecimal(openPrice).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setMarketValue(new BigDecimal(marketValue).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue());
            exchangeSymbolDto.setCurrentPrice(new BigDecimal(currentPrice).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setOpenPrice(new BigDecimal(openPrice).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setMarketValue(new BigDecimal(marketValue).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.DOWN).doubleValue());
            exchangeSymbolDto.setProfitLossPercentage(calculateProfitPercentage(price, currentPrice));
            result.add(exchangeSymbolDto);
        }
@@ -284,7 +284,7 @@
        double profit = currentPrice - buyPrice;
        double profitPercentage = (profit / buyPrice) * 100;
        System.out.println(profitPercentage);
        return new BigDecimal(profitPercentage).setScale(2, RoundingMode.HALF_UP).doubleValue();
        return new BigDecimal(profitPercentage).setScale(2, RoundingMode.DOWN).doubleValue();
    }
    public static void test() {
@@ -315,15 +315,15 @@
        }
        SumEtfDto sumEtfDto = new SumEtfDto();
        sumEtfDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue());
        sumEtfDto.setSumPrice(new BigDecimal(sumPrice).setScale(2, RoundingMode.HALF_UP).doubleValue());
        sumEtfDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue());
        sumEtfDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.DOWN).doubleValue());
        sumEtfDto.setSumPrice(new BigDecimal(sumPrice).setScale(2, RoundingMode.DOWN).doubleValue());
        sumEtfDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.DOWN).doubleValue());
        // usdt余额
        Wallet wallet = new Wallet();
        if (!"".equals(userId) && userId != null) {
            wallet = walletService.findByUserId(userId.toString());
        }
        sumEtfDto.setSumVolume(wallet.getMoney().setScale(2, RoundingMode.HALF_UP).doubleValue());
        sumEtfDto.setSumVolume(wallet.getMoney().setScale(2, RoundingMode.DOWN).doubleValue());
        return sumEtfDto;
    }
@@ -579,12 +579,12 @@
            }
            map.put("create_time", DateUtil.formatDate(order.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss));
            map.put("volume", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.HALF_UP));
            map.put("volume", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.DOWN));
            // 买的时候total 为volume,卖的时候total = volume*closeTime
            if("open".equalsIgnoreCase(order.getOffset())){
                map.put("total", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.HALF_UP));
                map.put("total", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.DOWN));
            }else{
                map.put("total", new BigDecimal(order.getVolume()*order.getClosePrice()).setScale(2, RoundingMode.HALF_UP));
                map.put("total", new BigDecimal(order.getVolume()*order.getClosePrice()).setScale(2, RoundingMode.DOWN));
            }
            map.put("offset", order.getOffset());
            map.put("price", order.getPrice());
trading-order-service/src/main/java/com/yami/trading/service/future/FuturesParaService.java
@@ -61,7 +61,7 @@
        if (profitRatio.compareTo(val) < 0 || profitRatioMax.compareTo(val) < 0) {
            scale = 1;
        }
        String profitRatioFront = profitRatio.setScale(scale, RoundingMode.HALF_UP) + "-" + profitRatioMax.setScale(scale, RoundingMode.HALF_UP);
        String profitRatioFront = profitRatio.setScale(scale, RoundingMode.DOWN) + "-" + profitRatioMax.setScale(scale, RoundingMode.DOWN);
        futuresPara.setProfitRatioFront(profitRatioFront);
        BigDecimal unitMaxAmount =  futuresPara.getUnitMaxAmount().compareTo(BigDecimal.ZERO)<= 0?null: futuresPara.getUnitMaxAmount();
        futuresPara.setBuyMin(new BigDecimal(futuresPara.getUnitAmount()));
trading-order-service/src/main/java/com/yami/trading/service/impl/StrongLevelCalculationServiceImpl.java
@@ -38,7 +38,7 @@
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
        return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue();
    }
@@ -66,7 +66,7 @@
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
        return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue();
    }
@@ -139,7 +139,7 @@
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
        return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue();
    }
@@ -166,7 +166,7 @@
        if (result < 0) {
            return 0;
        }
        return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue();
        return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue();
    }
}
trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java
@@ -611,7 +611,7 @@
                    throw new YamiShopBindException("操作失败!修正后账户余额小于0。");
                }
                walletService.updateExtend(walletExtend.getPartyId().toString(), gift_symbol, gift_sum);
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP);
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN);
                userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue());
                /*
@@ -753,7 +753,7 @@
                if (Arith.add(gift_sum, walletExtend.getAmount()) < 0.0D) {
                    throw new YamiShopBindException("操作失败!修正后账户余额小于0。");
                }
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP);
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN);
                userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue());                // 保存账变日志
//                MoneyLog moneyLog = new MoneyLog();
//                moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN);
@@ -1432,7 +1432,7 @@
                if (!walletExtendService.saveOrUpdate(walletExtend)) {
                    throw new YamiShopBindException("操作钱包失败!");
                }
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP);
                BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN);
                userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue());
                // 保存账变日志