| | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.huobi.client.model.Candlestick; |
| | | import com.xcong.excoin.common.contants.AppContants; |
| | | import com.xcong.excoin.trade.ExchangeTrade; |
| | | import com.xcong.excoin.utils.RedisUtils; |
| | | import lombok.ToString; |
| | |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | long firstTimeOfToday = calendar.getTimeInMillis(); |
| | | String period = "1min"; |
| | | logger.info("initializeThumb from {} to {}", firstTimeOfToday, nowTime); |
| | | //logger.info("initializeThumb from {} to {}", firstTimeOfToday, nowTime); |
| | | List<Candlestick> lines = service.findAllKLine(this.symbol, firstTimeOfToday, nowTime, period); |
| | | coinThumb = new CoinThumb(); |
| | | synchronized (coinThumb) { |
| | |
| | | //处理K线 |
| | | processTrade(currentKLine, exchangeTrade); |
| | | //处理今日概况信息 |
| | | logger.debug("处理今日概况信息"); |
| | | //logger.debug("处理今日概况信息"); |
| | | handleThumb(exchangeTrade); |
| | | //存储并推送成交信息 |
| | | handleTradeStorage(exchangeTrade); |
| | |
| | | } |
| | | |
| | | public void processTrade(Candlestick kLine, ExchangeTrade exchangeTrade) { |
| | | if (kLine.getClose().compareTo(BigDecimal.ZERO) == 0) { |
| | | if (kLine.getClose()==null || kLine.getClose().compareTo(BigDecimal.ZERO)==0) { |
| | | //第一次设置K线值 |
| | | kLine.setOpen(exchangeTrade.getPrice()); |
| | | kLine.setHigh(exchangeTrade.getPrice()); |
| | |
| | | kLine.setClose(exchangeTrade.getPrice()); |
| | | } |
| | | kLine.setCount(kLine.getCount() + 1); |
| | | kLine.setVolume(kLine.getVolume().add(exchangeTrade.getAmount())); |
| | | if(kLine.getVolume()==null){ |
| | | kLine.setVolume(BigDecimal.ZERO); |
| | | } |
| | | kLine.setAmount(kLine.getVolume().add(exchangeTrade.getAmount())); |
| | | BigDecimal turnover = exchangeTrade.getPrice().multiply(exchangeTrade.getAmount()); |
| | | // kLine.setTurnover(kLine.getTurnover().add(turnover)); |
| | | kLine.setVolume(kLine.getVolume().add(turnover)); |
| | | //kLine.setTimestamp(System.currentTimeMillis()); |
| | | } |
| | | |
| | | public void handleTradeStorage(ExchangeTrade exchangeTrade) { |
| | | for (MarketHandler storage : handlers) { |
| | | storage.handleTrade(symbol, exchangeTrade, coinThumb); |
| | | } |
| | | // for (MarketHandler storage : handlers) { |
| | | // storage.handleTrade(symbol, exchangeTrade, coinThumb); |
| | | // } |
| | | } |
| | | |
| | | public void handleKLineStorage(Candlestick kLine) { |
| | |
| | | } |
| | | |
| | | public void handleThumb(ExchangeTrade exchangeTrade) { |
| | | logger.info("handleThumb symbol = {}", this.symbol); |
| | | //logger.info("handleThumb symbol = {}", this.symbol); |
| | | synchronized (coinThumb) { |
| | | if (coinThumb.getOpen().compareTo(BigDecimal.ZERO) == 0) { |
| | | //第一笔交易记为开盘价 |
| | |
| | | coinThumb.setChg(change.divide(coinThumb.getLow(), 4, BigDecimal.ROUND_UP)); |
| | | } |
| | | if ("USDT".equalsIgnoreCase(baseCoin)) { |
| | | logger.info("setUsdRate", exchangeTrade.getPrice()); |
| | | // logger.info("setUsdRate", exchangeTrade.getPrice()); |
| | | coinThumb.setUsdRate(exchangeTrade.getPrice()); |
| | | } else { |
| | | |
| | |
| | | calendar.add(field, -range); |
| | | String fromTime = df.format(calendar.getTime()); |
| | | long startTick = calendar.getTimeInMillis(); |
| | | System.out.println("time range from " + fromTime + " to " + endTime); |
| | | //System.out.println("time range from " + fromTime + " to " + endTime); |
| | | List<ExchangeTrade> exchangeTrades = service.findTradeByTimeRange(this.symbol, startTick, endTick); |
| | | |
| | | Candlestick kLine = new Candlestick(); |
| | | kLine.setTimestamp(endTick); |
| | | kLine.setAmount(BigDecimal.ZERO); |
| | | kLine.setClose(BigDecimal.ZERO); |
| | | kLine.setLow(BigDecimal.ZERO); |
| | | kLine.setOpen(BigDecimal.ZERO); |
| | | kLine.setClose(AppContants.DEFAULT_PRICE); |
| | | kLine.setLow(AppContants.DEFAULT_PRICE); |
| | | kLine.setOpen(AppContants.DEFAULT_PRICE); |
| | | kLine.setVolume(BigDecimal.ZERO); |
| | | kLine.setHigh(BigDecimal.ZERO); |
| | | kLine.setHigh(AppContants.DEFAULT_PRICE); |
| | | String rangeUnit = ""; |
| | | if (field == Calendar.MINUTE) { |
| | | rangeUnit = "min"; |
| | |
| | | } |
| | | // 如果开盘价为0,则设置为前一个价格 |
| | | if(kLine.getOpen().compareTo(BigDecimal.ZERO) == 0) { |
| | | kLine.setOpen(coinThumb.getClose()); |
| | | kLine.setClose(coinThumb.getClose()); |
| | | kLine.setLow(coinThumb.getClose()); |
| | | kLine.setHigh(coinThumb.getClose()); |
| | | // 查询前一根K线 TODO |
| | | String key = "KINE_" + symbol + "/USDT_" + period; |
| | | Object data = redisUtils.get(key); |
| | | List list = new ArrayList(); |
| | | if (data != null) { |
| | | list = (List) data; |
| | | Candlestick o = (Candlestick)list.get(list.size() - 1); |
| | | kLine.setOpen(o.getClose()); |
| | | kLine.setClose(o.getClose()); |
| | | kLine.setLow(o.getClose()); |
| | | kLine.setHigh(o.getClose()); |
| | | }else{ |
| | | kLine.setOpen(coinThumb.getClose()); |
| | | kLine.setClose(coinThumb.getClose()); |
| | | kLine.setLow(coinThumb.getClose()); |
| | | kLine.setHigh(coinThumb.getClose()); |
| | | } |
| | | |
| | | } |
| | | logger.info("generate " + range + rangeUnit + " kline in {},data={}", df.format(new Date(kLine.getTimestamp())), JSON.toJSONString(kLine)); |
| | | //logger.info("generate " + range + rangeUnit + " kline in {},data={}", df.format(new Date(kLine.getTimestamp())), JSON.toJSONString(kLine)); |
| | | service.saveKLine(symbol,period, kLine); |
| | | // 生成一个对应的新K线 后续的交易会更新这个最新K线数据 |
| | | Candlestick newKline = new Candlestick(); |
| | |
| | | newKline.setOpen(kLine.getClose()); |
| | | newKline.setVolume(BigDecimal.ZERO); |
| | | newKline.setHigh(kLine.getClose()); |
| | | calendar.add(field, 2*range); |
| | | newKline.setTimestamp(calendar.getTimeInMillis()); |
| | | currentKlineMap.put(period,newKline); |
| | | |
| | | // 存储昨日K线 |
| | | if("day".equals(rangeUnit)){ |
| | | redisUtils.set("NEKK/USDT",kLine); |
| | | System.out.println("存储日K线"); |
| | | kLine.setOpen(kLine.getClose()); |
| | | kLine.setLow(kLine.getClose()); |
| | | kLine.setHigh(kLine.getClose()); |
| | | kLine.setVolume(BigDecimal.ZERO); |
| | | redisUtils.set("GRICE/USDT",kLine); |
| | | } |
| | | } |
| | | |