Administrator
yesterday a2fbe22cb3067cf4d51cb9861a5a6fa78a936366
feat(kline): 启用K线数据更新任务并优化更新逻辑

- 在application-app.yml中将kline-update-job配置从false改为true
- 移除KlineDataUpdateJob中的静态布尔锁变量和异常处理代码
- 更新K线时间间隔配置,使用标准时间格式如1m、5m、15m等
- 调整定时任务的cron表达式,优化执行频率
- 移除SymbolsServiceImpl中被注释掉的旧实现代码
- 更新K线数据获取逻辑,使用新的API参数格式和数据结构
- 将K线数据存储格式从Candlestick对象列表改为String数组列表
3 files modified
201 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java 76 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/quartz/job/KlineDataUpdateJob.java 123 ●●●● patch | view | raw | blame | history
src/main/resources/application-app.yml 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java
@@ -66,6 +66,46 @@
        return client;
    }
//    @Override
//    public void updateSymbolsKine(String time) {
//        synchronized (this) {
//            //更新币币交易K线历史数据
//            for (SymbolEnum symbol : SymbolEnum.values()) {
//                try {
//                    Thread.sleep(500);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                String[] symbols = symbol.getValue().toLowerCase().split("/");
//                ApiClient client = getClient();
//                KlineResponse kline = client.kline(symbols[0] + symbols[1], time, 1000 + "");
//                if (kline != null) {
//                    if ("ok".equalsIgnoreCase(kline.getStatus())) {
//                        List<Kline> klines = (List<Kline>) kline.data;
//                        List<Candlestick> list = new ArrayList<Candlestick>();
//                        Candlestick candlestick = null;
//                        for (Kline kline1 : klines) {
//                            candlestick = new Candlestick();
//                            candlestick.setAmount(BigDecimal.valueOf(kline1.getAmount()));
//                            candlestick.setClose(BigDecimal.valueOf(kline1.getClose()));
//                            candlestick.setCount(kline1.getCount());
//                            candlestick.setHigh(BigDecimal.valueOf(kline1.getHigh()));
//                            candlestick.setLow(BigDecimal.valueOf(kline1.getLow()));
//                            candlestick.setVolume(BigDecimal.valueOf(kline1.getVol()));
//                            candlestick.setTimestamp(kline1.getId() * 1000);
//                            candlestick.setOpen(BigDecimal.valueOf(kline1.getOpen()));
//                            list.add(candlestick);
//                        }
//
//                        if (klines.size() > 0) {
//                            redisUtils.set("KINE_" + symbol.getValue() + "_" + time, list);
//                        }
//                    }
//                }
//            }
//        }
//    }
    @Override
    public void updateSymbolsKine(String time) {
        synchronized (this) {
@@ -77,30 +117,20 @@
                    e.printStackTrace();
                }
                String[] symbols = symbol.getValue().toLowerCase().split("/");
                ApiClient client = getClient();
                KlineResponse kline = client.kline(symbols[0] + symbols[1], time, 1000 + "");
                if (kline != null) {
                    if ("ok".equalsIgnoreCase(kline.getStatus())) {
                        List<Kline> klines = (List<Kline>) kline.data;
                        List<Candlestick> list = new ArrayList<Candlestick>();
                        Candlestick candlestick = null;
                        for (Kline kline1 : klines) {
                            candlestick = new Candlestick();
                            candlestick.setAmount(BigDecimal.valueOf(kline1.getAmount()));
                            candlestick.setClose(BigDecimal.valueOf(kline1.getClose()));
                            candlestick.setCount(kline1.getCount());
                            candlestick.setHigh(BigDecimal.valueOf(kline1.getHigh()));
                            candlestick.setLow(BigDecimal.valueOf(kline1.getLow()));
                            candlestick.setVolume(BigDecimal.valueOf(kline1.getVol()));
                            candlestick.setTimestamp(kline1.getId() * 1000);
                            candlestick.setOpen(BigDecimal.valueOf(kline1.getOpen()));
                            list.add(candlestick);
                        }
                        if (klines.size() > 0) {
                            redisUtils.set("KINE_" + symbol.getValue() + "_" + time, list);
                        }
                    }
                String instId = symbols[0] +"-"+ symbols[1];
                String bar = time;
                LinkedHashMap<String, Object> requestParam = new LinkedHashMap<>();
                requestParam.put("instId",instId);
                requestParam.put("bar",bar);
                requestParam.put("limit","300");
                String result = ExchangeLoginService.getInstance(ExchangeInfoEnum.OKX_UAT.name()).lineHistory(requestParam);
                log.info("加载OKX-KLINE,{}", result);
                JSONObject json = JSON.parseObject(result);
                String data = json.getString("data");
                List<String[]> klinesList = JSON.parseArray(data, String[].class);
                if (klinesList != null) {
                    redisUtils.set("KINE_" + instId + "_" + time, klinesList);
                }
            }
        }
