package com.yami.trading.huobi.data.internal; import cn.hutool.core.util.StrUtil; import com.yami.trading.bean.data.domain.*; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.huobi.data.DataCache; import com.yami.trading.service.data.DataService; import com.yami.trading.service.item.ItemService; import com.yami.trading.service.syspara.SysparaService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Service("dataService") @Slf4j public class DataServiceImpl implements DataService { @Autowired SysparaService sysparaService; @Autowired ItemService itemService; @Autowired KlineService klineService; /** * 根据币种分类 获取实时价格数据 */ @Override public List realtimeByType(String symbolType) { List items = new ArrayList<>(itemService.list()).stream().filter(item -> item.getType().equals(symbolType)).collect(Collectors.toList()); List list = new ArrayList<>(); items.forEach(item -> { Realtime realtime = DataCache.getRealtime(item.getSymbol()); if (null != realtime) { list.add(realtime); } }); return list; } /** * 行情实时价格 */ @Override public List realtime(String symbols) { List list = new ArrayList<>(); // 单个币种 if (!StrUtil.isEmpty(symbols) && !symbols.contains(",")) { Realtime realtime = DataCache.getRealtime(symbols); if (realtime != null) { list.add(realtime); } } // 如果不传参数 返回全部币种行情 else if (StrUtil.isEmpty(symbols)) { List items = new ArrayList<>(itemService.list()); for (Item item : items) { Realtime realtime = DataCache.getRealtime(item.getSymbol()); if (realtime != null) { list.add(realtime); } } } // 多个币种 else if (!StrUtil.isEmpty(symbols) && symbols.contains(",")) { String[] symbolArr = symbols.split(","); for (String oneSymbol : symbolArr) { Realtime realtime = DataCache.getRealtime(oneSymbol); if (realtime != null) { list.add(realtime); } else { log.error("realtime is null; 币种->{}", oneSymbol); } } } return list; } /** * Kline */ @Override public List kline(String symbol, String line) { Item bySymbol = itemService.findBySymbol(symbol); if(Item.cryptos.equals(bySymbol.getType())){ return klineCryptos(symbol, line); } KlineTimeObject timeObject = DataCache.getKline(symbol, line); List list = new ArrayList(); if (timeObject != null) { list = timeObject.getKline(); } List list_clone = new ArrayList(); try { for (int i = 0; i < list.size(); i++) { if(list.get(i) == null){ continue; } Kline kline = (Kline) list.get(i).clone(); list_clone.add(kline); } } catch (CloneNotSupportedException e) { 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); } } // 按时间升序 Collections.sort(list_clone); return list_clone; } /** * 分时图 */ @Override public List trend(String symbol) { TrendTimeObject trendTimeObject = DataCache.getTrend(symbol); trendTimeObject = this.loadTrend(symbol, trendTimeObject); if (trendTimeObject != null) { return trendTimeObject.getTrend(); } return new ArrayList<>(); } /** * 深度数据 */ @Override public Depth depth(String symbol) { DepthTimeObject timeObject = DataCache.getDepth(symbol); if (timeObject != null) { Depth depth = timeObject.getDepth(); depth.setSymbol(symbol); return depth; } timeObject = new DepthTimeObject(); Depth depth = new Depth(); depth.setSymbol(symbol); timeObject.setDepth(depth); DataCache.putDepth(symbol, timeObject); return depth; } /** * 近期交易记录 */ @Override public Trade trade(String symbol) { TradeTimeObject timeObject = DataCache.getTrade(symbol); // this.loadTrade(symbol, timeObject); if (timeObject != null) { return timeObject.getTrade(); } timeObject = new TradeTimeObject(); DataCache.putTrade(symbol, timeObject); return timeObject.getTrade(); } private TrendTimeObject loadTrend(String symbol, TrendTimeObject trendTimeObject) { if (trendTimeObject == null) { // 秒 int interval = 3; int num = (24 * 60 * 60) / interval; List list = new ArrayList<>(); // 24小时的历史记录 List history = bulidNum(DataCache.getCryptosRealtimeHistory(symbol), num); history = this.take500(history); if (history.size() > 500) { // 按时间升序 Collections.sort(history); List history_500 = new ArrayList<>(); for (int i = 0; i < 500; i++) { history_500.add(history.get(i)); } history = history_500; } for (int i = 0; i < history.size(); i++) { Realtime realtime = history.get(i); Trend trend = bulidTrend(realtime); list.add(trend); } Realtime realtime_last = DataCache.getRealtime(symbol); if (realtime_last != null) { list.add(bulidTrend(DataCache.getRealtime(symbol))); } trendTimeObject = new TrendTimeObject(); trendTimeObject.setTrend(list); DataCache.putTrend(symbol, trendTimeObject); } return trendTimeObject; } private List bulidNum(List cacheList, int num) { List list = new ArrayList<>(); if (cacheList == null) { return list; } if (num > cacheList.size()) { num = cacheList.size(); } for (int i = cacheList.size() - num; i < cacheList.size(); i++) { list.add(cacheList.get(i)); } return list; } /** * 按平均频率取500个数据点 */ private List take500(List history) { List list = new ArrayList<>(); int num = history.size() / 500; if (num <= 0) { return history; } int i = 0; while (true) { if (num >= 1.0D) { if (i % num == 0) { list.add(history.get(i)); } } else { list.add(history.get(i)); } i++; if (i >= history.size()) { break; } } return list; } private Trend bulidTrend(Realtime realtime) { Trend trend = new Trend(); trend.setSymbol(realtime.getSymbol()); trend.setTs(realtime.getTs()); trend.setTrend(realtime.getClose()); trend.setVolume(realtime.getVolume()); trend.setAmount(realtime.getAmount()); return trend; } public List klineCryptos(String symbol, String line) { KlineTimeObject timeObject = DataCache.getKline(symbol, line); List list = new ArrayList<>(); if (timeObject != null) { list = timeObject.getKline(); } List list_clone = new ArrayList<>(); try { for (int i = 0; i < list.size(); i++) { Kline kline = (Kline) list.get(i).clone(); list_clone.add(kline); } } catch (CloneNotSupportedException e) { e.printStackTrace(); } Realtime realtime = DataCache.getRealtime(symbol); Kline hobiOne = DataCache.getKlineHoBi(symbol + "_" + line); Kline lastOne = null; if (list.size() > 0) { lastOne = list.get(list.size() - 1); } if (realtime != null && hobiOne != null && lastOne != null) { list_clone.add(this.klineService.bulidKline(realtime, lastOne, hobiOne, line)); } // 按时间升序 Collections.sort(list_clone); return list_clone; } }