package com.yami.trading.api.controller;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.yami.trading.bean.data.domain.Kline;
|
import com.yami.trading.bean.data.dto.BeforeClose;
|
import com.yami.trading.bean.ico.domain.Ico;
|
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.AdjustmentValueCache;
|
import com.yami.trading.huobi.data.internal.DataDBService;
|
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.ico.IcoService;
|
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.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 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;
|
@Autowired
|
private IcoService icoService;
|
|
@Autowired
|
private DataDBService dataDBService;
|
|
@ApiOperation(value = "行情")
|
@GetMapping(HOBI + "getKline.action")
|
public Result<List<Map<String, Object>>> 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<Kline> data = this.dataService.kline(symbol, line);
|
Item item = itemService.findBySymbol(symbol);
|
if (item != null) {
|
if (item.getType().equals(Item.cryptos) && (item.getCurrencyType() != null && item.getCurrencyType() == 1)) {
|
/*QueryWrapper<Ico> iQuery = new QueryWrapper<>();
|
iQuery.eq("symbol", symbol);
|
iQuery.eq("symbol_data", item.getSymbolData());
|
Ico ico = icoService.getOne(iQuery);
|
if (ico != null) {
|
long now = ico.getMarketDate().getTime();*/
|
long now = item.getCreateTimeTs() * 1000;
|
data = data.stream().filter(kline -> kline != null
|
&& kline.getTs() != null
|
&& kline.getTs() > now)
|
.collect(Collectors.toList());
|
//}
|
}
|
}
|
|
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"));
|
}
|
}
|
|
/*BigDecimal currentValue = AdjustmentValueCache.getCurrentValue().get(symbol);
|
if (currentValue != null) {
|
data.forEach(kline -> {
|
*//*logger.info("==currentValue==close:{}, low:{}, high:{}, open:{}, currentValue:{}",
|
kline.getClose(), kline.getLow(), kline.getHigh(), kline.getOpen(), currentValue);*//*
|
if (!kline.isAdjusted()){
|
if (kline.getClose().compareTo(kline.getLow()) >= 0 && kline.getClose().compareTo(kline.getHigh()) <= 0) {
|
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);
|
}
|
});
|
}*/
|
return Result.succeed(this.build(data, line, symbol));
|
} catch (Exception e) {
|
logger.error("getKline error", e);
|
throw new YamiShopBindException("k线图获取失败");
|
}
|
}
|
|
private List<Map<String, Object>> build(List<Kline> 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<Long> tsSet = new HashSet<Long>();
|
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
|
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<String, Object> map = new HashMap<String, Object>();
|
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());
|
|
if (line.equalsIgnoreCase(Kline.PERIOD_15MIN) || line.equalsIgnoreCase(Kline.PERIOD_30MIN) || line.equalsIgnoreCase(Kline.PERIOD_60MIN)) {
|
if (i == data.size() - 1) {
|
BeforeClose beforeClose = dataDBService.getBeforeClose(kline.getSymbol(), line, ts);
|
if (beforeClose != null) {
|
map.put("high", beforeClose.getMaxClose().setScale(decimal, RoundingMode.HALF_UP));
|
map.put("low", beforeClose.getMinClose().setScale(decimal, RoundingMode.HALF_UP));
|
}
|
}
|
}
|
list.add(map);
|
}
|
return list;
|
}
|
|
}
|