package com.yami.trading.api.controller; import com.yami.trading.bean.data.domain.Kline; 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.common.util.DateUtils; import com.yami.trading.common.web.ResultObject; import com.yami.trading.huobi.data.internal.KlineService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.etf.MarketService; import com.yami.trading.service.item.ItemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; /** * K线图 */ @RestController @CrossOrigin @Api(tags = "K线图实时行情") public class KlineController { public static final String HOBI = "/api/hobi!"; private static Logger logger = LoggerFactory.getLogger(KlineController.class); @Autowired private KlineService klineService; @Autowired private ItemService itemService; @Autowired @Qualifier("dataService") private DataService dataService; @ApiOperation(value = "行情") @GetMapping(HOBI + "getKline.action") public Result>> getKline(@RequestParam String symbol, @RequestParam String line) { ResultObject resultObject = new ResultObject(); // 1min, 5min, 15min, 30min, 60min, 4hour, 1day, 1mon, 1week try { if ("1quarter".equalsIgnoreCase(line)) { line = Kline.PERIOD_QUARTER; } if ("1year".equalsIgnoreCase(line)) { line = Kline.PERIOD_YEAR; } // 数据处理 List data = this.dataService.kline(symbol, line); if ("1day".equals(line) || "5day".equals(line) || "1mon".equals(line) || "1week".equals(line) || "quarter".equalsIgnoreCase(line) || "year".equalsIgnoreCase(line)) { for (Kline datum : data) { datum.setCurrentTime( DateUtils.timeStamp2Date(String.valueOf(datum.getTs()), "yyyy-MM-dd")); } } else if ("1min".equals(line)) { for (Kline datum : data) { datum.setCurrentTime(DateUtils.timeStamp2Date(String.valueOf(datum.getTs()), "HH:mm")); } } else { for (Kline datum : data) { datum.setCurrentTime( DateUtils.timeStamp2Date(String.valueOf(datum.getTs()), "MM-dd HH:mm")); } } return Result.succeed(this.build(data, line, symbol)); } catch (Exception e) { logger.error("getKline error", e); throw new YamiShopBindException("k线图获取失败"); } } private List> build(List data, String line, String symbol) { Collections.sort(data); int len = data.size(); for (int i = 1; i < len; i++) { data.get(i).setOpen(data.get(i - 1).getClose()); } Set tsSet = new HashSet(); List> list = new ArrayList>(); Item bySymbol = itemService.findBySymbol(symbol); for (int i = 0; i < data.size(); i++) { Kline kline = data.get(i); Long ts = kline.getTs(); if (tsSet.contains(ts)) { continue; } else { tsSet.add(ts); } String fake = bySymbol.getFake(); // if("1".equalsIgnoreCase(fake)){ // klineService.smoothlyKline(kline, 0.99); // } int decimal = bySymbol.getDecimals(); BigDecimal low = kline.getLow(); BigDecimal high = kline.getHigh(); BigDecimal open = kline.getOpen(); BigDecimal close = kline.getClose(); if (low == null || low.compareTo(BigDecimal.ZERO) == 0) { continue; } if (high == null || high.compareTo(BigDecimal.ZERO) == 0) { continue; } if (close == null || close.compareTo(BigDecimal.ZERO) == 0) { continue; } if (open == null || open.compareTo(BigDecimal.ZERO) == 0) { continue; } Map map = new HashMap(); map.put("line", line); map.put("symbol", kline.getSymbol()); map.put("timestamp", ts); 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("volume", kline.getVolume()); list.add(map); } return list; } }