ybf

ybf


1.8处理抓取汇率数据(有的网站数据需要做汇率时效性处理)

<p>/**</p> <ul> <li>处理抓取汇率数据</li> <li> <p>@author **/ @Slf4j @Service public class DisposeRateDataService {</p> <p>@Autowired private ExchangeRateValidSettingsServiceImpl exchangeRateValidSettingsService; @Autowired private BaseExchangeRateServiceImpl baseExchangeRateService; @Autowired private StringRedisTemplate stringRedisTemplate;</p> <p>/**</p> <ul> <li>处理抓取汇率数据 */ public CommonExchageResp disposeRateData(PatformKeyEnum patformKeyEnum, TradeDirectionEnum tradeDirectionEnum, List<CommonExchageResp> rateDataList){ //查询汇率有效性配置数据 ExchangeRateValidSettingsPO exchangeRateValidSettingsPO = getExchangeRateValidSettings(tradeDirectionEnum.getCode()); log.info(&quot;处理抓取汇率数据 exchangeRateValidSettingsPO=&quot;+ JacksonUtils.toJson(exchangeRateValidSettingsPO)); if(Objects.isNull(exchangeRateValidSettingsPO)){ log.info(&quot;处理抓取汇率数据 查询汇率有效性配置为空&quot;); return null; } if(rateDataList==null||rateDataList.size()==0){ log.info(&quot;处理抓取汇率数据 要处理的数据为空&quot;); return null; } return disposeData(rateDataList, exchangeRateValidSettingsPO, patformKeyEnum); }</li> </ul> <p>private ExchangeRateValidSettingsPO getExchangeRateValidSettings(Integer type) { ExchangeRateValidSettingsPO exchangeRateValidSettingsPO = null; String key = RedisConstantKey.EXCHANGE_RATE_VALID_SETTINGS +type; if(stringRedisTemplate.hasKey(key)){ log.info(&quot;处理抓取汇率数据 getExchangeRateValidSettings从redis取&quot;); exchangeRateValidSettingsPO = JSONObject.parseObject(stringRedisTemplate.opsForValue().get(key), ExchangeRateValidSettingsPO.class); }else{ log.info(&quot;处理抓取汇率数据 getExchangeRateValidSettings从数据库取&quot;); LambdaQueryWrapper<ExchangeRateValidSettingsPO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ExchangeRateValidSettingsPO::getType, type); exchangeRateValidSettingsPO = exchangeRateValidSettingsService.getOne(queryWrapper); stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(exchangeRateValidSettingsPO), 1, TimeUnit.HOURS); } return exchangeRateValidSettingsPO; }</p> <p>private CommonExchageResp disposeData(List<CommonExchageResp> rateDataList,ExchangeRateValidSettingsPO exchangeRateValidSettingsPO,PatformKeyEnum patformKeyEnum) { CommonExchageResp commonExchageResp = null; List<CommonExchageResp> dataList = new ArrayList<>(); for (CommonExchageResp data:rateDataList) { //交易限额最低值(人民币)&gt; 5万 if(data.getDownLimit().compareTo(new BigDecimal(Integer.parseInt(exchangeRateValidSettingsPO.getMin().toString()))) &gt; 0){ log.info(&quot;处理抓取汇率数据 最低限额 &gt; 汇率有效性配置值 downLimit={},min={}&quot; ,data.getDownLimit().toString(), exchangeRateValidSettingsPO.getMin().toString()); continue; } //交易限额最高值于最低值(人民币)的差 &lt; 5000 if(data.getUpLimit().subtract(data.getDownLimit()).compareTo( new BigDecimal(Integer.parseInt(exchangeRateValidSettingsPO.getDiff().toString()))) &lt; 0){ log.info(&quot;处理抓取汇率数据 交易限额最高值于最低值(人民币)的差 &lt; 汇率有效性配置值 upLimit-downLimit={}, diff={}&quot; ,data.getUpLimit().subtract(data.getDownLimit()).toString() ,exchangeRateValidSettingsPO.getDiff().toString()); continue; } //挂单人成交量 &lt; 20 if(data.getTradingVolume()&lt;exchangeRateValidSettingsPO.getTrading()){ log.info(&quot;处理抓取汇率数据 挂单人成交量 &lt; 汇率有效性配置值 tradingVolume={}, trading={}&quot; ,data.getTradingVolume().toString(),exchangeRateValidSettingsPO.getTrading().toString()); continue; } //挂单人成交率 &lt; 90% if (data.getCloseRate().multiply(Constant.HUNDRED).compareTo(exchangeRateValidSettingsPO.getTradingRate()) &lt; 0) { log.info(&quot;处理抓取汇率数据 挂单人成交率 &lt; 汇率有效性配置值 closeRate={}, tradingRate={}&quot; ,data.getCloseRate().multiply(Constant.HUNDRED).toString(), exchangeRateValidSettingsPO.getTradingRate().toString()); continue; } dataList.add(data); } log.info(&quot;处理抓取汇率数据 筛选数据count={}&quot;, dataList.size()); if(dataList.size()&lt; Constant.RATE_VALID_NUM){ log.info(&quot;处理抓取汇率数据 筛选数据小于&quot;+Constant.RATE_VALID_NUM+&quot;条&quot;); //芒果告警 baseExchangeRateService.sendRateWarnMangoMsg(patformKeyEnum.getPatformName(), patformKeyEnum.getKey()); return null; } //可用数据列表的价格平均值 BigDecimal priceSum = dataList.stream().map(CommonExchageResp::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal priceAvg = priceSum.divide(new BigDecimal(dataList.size()), 8, RoundingMode.CEILING); log.info(&quot;处理抓取汇率数据 筛选数据priceAvg={}&quot;, priceAvg.toString()); //从满足的数据List里取一条最可靠的数据 for (CommonExchageResp c:dataList) { //当前一条汇率金额/所有可用数据平均值 计算结果是否大于1% 不可用 if(c.getPrice().divide(priceAvg, 4, RoundingMode.CEILING).subtract(BigDecimal.ONE).abs() .compareTo(exchangeRateValidSettingsPO.getDiffRate()) &lt;= 0){ log.info(&quot;处理抓取汇率数据 当前一条汇率金额/所有可用数据平均值-1={},diffRate={}&quot;,c.getPrice() .divide(priceAvg, 4, RoundingMode.CEILING).subtract(BigDecimal.ONE).abs().toString(), exchangeRateValidSettingsPO.getDiffRate().toString()); log.info(&quot;处理抓取汇率数据 可用数据c=&quot;+JacksonUtils.toJson(c)); commonExchageResp = c; break; } } return commonExchageResp; } }</p> </li> </ul>

页面列表

ITEM_HTML