package com.gear.swx.task; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.gear.common.core.redis.RedisCache; import com.gear.framework.websocket.WebSocketUsers; import com.gear.common.constant.SwxConstons; import com.gear.swx.vo.SyncCurrentValueFromLdVo; import com.gear.swx.vo.SyncKValueFromLdVo; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.*; @Component("SyncFinanceTask") @Slf4j public class SyncFinanceTask { private static final Logger lg = LoggerFactory.getLogger("taskFile"); @Autowired private RedisCache redisCache; private String currentChannel = "139.196.211.109"; private String currentFuturesChannel = "139.196.211.109"; private String channelA = "139.196.211.109"; private String channelB = "47.112.169.122"; private String passwordMd5 = "8a1576001bea15a3e5906ba3af004392"; private String userName = "673468708"; /** * 同步即时信息 */ public void syncCurrentInfo(){ log.debug("----------------------------------同步即时信息"); //获取渠道 if(currentChannel.equals(channelB)){ currentChannel = channelA; }else{ currentChannel = channelB; } List allPrice = new ArrayList<>(); //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ List result = getCurrentValueFromLdVo(syncForex,"exchange_curr.action",""); System.out.println("------------------"); System.out.println(result); allPrice.addAll(result); } System.out.println("当前信息:"+allPrice); //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ List result = getCurrentValueFromMfVo(syncCrypto); allPrice.addAll(result); } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ List result = getCurrentValueFromLdVo(syncStocks,"us_curr.action","&jys=NA"); allPrice.addAll(result); } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ List result = getCurrentValueFromLdVo(syncFutures,"fOption_curr.action",""); allPrice.addAll(result); } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ List result = getCurrentValueFromLdVo(syncMetal,"ldMetal_curr.action",""); allPrice.addAll(result); } //更新每秒数据集合 if(!CollectionUtils.isEmpty(allPrice)){ redisCache.deleteObject(SwxConstons.REDIS_CACHE_CURRENT_MARKET_PRICE); redisCache.setCacheList(SwxConstons.REDIS_CACHE_CURRENT_MARKET_PRICE,allPrice); //将最终结果通过socket广播 JSONArray jsonArray = new JSONArray(allPrice); String msg = jsonArray.toString(); WebSocketUsers.sendMessageToUsersByText(msg); } } /** * 每分钟更新k线 */ public void syncKvalueby1(){ log.debug("----------------------------------每分钟更新k线"); //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","1","",1); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","1","",1); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","1","&jys=NA",1); }else{ getKValueFromLdOne(syncStocks,"us_k.action","1","&jys=NA",1); } } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","1","",1); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","1","",1); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","1","",1); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","1","",1); } } //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),1,1); } } /** * 每5分钟更新k线 */ public void syncKvalueby5(){ log.debug("----------------------------------每5分钟更新k线"); //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","5","",1); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","5","",1); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","5","&jys=NA",1); }else{ getKValueFromLdOne(syncStocks,"us_k.action","5","&jys=NA",1); } } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","5","",1); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","5","",1); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","5","",1); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","5","",1); } } //查询数字货币实时信息 //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),1,5); } } /** * 每15分钟更新k线 */ public void syncKvalueby15(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","15","",1); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","15","",1); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","15","&jys=NA",1); }else{ getKValueFromLdOne(syncStocks,"us_k.action","15","&jys=NA",1); } } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","15","",1); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","15","",1); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","15","",1); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","15","",1); } } //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),1,15); } } /** * 每30分钟更新k线 */ public void syncKvalueby30(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","30","",1); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","30","",1); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","30","&jys=NA",1); }else{ getKValueFromLdOne(syncStocks,"us_k.action","30","&jys=NA",1); } } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","30","",1); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","30","",1); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","30","",1); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","30","",1); } } //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),1,30); } } /** * 每60分钟更新k线 */ public void syncKvalueby60(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","60","",1); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","60","",1); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","60","&jys=NA",1); }else{ getKValueFromLdOne(syncStocks,"us_k.action","60","&jys=NA",1); } } //查询贵金属实时信息 String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","60","",1); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","60","",1); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","60","",1); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","60","",1); } } //查询数字货币实时信息 //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),1,60); } } /** * 每天更新k线 */ public void syncKvaluebyD(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","d","",2); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","d","",2); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","d","&jys=NA",2); }else{ getKValueFromLdOne(syncStocks,"us_k.action","d","&jys=NA",2); } } String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","d","",2); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","d","",2); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","d","",2); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","d","",2); } } //查询数字货币实时信息 String syncCrypto = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_CRYPTO); if(!Strings.isEmpty(syncCrypto)){ getKValueFromMFVO(syncCrypto,redisCache.getCacheObject("syncCryptoKCode"),2,1); } } /** * 每周更新k线 */ public void syncKvaluebyW(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","w","",2); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","w","",2); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","w","&jys=NA",2); }else{ getKValueFromLdOne(syncStocks,"us_k.action","w","&jys=NA",2); } } String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","w","",2); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","w","",2); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","w","",2); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","w","",2); } } //查询数字货币实时信息 } //每月更新k线 public void syncKvaluebyM(){ //获取当前需要查询的对象集合 //获取渠道 //查询外汇实时信息 String syncForex = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FOREX); if(!Strings.isEmpty(syncForex)){ String[] codes = syncForex.split(","); if(codes.length > 1){ getKValueFromLdMany(syncForex,"exchange_pluralK.action","m","",2); }else{ getKValueFromLdOne(syncForex,"exchange_k.action","m","",2); } } //查询股票实时信息 String syncStocks = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_STOCKS); if(!Strings.isEmpty(syncStocks)){ String[] codes = syncStocks.split(","); if(codes.length > 1){ getKValueFromLdMany(syncStocks,"us_pluralK.action","m","&jys=NA",2); }else{ getKValueFromLdOne(syncStocks,"us_k.action","m","&jys=NA",2); } } String syncMetal = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_METAL); if(!Strings.isEmpty(syncMetal)){ String[] codes = syncMetal.split(","); if(codes.length > 1){ getKValueFromLdMany(syncMetal,"ldMetal_pluralK.action","m","",2); }else{ getKValueFromLdOne(syncMetal,"ldMetal_k.action","m","",2); } } //查询期货实时信息 String syncFutures = redisCache.getCacheObject(SwxConstons.REDIS_CACHE_SYNC_TYPE_FUTURES); if(!Strings.isEmpty(syncFutures)){ String[] codes = syncFutures.split(","); if(codes.length > 1){ getKValueFromLdMany(syncFutures,"fOption_pluralK.action","m","",2); }else{ getKValueFromLdOne(syncFutures,"fOption_k.action","m","",2); } } } //获取实时数据 private List getCurrentValueFromLdVo(String code,String method,String append){ List result = new ArrayList<>(); try { String urlStr = "http://"+currentChannel+"/"+method+"?username=673468708&password=8a1576001bea15a3e5906ba3af004392&id="+code+"&column=mc,zf,price,zdf"+append; log.info("获取实时数据,类型为:{},代码为:{},请求地址:{}",method,code,urlStr); // 创建 URL 对象 URL url = new URL(urlStr); // 创建 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String firstLine = reader.readLine(); log.info("返回列:{}",firstLine); String[] clomns = firstLine.split(","); Integer codePostion = getPostion(clomns,"代码"); Integer namePosition = getPostion(clomns,"名称"); Integer pricePosition = getPostion(clomns,"价格"); Integer zdfPosition = getPostion(clomns,"涨跌幅"); // 读取 CSV 数据 String line; while ((line = reader.readLine()) != null) { // 打印每一行数据 System.out.println("当前数据:"+line); String[] dataArray = line.split(","); SyncCurrentValueFromLdVo vo = new SyncCurrentValueFromLdVo(); vo.setCode(dataArray[codePostion]); vo.setPrice(isDecimal(dataArray[pricePosition]) ? new BigDecimal(dataArray[pricePosition]) : BigDecimal.ZERO); vo.setZdf(isDecimal(dataArray[zdfPosition]) ? new BigDecimal(dataArray[zdfPosition]) : BigDecimal.ZERO); vo.setName(dataArray[namePosition]); //更新对应个产品每秒数据 redisCache.setCacheObject(vo.getCode()+"CurrPrice",vo.getPrice()); redisCache.setCacheObject(vo.getCode()+"CurrZdf",vo.getZdf()); //更新对应产品的缓存100条数据 List list = redisCache.getCacheList(vo.getCode()+"Hundred"); if(list != null && list.size() > 0){ //如果本次获取的价格和上次一样,则不保存 BigDecimal lastPrice = new BigDecimal(list.get(list.size()-1)+""); if (lastPrice.compareTo(vo.getPrice()) != 0){ if(list.size() >= 100){ list.remove(0); } list.add(vo.getPrice()); redisCache.deleteObject(vo.getCode()+"Hundred"); redisCache.setCacheList(vo.getCode()+"Hundred",list); } } result.add(vo); } // 关闭连接 reader.close(); connection.disconnect(); return result; } catch (Exception e) { System.out.println("执行获取单价发生异常了发生异常了"); System.out.println(e.toString()); } return result; } private void getKValueFromLdMany(String code,String method,String dateNum,String append,Integer dateType){ try { SimpleDateFormat simpleDateFormat; if (dateType == 1){ simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmm"); }else{ simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); } String urlStr = "http://"+channelA+"/"+method+"?username=673468708&password=8a1576001bea15a3e5906ba3af004392&id="+code+"&period="+dateNum+"&num=-100&datetime="+simpleDateFormat.format(new Date())+append; lg.info("获取实时数据,类型为:{},代码为:{},请求地址:{},时间为:{}",method,code,urlStr,dateNum); // 创建 URL 对象 URL url = new URL(urlStr); // 创建 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String firstLine = reader.readLine(); boolean dateFlag = false; String dateStr = ""; if("日期".equals(firstLine.trim())){ dateFlag = true; dateStr = reader.readLine(); firstLine = reader.readLine(); } // 读取 CSV 数据 String line; String nowCode = ""; List tempList = new ArrayList<>(); while ((line = reader.readLine()) != null) { // 打印每一行数据 String[] dataArray = line.split(","); if("".equals(nowCode)){ nowCode = dataArray[0]; } //如果产品代码不等于上一行的产品代码,则证明产品应景更换,将之前集合的数据存入redis,并清空之前的集合 if (!nowCode.equals(dataArray[0])){ redisCache.deleteObject(nowCode+dateNum+"KValue"); redisCache.setCacheList(nowCode+dateNum+"KValue",tempList); //如果百威数据为null,则进行存入 if(CollectionUtils.isEmpty(redisCache.getCacheList(nowCode+"Hundred"))){ List list = new ArrayList<>(); for (SyncKValueFromLdVo item : tempList){ list.add(item.getHignPrice()); } redisCache.setCacheList(nowCode+"Hundred",list); } tempList.clear(); nowCode = dataArray[0]; } SyncKValueFromLdVo vo = new SyncKValueFromLdVo(); String datetimeStr = dataArray[1]; if (dateFlag){ datetimeStr = dateStr + " " + datetimeStr; } vo.setDate(datetimeStr); vo.setKpPrice(isDecimal(dataArray[2])? new BigDecimal(dataArray[2]) : BigDecimal.ZERO); vo.setHignPrice(isDecimal(dataArray[3])? new BigDecimal(dataArray[3]) : BigDecimal.ZERO); vo.setLowPrice(isDecimal(dataArray[4])? new BigDecimal(dataArray[4]) : BigDecimal.ZERO); vo.setSpPrice(isDecimal(dataArray[5])? new BigDecimal(dataArray[5]) : BigDecimal.ZERO); if (dataArray.length > 6){ vo.setDealNum(isDecimal(dataArray[6])? new BigDecimal(dataArray[6]) : BigDecimal.ZERO); vo.setDealPrice(isDecimal(dataArray[7])? new BigDecimal(dataArray[7]) : BigDecimal.ZERO); } //更新对应产品的缓存100条数据 tempList.add(vo); } //全部执行完成后,将最后一个对象放入redis redisCache.deleteObject(nowCode+dateNum+"KValue"); if (tempList.isEmpty()){ lg.error("K线同步错误,firstLine:【{}】,dateStr:【{}】,nowCode:【{}】,dateNum:【{}】", firstLine, dateStr, nowCode, dateNum); }else{ lg.info("K线同步,firstLine:【{}】,dateStr:【{}】,nowCode:【{}】,dateNum:【{}】", firstLine, dateStr, nowCode, dateNum); } redisCache.setCacheList(nowCode+dateNum+"KValue",tempList); //如果百威数据为null,则进行存入 if(CollectionUtils.isEmpty(redisCache.getCacheList(nowCode+"Hundred"))){ List list = new ArrayList<>(); for (SyncKValueFromLdVo item : tempList){ list.add(item.getHignPrice()); } redisCache.setCacheList(nowCode+"Hundred",list); } // 关闭连接 reader.close(); connection.disconnect(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } private void getKValueFromLdOne(String code,String method,String dateNum,String append,Integer dateType){ try { SimpleDateFormat simpleDateFormat; if (dateType == 1){ simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmm"); }else{ simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); } String urlStr = "http://"+channelA+"/"+method+"?username=673468708&password=8a1576001bea15a3e5906ba3af004392&id="+code+"&period="+dateNum+"&num=-100&datetime="+simpleDateFormat.format(new Date())+append; log.info("获取实时数据,类型为:{},代码为:{},请求地址:{},时间为:{}",method,code,urlStr,dateNum); // 创建 URL 对象 URL url = new URL(urlStr); // 创建 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String firstLine = reader.readLine(); boolean dateFlag = false; String dateStr = ""; if("日期".equals(firstLine.trim())){ dateFlag = true; dateStr = reader.readLine(); firstLine = reader.readLine(); } // 读取 CSV 数据 String line; List result = new ArrayList<>(); while ((line = reader.readLine()) != null) { // 打印每一行数据 String[] dataArray = line.split(","); //单个品种不返回code SyncKValueFromLdVo vo = new SyncKValueFromLdVo(); String datetimeStr = dataArray[0]; if (dateFlag){ datetimeStr = dateStr + " " + datetimeStr; } vo.setDate(datetimeStr); vo.setKpPrice(isDecimal(dataArray[1])? new BigDecimal(dataArray[1]) : BigDecimal.ZERO); vo.setHignPrice(isDecimal(dataArray[2])? new BigDecimal(dataArray[2]) : BigDecimal.ZERO); vo.setLowPrice(isDecimal(dataArray[3])? new BigDecimal(dataArray[3]) : BigDecimal.ZERO); vo.setSpPrice(isDecimal(dataArray[4])? new BigDecimal(dataArray[4]) : BigDecimal.ZERO); if (dataArray.length > 5){ vo.setDealNum(isDecimal(dataArray[5])? new BigDecimal(dataArray[5]) : BigDecimal.ZERO); vo.setDealPrice(isDecimal(dataArray[6])? new BigDecimal(dataArray[6]) : BigDecimal.ZERO); } //更新对应产品的缓存100条数据 result.add(vo); } //完成后将内容放入redis redisCache.deleteObject(code+dateNum+"KValue"); redisCache.setCacheList(code+dateNum+"KValue",result); //如果百威数据为null,则进行存入 if(CollectionUtils.isEmpty(redisCache.getCacheList(code+"Hundred"))){ List list = new ArrayList<>(); for (SyncKValueFromLdVo item : result){ list.add(item.getHignPrice()); } redisCache.setCacheList(code+"Hundred",list); } // 关闭连接 reader.close(); connection.disconnect(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } // private void getKvalueFromMf(String code,Integer dateNum,Integer dateType){ // try { // SimpleDateFormat simpleDateFormat; // Date date = new Date(); // String urlStr = "http://"+channelA+"/"+method+"?username=673468708&password=8a1576001bea15a3e5906ba3af004392&id="+code+"&period="+dateNum+"&num=-100&datetime="+simpleDateFormat.format(new Date())+append; // log.info("获取实时数据,类型为:{},代码为:{},请求地址:{},时间为:{}",method,code,urlStr,dateNum); // // 创建 URL 对象 // URL url = new URL(urlStr); // // // 创建 HTTP 连接 // HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // connection.setRequestMethod("GET"); // // // 获取输入流 // BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // // String firstLine = reader.readLine(); // boolean dateFlag = false; // String dateStr = ""; // if("日期".equals(firstLine.trim())){ // dateFlag = true; // dateStr = reader.readLine(); // firstLine = reader.readLine(); // } // // // 读取 CSV 数据 // String line; // String nowCode = ""; // List tempList = new ArrayList<>(); // while ((line = reader.readLine()) != null) { // 打印每一行数据 // String[] dataArray = line.split(","); // if("".equals(nowCode)){ // nowCode = dataArray[0]; // } // //如果产品代码不等于上一行的产品代码,则证明产品应景更换,将之前集合的数据存入redis,并清空之前的集合 // if (!nowCode.equals(dataArray[0])){ // redisCache.deleteObject(nowCode+dateNum+"KValue"); // redisCache.setCacheList(nowCode+dateNum+"KValue",tempList); // tempList.clear(); // nowCode = dataArray[0]; // } // SyncKValueFromLdVo vo = new SyncKValueFromLdVo(); // String datetimeStr = dataArray[1]; // if (dateFlag){ // datetimeStr = dateStr + " " + datetimeStr; // } // vo.setDate(datetimeStr); // vo.setKpPrice(new BigDecimal(dataArray[2])); // vo.setHignPrice(new BigDecimal(dataArray[3])); // vo.setLowPrice(new BigDecimal(dataArray[4])); // vo.setSpPrice(new BigDecimal(dataArray[5])); // if (dataArray.length > 6){ // vo.setDealNum(Integer.parseInt(dataArray[6])); // vo.setDealPrice(new BigDecimal(dataArray[7])); // } // //更新对应产品的缓存100条数据 // tempList.add(vo); // } // //全部执行完成后,将最后一个对象放入redis // redisCache.deleteObject(nowCode+dateNum+"KValue"); // redisCache.setCacheList(nowCode+dateNum+"KValue",tempList); // // 关闭连接 // reader.close(); // connection.disconnect(); // } catch (Exception e) { // System.out.println(e.getMessage()); // } // } private Integer getPostion(String[] array,String str){ for (int i = 0; i < array.length;i++){ if (str.equals(array[i])){ return i; } } return -1; } private List getCurrentValueFromMfVo(String code){ List result = new ArrayList<>(); try { String urlStr = "https://data.mifengcha.com/api/v3/price?api_key=LUR8GYLFWBADUQINGGY5ZR7QWC2GVMI58RXSUONG&slug="+code; log.info("获取实时数据,类型为:{},代码为:{},请求地址:{},时间为:{}","数字货币",code,urlStr,new Date()); // 创建 URL 对象 URL url = new URL(urlStr); // 创建 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); connection.disconnect(); String repStr = response.toString(); JSONArray jsonArray = JSON.parseArray(repStr); for (int i = 0 ; i < jsonArray.size();i++){ JSONObject object = jsonArray.getJSONObject(i); SyncCurrentValueFromLdVo vo = new SyncCurrentValueFromLdVo(); vo.setCode(object.getString("s")); vo.setPrice(new BigDecimal(object.getString("u"))); vo.setZdf(new BigDecimal(object.getString("c"))); vo.setName(object.getString("S")); //更新对应个产品每秒数据 redisCache.setCacheObject(vo.getCode()+"CurrPrice",vo.getPrice()); redisCache.setCacheObject(vo.getCode()+"CurrZdf",vo.getZdf()); //更新对应产品的缓存100条数据 List list = redisCache.getCacheList(vo.getCode()+"Hundred"); if(list != null && list.size() > 0){ //如果本次获取的价格和上次一样,则不保存 BigDecimal lastPrice = new BigDecimal(list.get(list.size()-1)+""); if (lastPrice.compareTo(vo.getPrice()) != 0){ if(list.size() >= 100){ list.remove(0); } list.add(vo.getPrice()); redisCache.deleteObject(vo.getCode()+"Hundred"); redisCache.setCacheList(vo.getCode()+"Hundred",list); } } result.add(vo); } return result; }catch (Exception e){ System.out.println("调用方法异常:====="+e.getMessage()); System.out.println(e.getMessage()); e.printStackTrace(); } return result; } public void getKValueFromMFVO(String oldCode,String code,Integer type,Integer dateNum){ //获取对应的开始时间和结束时间 Calendar calendar = Calendar.getInstance(); Long endTime = calendar.getTimeInMillis(); String interval ; SimpleDateFormat simpleDateFormat ; Long startTime ; String fh = "d"; if (type == 1){ Integer nums = 0 - ((100 * dateNum) + 10); calendar.add(Calendar.MINUTE,nums); startTime = calendar.getTimeInMillis(); interval = dateNum + "m"; simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); if (dateNum == 60){ interval = "1h"; simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH"); } fh = dateNum+""; }else{ calendar.add(Calendar.DAY_OF_YEAR, -100); startTime = calendar.getTimeInMillis(); interval = "1d"; simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); } String[] codeArray = code.split(","); String[] oldCodeArray = oldCode.split(","); for(int j = 0; j < codeArray.length;j++){ try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println(e.getMessage()); } //分批请求 String urlStr = "https://data.mifengcha.com/api/v3/kline?api_key=LUR8GYLFWBADUQINGGY5ZR7QWC2GVMI58RXSUONG&desc="+codeArray[j]+"&interval="+interval+"&end="+endTime+"&market=Binance&start="+startTime; try { URL url = new URL(urlStr); // 创建 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); // 读取 CSV 数据 String line; List result = new ArrayList<>(); StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { // 打印每一行数据 response.append(line); } String reponseStr = response.toString(); JSONArray jsonArray = JSON.parseArray(reponseStr); for(int i = 0; i < jsonArray.size(); i++){ if (i == 100){ break; } JSONObject object = jsonArray.getJSONObject(i); SyncKValueFromLdVo vo = new SyncKValueFromLdVo(); vo.setDate(simpleDateFormat.format(new Date(object.getLong("T")))); vo.setKpPrice(new BigDecimal(object.getString("o"))); vo.setHignPrice(new BigDecimal(object.getString("h"))); vo.setLowPrice(new BigDecimal(object.getString("l"))); vo.setSpPrice(new BigDecimal(object.getString("c"))); vo.setDealNum(new BigDecimal(object.getString("v"))); //更新对应产品的缓存100条数据 result.add(vo); } System.out.println("最后结果:"+result); System.out.println("总行数:"+result.size()); //完成后将内容放入redis redisCache.deleteObject(oldCodeArray[j]+fh+"KValue"); redisCache.setCacheList(oldCodeArray[j]+fh+"KValue",result); //如果百威数据为null,则进行存入 if(CollectionUtils.isEmpty(redisCache.getCacheList(oldCodeArray[j]+"Hundred"))){ List list = new ArrayList<>(); for (SyncKValueFromLdVo item : result){ list.add(item.getHignPrice()); } redisCache.setCacheList(oldCodeArray[j]+"Hundred",list); } // 关闭连接 reader.close(); connection.disconnect(); }catch (Exception e){ System.out.println(e.getMessage()); e.printStackTrace(); } } } private boolean isDecimal(String str){ return str.matches("-?\\d+(\\.\\d+)?"); // 匹配整数或小数格式 } private List generateFluctuatedValues(BigDecimal baseValue, int numberOfValues) { List fluctuatedValues = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < numberOfValues; i++) { BigDecimal fluctuation = baseValue.multiply(new BigDecimal(0.002)); // 计算波动范围 double randomFactor = random.nextDouble(); // 生成随机因子(0到1之间的随机数) BigDecimal randomValue = fluctuation.multiply(new BigDecimal(randomFactor)); // 计算波动值 BigDecimal newValue = baseValue.add(randomValue); // 计算新值 fluctuatedValues.add(newValue); // 将新值添加到列表中 } return fluctuatedValues; } }