package com.xcong.excoin.modules.exchange.service.impl; import cn.hutool.core.util.StrUtil; import com.huobi.client.model.Candlestick; import com.xcong.excoin.modules.exchange.service.HandleKlineService; import com.xcong.excoin.processor.CoinProcessor; import com.xcong.excoin.processor.CoinProcessorFactory; import com.xcong.excoin.trade.ExchangeTrade; import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Collection; import java.util.List; import java.util.Map; @Service public class HandleKlineServiceImpl implements HandleKlineService { @Resource private CoinProcessorFactory processorFactory; @Resource private RedisUtils redisUtils; @Override public void handleExchangeOrderToKline(List trades) { if (CollectionUtils.isEmpty(trades)) { return; } String symbol = trades.get(0).getSymbol(); String symbolUsdt = symbol; if(!symbol.contains("USDT")){ symbolUsdt = symbol+"/USDT"; } CoinProcessor processor = processorFactory.getProcessor(symbol); Map currentKlineMap = processor.getCurrentKlineMap(); Collection values = currentKlineMap.values(); BigDecimal newPrice =null; for (Candlestick candlestick : values) { for (ExchangeTrade exchangeTrade : trades) { if(exchangeTrade==null){ continue; } processor.processTrade(candlestick, exchangeTrade); newPrice=exchangeTrade.getPrice(); } } // 更新今日高地价 BigDecimal min=BigDecimal.ZERO; BigDecimal max=BigDecimal.ZERO; BigDecimal vol = BigDecimal.ZERO; for (ExchangeTrade exchangeTrade : trades) { if(exchangeTrade==null){ continue; } if(min.compareTo(BigDecimal.ZERO)==0){ min = exchangeTrade.getPrice(); }else{ min=exchangeTrade.getPrice().min(min); } max=exchangeTrade.getPrice().max(max); vol=vol.add(exchangeTrade.getAmount()); } Object o = redisUtils.get(symbolUsdt); if(o!=null){ Candlestick today = (Candlestick)o; today.setVolume(today.getVolume()==null?BigDecimal.ZERO:today.getVolume()); today.setHigh(today.getHigh().max(max)); today.setLow(today.getLow().min(min)); today.setVolume(today.getVolume().add(vol)); redisUtils.set(symbolUsdt,today); }else{ Candlestick today = new Candlestick(); today.setClose(newPrice); today.setLow(newPrice); today.setHigh(newPrice); today.setVolume(BigDecimal.ZERO); today.setHigh(today.getHigh().max(max)); today.setLow(today.getLow().min(min)); today.setVolume(vol); redisUtils.set(symbolUsdt,today); } // 存入redis,websocket去取 String key = "NEW_KINE_{}"; key = StrUtil.format(key, symbolUsdt); redisUtils.set(key,currentKlineMap); // 更新最新价 if(newPrice!=null){ redisUtils.set(CoinTypeConvert.convertToKey(symbolUsdt), newPrice); } } }