新版仿ok交易所-后端
1
dd
2026-05-30 030e1d50c1f643137220f1ecf1d90ce39174204a
trading-order-huobi/src/main/java/com.yami.trading.huobi/data/internal/RemoteDataServiceImpl.java
@@ -11,6 +11,7 @@
import com.yami.trading.bean.data.domain.Depth;
import com.yami.trading.bean.data.domain.Trade;
import com.yami.trading.bean.data.domain.Trend;
import com.yami.trading.huobi.hobi.HobiDataService;
import com.yami.trading.service.data.DataService;
import com.yami.trading.service.item.ItemService;
import com.yami.trading.service.syspara.SysparaService;
@@ -22,6 +23,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Service("remoteDataService")
public class RemoteDataServiceImpl implements DataService {
@@ -32,6 +34,8 @@
    private SysparaService sysparaService;
    @Autowired
    private KlineService klineService;
    @Autowired
    private HobiDataService hobiDataService;
    @Override
    public List<Realtime> realtime(String symbols) {
@@ -95,38 +99,7 @@
            e.printStackTrace();
        }
        Realtime realtime = DataCache.getLatestRealTime(symbol);
        if (realtime != null) {
            Kline kline = null;
            if (KlineConstant.PERIOD_1MIN.equals(line)) {
                kline = klineService.bulidKline1Minute(realtime, KlineConstant.PERIOD_1MIN);
            } else if (KlineConstant.PERIOD_5MIN.equals(line)) {
                kline = klineService.bulidKline5Minute(realtime, KlineConstant.PERIOD_5MIN);
            } else if (KlineConstant.PERIOD_15MIN.equals(line)) {
                kline = klineService.bulidKline15Minute(realtime, KlineConstant.PERIOD_15MIN);
            } else if (KlineConstant.PERIOD_30MIN.equals(line)) {
                kline = klineService.bulidKline30Minute(realtime, KlineConstant.PERIOD_30MIN);
            } else if (KlineConstant.PERIOD_60MIN.equals(line)) {
                kline = klineService.bulidKline60Minute(realtime, KlineConstant.PERIOD_60MIN);
            } else if (KlineConstant.PERIOD_4HOUR.equals(line)) {
                kline = klineService.bulidKline4Hour(realtime, KlineConstant.PERIOD_4HOUR);
            } else if (KlineConstant.PERIOD_1DAY.equals(line)) {
                kline = klineService.bulidKline1Day(realtime, KlineConstant.PERIOD_1DAY);
            } else if (KlineConstant.PERIOD_5DAY.equals(line)) {
                kline = klineService.bulidKline5Day(realtime, KlineConstant.PERIOD_5DAY);
            } else if (KlineConstant.PERIOD_1WEEK.equals(line)) {
                kline = klineService.bulidKline1Week(realtime, KlineConstant.PERIOD_1WEEK);
            } else if (KlineConstant.PERIOD_1MON.equals(line)) {
                kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_1MON);
            } else if (KlineConstant.PERIOD_QUARTER.equals(line)) {
                kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_QUARTER);
            } else if (KlineConstant.PERIOD_YEAR.equals(line)) {
                kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_YEAR);
            }
            if (null != kline) {
                list_clone.add(kline);
            }
        }
        appendInProgressKline(list_clone, symbol, line);
        // 按时间升序
        Collections.sort(list_clone);
        return list_clone;
