ybf

ybf


1.5各交易所的各币种的平均价代码参考

<p>/**</p> <ul> <li>各交易所的各币种的平均价</li> <li> </li> <li> <p>@autho **/ @Slf4j @Service public class CoinAvgExchangePrice implements CoinPriceFetchService {</p> <p>@Autowired private BaseExchangeRateServiceImpl baseExchangeRateService; @Autowired private CoinDisposeExchangePrice coinDisposeExchangePrice;</p> <p>@Override public void fetchPriceJsonAndSave() { try { long startTime = System.currentTimeMillis(); /<em> 从数据库获取基础汇率数据</em>/ List<BaseExchangeRate> list = getBaseExchangeRateList(); /<em>key为apiInfoId</em>/ Map&lt;Long, BaseExchangeRate&gt; sourceMap = listTomap(list); if (CollectionUtil.isEmpty(sourceMap)) { return; } log.info(&quot;sourceMap:\n{}&quot;, JacksonUtils.toJson(sourceMap)); /<em>key为apiInfoId,value为计算后的平均值</em>/ List<BaseExchangeRate> avgList = getAvgPrice(sourceMap, startTime); log.info(&quot;各交易所的各币种的平均价:{}&quot;, avgList); save(avgList); /<em> 三大交易所USD的平均价处理及转换CNY汇率</em>/ disposeUsdAvg();</p> <pre><code>} catch (Exception e) { log.error("计算各交易所的各币种的平均价失败:\n{}", e.getMessage()); }</code></pre> <p>}</p> <p>private void disposeUsdAvg() { List<BaseExchangeRate> list = baseExchangeRateService.list(new LambdaQueryWrapper<BaseExchangeRate>() .ge(BaseExchangeRate::getApiInfoId, ApiInfoEnum.BNB_USDT_USD_FIRST_SELL_PRICE.getId()) .le(BaseExchangeRate::getApiInfoId, ApiInfoEnum.OKEX_USD_USDT_FIRST_BUY_PRICE.getId()) .eq(BaseExchangeRate::getStatus, 1) ); if(list==null||list.isEmpty()){ return; } BigDecimal buySumPrice = new BigDecimal(&quot;0&quot;); BigDecimal sellSumPrice = new BigDecimal(&quot;0&quot;); //计算平均值 for (BaseExchangeRate b : list) { if(TradeDirectionEnum.BUY_FROM_USER.getCode().equals(b.getDirection())){ buySumPrice = NumberUtil.add(b.getPrice(),buySumPrice); continue; } if(TradeDirectionEnum.SELL_TO_USER.getCode().equals(b.getDirection())){ sellSumPrice = NumberUtil.add(b.getPrice(),sellSumPrice); } } BigDecimal buyAvgPrice = buySumPrice.divide(new BigDecimal(&quot;3&quot;), 8, RoundingMode.CEILING); BigDecimal sellAvgPrice = sellSumPrice.divide(new BigDecimal(&quot;3&quot;), 8, RoundingMode.CEILING); newInstanceAndToSave(TradeDirectionEnum.BUY_FROM_USER,buyAvgPrice); newInstanceAndToSave(TradeDirectionEnum.SELL_TO_USER,sellAvgPrice); }</p> <p>private void newInstanceAndToSave(TradeDirectionEnum buyOrSell, BigDecimal avgPrice) { BaseExchangeRateHistoryDTO baseExchangeRateHistoryDTO = new BaseExchangeRateHistoryDTO(); baseExchangeRateHistoryDTO.setCoinType(AssetType.USDT); baseExchangeRateHistoryDTO.setPriceTrading(RateTradingEnum.USD_USDT); baseExchangeRateHistoryDTO.setPriceUnit(AssetType.USD); baseExchangeRateHistoryDTO.setDuration(0L); baseExchangeRateHistoryDTO.setResponse(&quot;&quot;); baseExchangeRateHistoryDTO.setPrice(avgPrice); if(TradeDirectionEnum.BUY_FROM_USER.equals(buyOrSell)){ baseExchangeRateHistoryDTO.setDirection(TradeDirectionEnum.BUY_FROM_USER.getCode()); baseExchangeRateHistoryDTO.setApiInfo(ApiInfoEnum.OTC_CNY_USDT_AVG_FIRST_BUY_PRICE); }else{ baseExchangeRateHistoryDTO.setDirection(TradeDirectionEnum.SELL_TO_USER.getCode()); baseExchangeRateHistoryDTO.setApiInfo(ApiInfoEnum.OTC_CNY_USDT_AVG_FIRST_SELL_PRICE); } baseExchangeRateHistoryDTO.setApiSource(RateSourceEnum.SYSTEM); log.info(&quot;disposeUsdAvg-baseExchangeRateHistoryDTO: {}&quot;, JacksonUtils.toJson(baseExchangeRateHistoryDTO)); baseExchangeRateService.mergeBaseExchangeRate(baseExchangeRateHistoryDTO, true);</p> <pre><code>//汇率转换及入库 coinDisposeExchangePrice.fetchPriceJsonAndSave(AssetType.USD.getSymbol(), RateSourceEnum.SYSTEM.getMsg());</code></pre> <p>}</p> <p>private void save(List<BaseExchangeRate> avgList) { if (CollectionUtil.isEmpty(avgList)) { return; }</p> <pre><code>LocalDateTime updAt = LocalDateTime.now(); List&lt;Long&gt; ids = new ArrayList&lt;&gt;(); for (BaseExchangeRate item : avgList) { item.setUpdatedAt(updAt); ids.add(item.getId()); } List&lt;BaseExchangeRate&gt; historyList = this.baseExchangeRateService.listByIds(ids); baseExchangeRateService.saveAvgBaseExchangeRateToHistory(historyList); baseExchangeRateService.updateBatchById(avgList);</code></pre> <p>}</p> <p>private List<BaseExchangeRate> getBaseExchangeRateList() { /<em>ApiInfoId 12到27 为币汇 币安 火币 okex 的usdt,btc的buy一价和sell一价; ApiInfoId 28和29 对本业务无用,要排除掉 ApiInfoId 30到37 为币汇 币安 火币 okex 的usdt,btc的平均价</em>/ return baseExchangeRateService.list( new LambdaQueryWrapper<BaseExchangeRate>() .ge(BaseExchangeRate::getApiInfoId, 12L) .le(BaseExchangeRate::getApiInfoId, 37L) //.eq(BaseExchangeRate::getStatus, 1) ); }</p> <p>private List<BaseExchangeRate> getAvgPrice(Map&lt;Long, BaseExchangeRate&gt; sourceMap, long startTime) { long duration = System.currentTimeMillis() - startTime; List<BaseExchangeRate> avgList = new ArrayList<>();</p> <pre><code>/* 币汇 usdt*/ fillAvgList(sourceMap, duration, ApiInfoEnum.BH_OTC_USDT_FIRST_BUY_PRICE, ApiInfoEnum.BH_OTC_USDT_FIRST_SELL_PRICE, ApiInfoEnum.BH_OTC_USDT_AVG_PRICE, avgList); /* 币汇 btc*/ fillAvgList(sourceMap, duration, ApiInfoEnum.BH_OTC_BTC_FIRST_BUY_PRICE, ApiInfoEnum.BH_OTC_BTC_FIRST_SELL_PRICE, ApiInfoEnum.BH_OTC_BTC_AVG_PRICE, avgList); /* 币安 usdt */ fillAvgList(sourceMap, duration, ApiInfoEnum.BNB_OTC_USDT_FIRST_BUY_PRICE, ApiInfoEnum.BNB_OTC_USDT_FIRST_SELL_PRICE, ApiInfoEnum.BNB_OTC_USDT_AVG_PRICE, avgList); /* 币安 btc */ fillAvgList(sourceMap, duration, ApiInfoEnum.BNB_OTC_BTC_FIRST_BUY_PRICE, ApiInfoEnum.BNB_OTC_BTC_FIRST_SELL_PRICE, ApiInfoEnum.BNB_OTC_BTC_AVG_PRICE, avgList); /* 火币 usdt*/ fillAvgList(sourceMap, duration, ApiInfoEnum.HT_OTC_USDT_FIRST_BUY_PRICE, ApiInfoEnum.HT_OTC_USDT_FIRST_SELL_PRICE, ApiInfoEnum.HT_OTC_USDT_AVG_PRICE, avgList); /* 火币 btc*/ fillAvgList(sourceMap, duration, ApiInfoEnum.HT_OTC_BTC_FIRST_BUY_PRICE, ApiInfoEnum.HT_OTC_BTC_FIRST_SELL_PRICE, ApiInfoEnum.HT_OTC_BTC_AVG_PRICE, avgList); /* okex usdt*/ fillAvgList(sourceMap, duration, ApiInfoEnum.OKEX_OTC_USDT_FIRST_BUY_PRICE, ApiInfoEnum.OKEX_OTC_USDT_FIRST_SELL_PRICE, ApiInfoEnum.OKEX_OTC_USDT_AVG_PRICE, avgList); /* okex btc*/ fillAvgList(sourceMap, duration, ApiInfoEnum.OKEX_OTC_BTC_FIRST_BUY_PRICE, ApiInfoEnum.OKEX_OTC_BTC_FIRST_SELL_PRICE, ApiInfoEnum.OKEX_OTC_BTC_AVG_PRICE, avgList); return avgList;</code></pre> <p>}</p> <p>private void fillAvgList(Map&lt;Long, BaseExchangeRate&gt; sourceMap, long duration, ApiInfoEnum buy, ApiInfoEnum sell, ApiInfoEnum avg, List<BaseExchangeRate> avgList) { log.info(&quot;{}&quot;, avg); BaseExchangeRate b = sourceMap.get(avg.getId()); if (null == b) { log.warn(&quot;api_info_id:{}对应的记录不存在&quot;, avg); return; } b.setStatus(Integer.parseInt(BaseRateEnum.OK.getCode())); if (sourceMap.containsKey(buy.getId()) &amp;&amp; sourceMap.containsKey(sell.getId())) { BigDecimal buyPrice = sourceMap.get(buy.getId()).getPrice(); BigDecimal sellPrice = sourceMap.get(sell.getId()).getPrice(); BigDecimal sum = buyPrice.add(sellPrice); BigDecimal avgPrice = sum.divide(new BigDecimal(&quot;2&quot;), 8, RoundingMode.CEILING);</p> <pre><code> b.setPrice(avgPrice); b.setDuration(duration); BaseExchangeRate rate=sourceMap.get(buy.getId()); b.setPriceTrading(rate.getCoinType().equals(AssetType.USDT.getCode()) ? RateTradingEnum.CNY_USDT.getCode():RateTradingEnum.CNY_BTC.getCode()); b.setApiSource(RateSourceEnum.SYSTEM.getMsg()); //买一价或卖一价为不可用,则平均价不可用 if(StatusEnum.NO.getCode().compareTo(sourceMap.get(buy.getId()).getStatus())==0|| StatusEnum.NO.getCode().compareTo(sourceMap.get(sell.getId()).getStatus())==0|| baseExchangeRateService.isOverRateLimitThreshold(b)){ b.setStatus(Integer.parseInt(BaseRateEnum.NO.getCode())); } avgList.add(b); }else{ if(baseExchangeRateService.isOverRateLimitThreshold(b)){ b.setStatus(Integer.parseInt(BaseRateEnum.NO.getCode())); } avgList.add(b); }</code></pre> <p>}</p> <p>private Map&lt;Long, BaseExchangeRate&gt; listTomap(List<BaseExchangeRate> priceList) { if (CollectionUtil.isEmpty(priceList)) { return null; } Map&lt;Long, BaseExchangeRate&gt; map = new HashMap<>(); for (BaseExchangeRate ber : priceList) { if (ber.getApiInfoId().equals(28L) || ber.getApiInfoId().equals(29L)) { continue; } map.put(ber.getApiInfoId(), ber); } return map; }</p> </li> </ul> <p>}</p>

页面列表

ITEM_HTML