package com.xcong.excoin.quartz.job; import com.alibaba.fastjson.JSON; import com.huobi.client.model.Candlestick; import com.xcong.excoin.processor.CoinProcessorFactory; import com.xcong.excoin.trade.TradePlateModel; import com.xcong.excoin.utils.RedisUtils; import com.xcong.excoin.websocket.TradePlateSendWebSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * 生成各时间段的K线信息 * */ @Component @Slf4j public class KLineGeneratorJob { @Resource private CoinProcessorFactory processorFactory; @Resource private TradePlateSendWebSocket plateSendWebSocket; @Resource private RedisUtils redisUtils; @Scheduled(cron = "0/2 * * * * *") public void tradePlate(){ redisUtils.set("NEKK_NEW_PRICE",new BigDecimal(Math.random())); Candlestick candlestick = new Candlestick(); candlestick.setOpen(new BigDecimal("10.33")); candlestick.setHigh(new BigDecimal("15.23")); candlestick.setVolume(new BigDecimal("12121.34")); candlestick.setLow(new BigDecimal("8.234")); candlestick.setAmount(new BigDecimal("1199")); candlestick.setTimestamp(1599840000); candlestick.setId(1599840000L); candlestick.setCount(100002); candlestick.setClose(new BigDecimal("12.2323")); redisUtils.set("NEKK/USDT",candlestick); // [[10244.21, 0.000855], [10243.7, 0.008777], [10243.59, 0.14], [10243.37, 0.467663]] TradePlateModel tradePlateModel = new TradePlateModel(); List buy; List sell; for(int i=0;i<5;i++){ buy = new ArrayList<>(2); buy.add(new BigDecimal(Math.random()*i)); buy.add(new BigDecimal(Math.random()*i)); tradePlateModel.getBuy().add(buy); sell = new ArrayList<>(2); sell.add(new BigDecimal(Math.random()*i*2)); sell.add(new BigDecimal(Math.random()*i*2)); tradePlateModel.getSell().add(sell); } plateSendWebSocket.sendMessagePlate(JSON.toJSONString(tradePlateModel),null); plateSendWebSocket.sendMessageKline("nekkusdt","1min","{amount: 114419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 311958.06091543}",null); plateSendWebSocket.sendMessageKline("nekkusdt","5min","{amount: 514419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 911958.06091543}",null); plateSendWebSocket.sendMessageKline("nekkusdt","15min","{amount: 514419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 911958.06091543}",null); } /** * 每分钟定时器,处理分钟K线 */ @Scheduled(cron = "0 * * * * *") public void handle5minKLine(){ Calendar calendar = Calendar.getInstance(); log.debug("分钟K线:{}",calendar.getTime()); //将秒、微秒字段置为0 calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); long time = calendar.getTimeInMillis(); int minute = calendar.get(Calendar.MINUTE); int hour = calendar.get(Calendar.HOUR_OF_DAY); processorFactory.getProcessorMap().forEach((symbol,processor)->{ if(!processor.isStopKline()) { log.debug("生成{}分钟k线:{}",symbol); //生成1分钟K线 processor.autoGenerate(); //更新24H成交量 processor.update24HVolume(time); if(minute%5 == 0) { // 五分钟的当前K线 processor.generateKLine(5, Calendar.MINUTE, time); } if(minute%10 == 0){ processor.generateKLine(10, Calendar.MINUTE,time); } if(minute%15 == 0){ processor.generateKLine(15, Calendar.MINUTE,time); } if(minute%30 == 0){ processor.generateKLine(30, Calendar.MINUTE,time); } if(hour == 0 && minute == 0){ processor.resetThumb(); } } }); } /** * 每小时运行 */ @Scheduled(cron = "0 0 * * * *") public void handleHourKLine(){ processorFactory.getProcessorMap().forEach((symbol,processor)-> { if(!processor.isStopKline()) { Calendar calendar = Calendar.getInstance(); log.info("小时K线:{}",calendar.getTime()); //将秒、微秒字段置为0 calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); long time = calendar.getTimeInMillis(); processor.generateKLine(1, Calendar.HOUR_OF_DAY, time); } }); } /** * 每日0点处理器,处理日K线 */ @Scheduled(cron = "0 0 0 * * *") public void handleDayKLine(){ processorFactory.getProcessorMap().forEach((symbol,processor)->{ if(!processor.isStopKline()) { Calendar calendar = Calendar.getInstance(); log.info("日K线:{}",calendar.getTime()); //将秒、微秒字段置为0 calendar.set(Calendar.HOUR_OF_DAY,0); calendar.set(Calendar.MINUTE,0); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); long time = calendar.getTimeInMillis(); int week = calendar.get(Calendar.DAY_OF_WEEK); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); if(week == 1){ processor.generateKLine(1, Calendar.DAY_OF_WEEK, time); } if(dayOfMonth == 1){ processor.generateKLine(1, Calendar.DAY_OF_MONTH, time); } processor.generateKLine(1, Calendar.DAY_OF_YEAR,time); } }); } }