| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.yami.trading.bean.data.domain.Kline; |
| | | import com.yami.trading.bean.data.domain.Realtime; |
| | | 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.util.DateUtils; |
| | | import com.yami.trading.common.web.ResultObject; |
| | | import com.yami.trading.huobi.data.AdjustmentValueCache; |
| | | import com.yami.trading.huobi.data.DataCache; |
| | | import com.yami.trading.huobi.data.internal.DataDBService; |
| | | import com.yami.trading.huobi.data.internal.KlineService; |
| | | import com.yami.trading.service.data.DataService; |
| | |
| | | |
| | | //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); |
| | | //获取当前价格 |
| | | Realtime realtime = DataCache.getLatestRealTime(symbol); |
| | | if (realtime != null) { |
| | | map.put("close", realtime.getClose().setScale(decimal, RoundingMode.HALF_UP)); |
| | | } |
| | | BeforeClose beforeClose = dataDBService.getBeforeClose(kline.getSymbol(), line, ts, realtime); |
| | | if (beforeClose != null) { |
| | | map.put("high", beforeClose.getMaxClose().setScale(decimal, RoundingMode.HALF_UP)); |
| | | map.put("low", beforeClose.getMinClose().setScale(decimal, RoundingMode.HALF_UP)); |
| | |
| | | |
| | | private BigDecimal minClose = BigDecimal.ZERO; |
| | | |
| | | private Long ts = 0L; |
| | | |
| | | |
| | | } |
| | |
| | | /** |
| | | * 数据库根据时间查询 |
| | | */ |
| | | public BeforeClose getBeforeClose(String symbol, String line, Long ts); |
| | | public BeforeClose getBeforeClose(String symbol, String line, Long ts, Realtime realtime); |
| | | |
| | | /** |
| | | * 缓存数据库前24小时最高最低价格 |
| | |
| | | return realtime; |
| | | } |
| | | |
| | | public BeforeClose getBeforeClose(String symbol, String line, Long ts) { |
| | | public BeforeClose getBeforeClose(String symbol, String line, Long ts, Realtime realtime) { |
| | | BeforeClose beforeClose = (BeforeClose) redisTemplate.opsForValue().get(RedisKeys.REAL_TIME_BEFORE_CLOSE + symbol + line); |
| | | if (beforeClose == null) { |
| | | //超出时间重新计算 |
| | | if (beforeClose == null || ts > beforeClose.getTs()) { |
| | | // 直接获取当前时间的毫秒级时间戳(系统默认时区,但值是全球统一的) |
| | | long currentTimeStamp = System.currentTimeMillis(); |
| | | |
| | |
| | | .eq("symbol", symbol) // 直接写数据库字段名(需和表字段一致) |
| | | .ge("ts", ts) |
| | | .le("ts", currentTimeStamp) |
| | | .select("MAX(close) as maxClose", "MIN(close) as minClose"); |
| | | .select("MAX(CAST(close AS DECIMAL(10,4))) as maxClose", |
| | | "MIN(CAST(close AS DECIMAL(10,4))) as minClose"); |
| | | // 4. 执行聚合查询,用selectMap接收结果(键值对:maxClose/minClose -> 对应值) |
| | | Map<String, Object> resultMap = realtimeService.getMap(queryWrapper); |
| | | RequestDataHelper.clear(); |
| | |
| | | } |
| | | beforeClose.setMaxClose(convertToBigDecimal(resultMap.get("maxClose"))); |
| | | beforeClose.setMinClose(convertToBigDecimal(resultMap.get("minClose"))); |
| | | redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE_CLOSE + symbol + line, beforeClose , 10 , TimeUnit.SECONDS); |
| | | beforeClose.setTs(ts); |
| | | redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE_CLOSE + symbol + line, beforeClose); |
| | | } |
| | | |
| | | |
| | | if (realtime != null) { |
| | | if (realtime.getClose().compareTo(beforeClose.getMaxClose()) > 0) { |
| | | beforeClose.setMaxClose(realtime.getClose()); |
| | | redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE_CLOSE + symbol + line, beforeClose); |
| | | } |
| | | if (realtime.getClose().compareTo(beforeClose.getMinClose()) < 0) { |
| | | beforeClose.setMinClose(realtime.getClose()); |
| | | redisTemplate.opsForValue().set(RedisKeys.REAL_TIME_BEFORE_CLOSE + symbol + line, beforeClose); |
| | | } |
| | | } |
| | | System.out.println("realtime.getClose():" + realtime.getClose() + "==" + beforeClose); |
| | | return beforeClose; |
| | | } |
| | | |
| | |
| | | param.put("size", 1440); |
| | | } |
| | | if (Kline.PERIOD_5MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_15MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_30MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_60MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | |
| | | if (Kline.PERIOD_4HOUR.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 200); |
| | | } |
| | | if (Kline.PERIOD_1DAY.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_1MON.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_1WEEK.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | |
| | | } else { |
| | |
| | | param.put("size", 1440); |
| | | } |
| | | if (Kline.PERIOD_5MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_15MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_30MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_60MIN.equals(period)) { |
| | | param.put("size", 576); |
| | | param.put("size", 2000); |
| | | } |
| | | |
| | | if (Kline.PERIOD_4HOUR.equals(period)) { |
| | | param.put("size", 576); |
| | | } |
| | | if (Kline.PERIOD_1DAY.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_1MON.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | if (Kline.PERIOD_1WEEK.equals(period)) { |
| | | param.put("size", 500); |
| | | param.put("size", 2000); |
| | | } |
| | | |
| | | } else { |