@@ -148,21 +121,96 @@
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        Realtime realtime = DataCache.getRealtime(symbol);
        Kline hobiOne = DataCache.getKline_hobi().get(symbol + "_" + line);
        Kline lastOne = null;
        if (list != null && list.size() > 0) {
            lastOne = list.get(list.size() - 1);
        // 火币 K 线倒序返回,缓存仅含已收盘 K 线;补拉最新一根未收盘 K 线
        boolean mergedFromHobi = false;
        Item item = itemService.findBySymbol(symbol);
        if (item != null) {
            List<Kline> latestKlines = hobiDataService.kline(item.getSymbol(), line, 1);
            if (!latestKlines.isEmpty()) {
                try {
                    Kline latest = (Kline) latestKlines.get(0).clone();
                    latest.setSymbol(symbol);
                    latest.setPeriod(line);
                    mergeLatestKline(list_clone, latest);
                    mergedFromHobi = true;
                } catch (CloneNotSupportedException e) {
                    Kline latest = latestKlines.get(0);
                    latest.setSymbol(symbol);
                    latest.setPeriod(line);
                    mergeLatestKline(list_clone, latest);
                    mergedFromHobi = true;
                }
            }
        }
        if (realtime != null && hobiOne != null && lastOne != null) {
            list_clone.add(this.klineService.bulidKline(realtime, lastOne, hobiOne, line));
        if (!mergedFromHobi) {
            appendInProgressKline(list_clone, symbol, line);
        }
        Collections.sort(list_clone); // 按时间升序
        return list_clone;
    }
    /**
     * 合并最新 K 线:同时间戳则更新(未收盘 K 线持续变化),否则追加。
     */
    private void mergeLatestKline(List<Kline> list, Kline latest) {
        if (latest == null || latest.getTs() == null) {
            return;
        }
        if (list.isEmpty()) {
            list.add(latest);
            return;
        }
        Kline last = list.get(list.size() - 1);
        if (Objects.equals(last.getTs(), latest.getTs())) {
            list.set(list.size() - 1, latest);
        } else if (last.getTs() < latest.getTs()) {
            list.add(latest);
        }
    }
    /**
     * 基于实时行情聚合当前周期未收盘 K 线(非加密货币等场景兜底)。
     */
    private void appendInProgressKline(List<Kline> list, String symbol, String line) {
        Realtime realtime = DataCache.getLatestRealTime(symbol);
        if (realtime == null) {
            realtime = DataCache.getRealtime(symbol);
        }
        if (realtime == null) {
            return;
        }
        Kline kline = null;
        if (KlineConstant.PERIOD_1MIN.equals(line)) {
            kline = klineService.bulidKline1Minute(realtime, KlineConstant.PERIOD_1MIN);
        } else if (KlineConstant.PERIOD_5MIN.equals(line)) {
            kline = klineService.bulidKline5Minute(realtime, KlineConstant.PERIOD_5MIN);
        } else if (KlineConstant.PERIOD_15MIN.equals(line)) {
            kline = klineService.bulidKline15Minute(realtime, KlineConstant.PERIOD_15MIN);
        } else if (KlineConstant.PERIOD_30MIN.equals(line)) {
            kline = klineService.bulidKline30Minute(realtime, KlineConstant.PERIOD_30MIN);
        } else if (KlineConstant.PERIOD_60MIN.equals(line)) {
            kline = klineService.bulidKline60Minute(realtime, KlineConstant.PERIOD_60MIN);
        } else if (KlineConstant.PERIOD_4HOUR.equals(line)) {
            kline = klineService.bulidKline4Hour(realtime, KlineConstant.PERIOD_4HOUR);
        } else if (KlineConstant.PERIOD_1DAY.equals(line)) {
            kline = klineService.bulidKline1Day(realtime, KlineConstant.PERIOD_1DAY);
        } else if (KlineConstant.PERIOD_5DAY.equals(line)) {
            kline = klineService.bulidKline5Day(realtime, KlineConstant.PERIOD_5DAY);
        } else if (KlineConstant.PERIOD_1WEEK.equals(line)) {
            kline = klineService.bulidKline1Week(realtime, KlineConstant.PERIOD_1WEEK);
        } else if (KlineConstant.PERIOD_1MON.equals(line)) {
            kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_1MON);
        } else if (KlineConstant.PERIOD_QUARTER.equals(line)) {
            kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_QUARTER);
        } else if (KlineConstant.PERIOD_YEAR.equals(line)) {
            kline = klineService.bulidKline1Mon(realtime, KlineConstant.PERIOD_YEAR);
        }
        if (kline != null) {
            mergeLatestKline(list, kline);
        }
    }
    @Override
    public List<Trend> trend(String symbol) {
        TrendTimeObject trendTimeObject = DataCache.getTrend(symbol);