src/main/java/com/xcong/excoin/quartz/job/KlineDataUpdateJob.java
@@ -21,133 +21,76 @@
    private SymbolsService symbolsService;
    private static boolean min1 = true;
    private static boolean min5 = true;
    private static boolean min30 = true;
    private static boolean min60 = true;
    private static boolean hour4 = true;
    private static boolean day1 = true;
    private static boolean week = true;
    /**
     * 定时更新每一分钟的K线数据
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Scheduled(cron = "0/10 * * * * ? ")
    public void updateSymbolsKineOneMin() {
        if (min1) {
            min1 = false;
            try {
                symbolsService.updateSymbolsKine("1min");
            } catch (Exception e) {
                // e.printStackTrace();
            } finally {
                min1 = true;
            }
        }
        symbolsService.updateSymbolsKine("1m");
    }
    /**
     * 定时更新每十分钟的K线数据
     * 定时更新每5分钟的K线数据
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    @Scheduled(cron = "0 0/5 * * * ?")
    public void updateSymbolsKineFiveMin() {
        if (min5) {
            min5 = false;
            try {
                symbolsService.updateSymbolsKine("5min");
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                min5 = true;
            }
        }
        symbolsService.updateSymbolsKine("5m");
    }
    /**
     * 定时更新每30分钟的K线数据
     */
    @Scheduled(cron = "0/120 * * * * ? ")
    @Scheduled(cron = "0 0/15 * * * ?")
    public void updateSymbolsKineMin() {
        if (min30) {
            min30 = false;
            try {
                symbolsService.updateSymbolsKine("30min");
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                min30 = true;
            }
        }
        symbolsService.updateSymbolsKine("15m");
    }
    /**
     * 定时更新每30分钟的K线数据
     */
    @Scheduled(cron = "0 0/30 * * * ?")
    public void updateSymbolsKineMin30() {
        symbolsService.updateSymbolsKine("30m");
    }
    /**
     * 定时更新1小时的K线数据
     */
    @Scheduled(cron = "* 0/2 * * * ? ")
    @Scheduled(cron = "0 0 * * * ?")
    public void updateSymbolsKineOneHour() {
        if (min60) {
            min60 = false;
            try {
                symbolsService.updateSymbolsKine("60min");
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                min60 = true;
            }
        }
        symbolsService.updateSymbolsKine("1H");
    }
    /**
     * 定时更新4小时的K线数据
     * 定时更新1小时的K线数据
     */
    @Scheduled(cron = "* 0/1 * * * ? ")
    public void updateSymbolsKineFourHour() {
        if (hour4) {
            hour4 = false;
            try {
                symbolsService.updateSymbolsKine("4hour");
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                hour4 = true;
            }
        }
    @Scheduled(cron = "0 0 * * * ?")
    public void updateSymbolsKineTwoHour() {
        symbolsService.updateSymbolsKine("2H");
    }
    /**
     * 定时更新1小时的K线数据
     */
    @Scheduled(cron = "0 0 * * * ?")
    public void updateSymbolsKinefourHour() {
        symbolsService.updateSymbolsKine("4H");
    }
    /**
     * 定时更新1天的K线数据
     */
    @Scheduled(cron = "* 0/1 * * * ? ")
    @Scheduled(cron = "0 0 * * * ?")
    public void updateSymbolsKineOneDay() {
        if (day1) {
            day1 = false;
            try {
                symbolsService.updateSymbolsKine("1day");
            } catch (Exception e) {
                //e.printStackTrace();
            } finally {
                day1 = true;
            }
        }
        symbolsService.updateSymbolsKine("1D");
    }
    /**
     * 定时更新1周的K线数据
     * 定时更新1天的K线数据
     */
    @Scheduled(cron = "* 0/1 * * * ? ")
    @Scheduled(cron = "0 0 * * * ?")
    public void updateSymbolsKineOneWeek() {
        if (week) {
            week = false;
            try {
                symbolsService.updateSymbolsKine("1week");
            } catch (Exception e) {
                // e.printStackTrace();
            } finally {
                week = true;
            }
        }
        symbolsService.updateSymbolsKine("1W");
    }
}
src/main/resources/application-app.yml
@@ -93,7 +93,7 @@
app:
  debug: false
  redis_expire: 3000
  kline-update-job: false
  kline-update-job: true
  newest-price-update-job: false
  #日线 该任务不能与最新价处于同一个服务器
  day-line: false