新版仿ok交易所-后端
zyy
2025-10-15 2a80056c60e8a7213ca791d59a7faa15556bedf6
优化同步
10 files modified
211 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/data/AdminKlineController.java 17 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/etf/KlineConfigController.java 14 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java 2 ●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimeWebsocketServer.java 6 ●●●● patch | view | raw | blame | history
trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Kline.java 3 ●●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/DataCache.java 9 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/CryptosKlineService.java 5 ●●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/CryptosKlineServiceImpl.java 147 ●●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/KlineInitServiceImpl.java 4 ●●●● patch | view | raw | blame | history
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/job/AbstractGetDataJob.java 4 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/admin/controller/data/AdminKlineController.java
@@ -6,6 +6,7 @@
import com.yami.trading.common.exception.YamiShopBindException;
import com.yami.trading.common.util.MarketOpenChecker;
import com.yami.trading.common.util.UTCDateUtils;
import com.yami.trading.huobi.data.internal.CryptosKlineService;
import com.yami.trading.huobi.data.internal.KlineInitService;
import com.yami.trading.huobi.data.internal.KlineService;
import com.yami.trading.service.item.ItemService;
@@ -40,6 +41,9 @@
    private ItemService itemService;
    @Autowired
    private KlineService klineService;
    @Autowired
    private CryptosKlineService cryptosKlineService;
    /**
     * kline初始化
     */
@@ -68,4 +72,17 @@
        klineService.clean();;
        return Result.succeed ("kline清理完成");
    }
    @GetMapping("klineInitBySql")
    public Result <String> klineInitBySql(String symbol) {
        cryptosKlineService.initBySql(symbol);
        return Result.ok("success");
    }
    @GetMapping("klineSaveInit")
    public Result <String> klineSaveInit(String symbol) {
        cryptosKlineService.saveInit(symbol);
        return Result.ok("success");
    }
}
trading-order-admin/src/main/java/com/yami/trading/admin/controller/etf/KlineConfigController.java
@@ -96,13 +96,15 @@
            if (model == null) {
                return Result.failed("数据不存在");
            }
            //币类型不允许修改
            if (model.getCurrencyType() != null) {
                item.setCurrencyType(model.getCurrencyType());
            }
            model.setBorrowingRate(item.getBorrowingRate());
            model.setDecimals(item.getDecimals());
            model.setMultiple(item.getMultiple());
            model.setName(item.getName());
            model.setStatus(item.getStatus());
            itemService.saveOrUpdate(model);
        } else {
            itemService.saveOrUpdate(item);
        }
        //新增或编辑表单保存
        itemService.saveOrUpdate(item);
        //修改后重新缓存
        itemService.reloadListAndCache();
        return Result.ok("添加交易对成功");
trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
@@ -101,7 +101,7 @@
    /**
     * K线数据修正
     */
    @Scheduled(cron = "0 */1 * * * ?")
    //@Scheduled(cron = "0 */5 * * * ?")
    public void klineInit() {
        List<Item> items = ApplicationContextUtils.getApplicationContext().getBean(ItemService.class).list();
        if (CollectionUtil.isNotEmpty(items)) {
trading-order-admin/src/main/java/com/yami/trading/admin/task/RealtimeWebsocketServer.java
@@ -30,7 +30,7 @@
import java.util.stream.Collectors;
/**
 *
 *
 * 深度、近期交易记录 websocket启动服务
 */
@Component
@@ -113,8 +113,8 @@
            if (currentValue != null && currentValue != 0) {
                realtime.setClose(new BigDecimal(Arith.add(close, currentValue.doubleValue())));
                realtime.setVolume(new BigDecimal(Arith.add(vol, Arith.mul(Arith.div(currentValue, close), vol))));
                realtime.setAmount(new BigDecimal(Arith.add(amount, Arith.mul(Arith.div(currentValue, close), amount))));
                //realtime.setVolume(new BigDecimal(Arith.add(vol, Arith.mul(Arith.div(currentValue, close), vol))));
                //realtime.setAmount(new BigDecimal(Arith.add(amount, Arith.mul(Arith.div(currentValue, close), amount))));
            }
            Double high = DataCache.getRealtimeHigh().get(symbol);
trading-order-bean/src/main/java/com/yami/trading/bean/data/domain/Kline.java
@@ -86,6 +86,9 @@
        return 0;
    }
    @TableField(exist = false)
    private boolean adjusted = false; //新增标记
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/DataCache.java
@@ -30,7 +30,10 @@
     */
    private volatile static Map<String, KlineTimeObject> kline = new ConcurrentHashMap<String, KlineTimeObject>();
    /**
     * 上一条K线数据
     */
    private volatile static Map<String, Kline> lastKline = new ConcurrentHashMap<String, Kline>();
    /**
     * 24小时的历史记录
     */
@@ -116,6 +119,10 @@
        return kline.get(key);
    }
    public static Map<String, Kline> getLastKline() {
        return lastKline;
    }
    public static TrendTimeObject getTrend(String symbol) {
        return trend.get(symbol);
    }
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/CryptosKlineService.java
@@ -6,10 +6,15 @@
import java.util.List;
public interface CryptosKlineService {
    public void initBySql(String symbol);
    public void init(String symbol);
    public void saveInit(String symbol);
    public void saveOne(String symbol, String line);
    public void saveOneByHuoBi(String symbol, String line);
    public List<Kline> find(String symbol, String line, int pageSie);
    public void delete(String line, int days);
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/CryptosKlineServiceImpl.java
@@ -7,6 +7,7 @@
import com.yami.trading.common.config.RequestDataHelper;
import com.yami.trading.common.constants.Constants;
import com.yami.trading.common.util.DateUtils;
import com.yami.trading.huobi.data.AdjustmentValueCache;
import com.yami.trading.huobi.data.DataCache;
import com.yami.trading.huobi.hobi.HobiDataService;
import com.yami.trading.service.data.KlineDBService;
@@ -18,6 +19,7 @@
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.*;
@Component
@@ -34,6 +36,38 @@
    private SysparaService sysparaService;
    @Autowired
    private NamedParameterJdbcOperations namedParameterJdbcTemplate;
    /*public static void main(String[] args) {
        BigDecimal a = BigDecimal.valueOf(0.003);
        BigDecimal b = BigDecimal.valueOf(7200);
        BigDecimal c = a.divide(b, 10, BigDecimal.ROUND_HALF_UP);
        System.out.println(c);
    }*/
    @Override
    public void initBySql(String symbol) {
        this.bulidBySql(symbol, Kline.PERIOD_1MIN);
        this.bulidBySql(symbol, Kline.PERIOD_5MIN);
        this.bulidBySql(symbol, Kline.PERIOD_15MIN);
        this.bulidBySql(symbol, Kline.PERIOD_30MIN);
        this.bulidBySql(symbol, Kline.PERIOD_60MIN);
        this.bulidBySql(symbol, Kline.PERIOD_4HOUR);
        this.bulidBySql(symbol, Kline.PERIOD_1DAY);
        this.bulidBySql(symbol, Kline.PERIOD_1MON);
        this.bulidBySql(symbol, Kline.PERIOD_1WEEK);
    }
    @Override
    public void init(String symbol) {
        this.bulid(symbol, Kline.PERIOD_1MIN);
        this.bulid(symbol, Kline.PERIOD_5MIN);
        this.bulid(symbol, Kline.PERIOD_15MIN);
        this.bulid(symbol, Kline.PERIOD_30MIN);
        this.bulid(symbol, Kline.PERIOD_60MIN);
        this.bulid(symbol, Kline.PERIOD_4HOUR);
        this.bulid(symbol, Kline.PERIOD_1DAY);
        this.bulid(symbol, Kline.PERIOD_1MON);
        this.bulid(symbol, Kline.PERIOD_1WEEK);
    }
    @Override
    public void saveInit(String symbol) {
@@ -55,6 +89,36 @@
    }
    public void bulidBySql(String symbol, String line) {
        RequestDataHelper.set("symbol", symbol);
        LambdaQueryWrapper<Kline> queryWrapper = new LambdaQueryWrapper<Kline>()
                .eq(Kline::getSymbol, symbol)
                .eq(Kline::getPeriod, line)
                .orderByAsc(Kline::getTs);
        List<Kline> list = klineDBService.list(queryWrapper);
        KlineTimeObject model = new KlineTimeObject();
        Collections.sort(list); // 按时间升序
        model.setKline(list);
        model.setLastTime(new Date());
        DataCache.putKline(symbol, line, model);
        RequestDataHelper.clear();
    }
    public void bulid(String symbol, String line) {
        RequestDataHelper.set("symbol", symbol);
        List<Kline> list = hobiDataService.kline(itemService.findBySymbol(symbol).getSymbol(), line, null,
                0);
        KlineTimeObject model = new KlineTimeObject();
        Collections.sort(list); // 按时间升序
        model.setKline(list);
        model.setLastTime(new Date());
        DataCache.putKline(symbol, line, model);
        RequestDataHelper.clear();
    }
    public void bulidInit(String symbol, String line) {
        RequestDataHelper.set("symbol", symbol);
        List<Kline> list = hobiDataService.kline(itemService.findBySymbol(symbol).getSymbol(), line, null,
@@ -69,9 +133,12 @@
    }
    @Override
    public void saveOne(String symbol, String line) {
        RequestDataHelper.set("symbol", symbol);
        saveOneByHuoBi(symbol, line);
        /*RequestDataHelper.set("symbol", symbol);
        Realtime realtime = DataCache.getRealtime(symbol);
        if (realtime == null) {
            logger.error("saveOne error, realtime is null,symbol [" + symbol + "]");
@@ -87,12 +154,13 @@
        String key = symbol + "_" + line;
        Kline hobiOne = DataCache.getKline_hobi().get(key);
        if (hobiOne == null || lastOne == null) {
        *//*if (hobiOne == null || lastOne == null) {
            logger.error("saveOne error, hobiOne is null,symbol [" + symbol + "]");
            // 取不到远程数据,直接退出
            return;
        }
        }*//*
        RequestDataHelper.set("symbol", symbol);
        Kline kline = this.bulidKline(realtime, lastOne, hobiOne, line);
        Kline kline = this.bulidKline(realtime, lastOne, null, line);
        kline.setPeriod(line);
        klineDBService.save(kline);
@@ -105,8 +173,61 @@
        timeObject.getKline().add(kline);
        timeObject.setLastTime(new Date());
        DataCache.putKline(symbol, line, timeObject);
        RequestDataHelper.clear();
        RequestDataHelper.clear();*/
    }
    @Override
    public void saveOneByHuoBi(String symbol, String line) {
        List<Kline> list = hobiDataService.kline(itemService.findBySymbol(symbol).getSymbol(), line, 2, 0);
        if (list == null || list.isEmpty()) {
            return;
        }
        Kline kline = list.get(0);
        BigDecimal currentValue = AdjustmentValueCache.getCurrentValue().get(symbol);
        if (currentValue != null && currentValue.compareTo(BigDecimal.ZERO) > 0) {
            if (!kline.isAdjusted()){
                kline.setClose(kline.getClose().add(currentValue));
                kline.setOpen(kline.getOpen().add(currentValue));
                kline.setLow(kline.getLow().add(currentValue));
                kline.setHigh(kline.getHigh().add(currentValue));
                kline.setAdjusted(true);
            }
        }
        //获取上一条数据
        Kline lastKline = DataCache.getLastKline().get(symbol + line);;
        if (lastKline == null) {
            List<Kline> lastList = this.find(symbol, line, 1);
            if (lastList.size() > 0) {
                lastKline = lastList.get(0);
            }
        }
        //补差
        if (lastKline != null) {
            BigDecimal diff = kline.getOpen().subtract(lastKline.getClose());
            if (diff.compareTo(BigDecimal.ZERO) > 0) {
                kline.setOpen(kline.getOpen().subtract(diff));
                kline.setLow(kline.getLow().subtract(diff));
            } else if (diff.compareTo(BigDecimal.ZERO) < 0) {
                kline.setOpen(kline.getOpen().subtract(diff));
                kline.setHigh(kline.getHigh().subtract(diff));
            }
        }
        RequestDataHelper.set("symbol", symbol);
        klineDBService.save(kline);
        KlineTimeObject timeObject = DataCache.getKline(symbol, line);
        if (timeObject == null) {
            timeObject = new KlineTimeObject();
        }
        timeObject.getKline().add(kline);
        timeObject.setLastTime(new Date());
        DataCache.putKline(symbol, line, timeObject);
        DataCache.getLastKline().put(symbol + line, kline);
        RequestDataHelper.clear();
    }
    public Kline bulidKline(Realtime realtime, Kline lastOne, Kline hobiOne, String line) {
@@ -124,8 +245,17 @@
        if (lastOne != null) {
            kline.setOpen(lastOne.getClose());
            kline.setHigh(lastOne.getClose());
            kline.setLow(lastOne.getClose());
            if (realtime.getClose().compareTo(kline.getHigh()) > 0) {
                kline.setHigh(realtime.getClose());
            }
            if (realtime.getClose().compareTo(kline.getLow()) < 0) {
                kline.setLow(realtime.getClose());
            }
        }
        int interval = this.sysparaService.find("data_interval").getInteger().intValue() / 1000;
        /*int interval = this.sysparaService.find("data_interval").getInteger().intValue() / 1000;
        HighLow highLow = null;
        switch (line) {
@@ -169,9 +299,10 @@
        }
        if (highLow != null && highLow.getLow() != null) {
            kline.setLow(highLow.getLow());
        }
        }*/
        kline.setVolume(hobiOne.getVolume());
        //kline.setVolume(hobiOne.getVolume());
        return kline;
    }
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/KlineInitServiceImpl.java
@@ -37,7 +37,7 @@
        if (!symbols.contains(",")) {
            Item bySymbol = itemService.findBySymbol(symbols);
            if (Item.cryptos.equalsIgnoreCase(bySymbol.getType())) {
                cryptosKlineService.saveInit(symbols);
                cryptosKlineService.init(symbols);
            } else if ("1".equalsIgnoreCase(bySymbol.getFake())) {
                fakeKlineInitService.saveInit(symbols);
            } else {
@@ -50,7 +50,7 @@
                    logger.info("当前开始初始化币对单个k线图: {}", symbol);
                    Item bySymbol = itemService.findBySymbol(symbol);
                    if (Item.cryptos.equalsIgnoreCase(bySymbol.getType())) {
                        cryptosKlineService.saveInit(symbol);
                        cryptosKlineService.init(symbol);
                    } else if ("1".equalsIgnoreCase(bySymbol.getFake())) {
                        fakeKlineInitService.saveInit(symbols);
                    } else {
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/job/AbstractGetDataJob.java
@@ -58,6 +58,10 @@
                AdjustmentValue delayValue = AdjustmentValueCache.getDelayValue().get(symbol);
                if (delayValue != null) {
                    if (delayValue.getValue().compareTo(BigDecimal.ZERO) == 0 || delayValue.getSecond() <= 0) {
                        AdjustmentValueCache.getDelayValue().remove(symbol); // 清理缓存,跳过后续计算
                        return;
                    }
                    // 延时几次
                    int frequency = (int) Arith.div(Arith.mul(delayValue.getSecond(), 1000.0D), this.interval);