25 files modified
1 files added
| | |
| | | */ |
| | | @ApiOperation(value = "kline初始化") |
| | | @GetMapping(value = {"klineInit.action", "klineInitConfig.action"}) |
| | | public Result<String> klineInit(@RequestParam(required = true) String paraInitSymbol ) throws Exception { |
| | | public Result<String> klineInit(@RequestParam(required = false) String paraInitSymbol ) throws Exception { |
| | | |
| | | |
| | | |
| | |
| | | if (currentValue == null) { |
| | | marketQuotationsAdjust.setNewPrice(Arith.str(realtime.getClose(), decimal)); |
| | | } else { |
| | | marketQuotationsAdjust.setNewPrice(realtime.getClose().subtract(currentValue).setScale(decimal, RoundingMode.HALF_UP).toPlainString()); |
| | | marketQuotationsAdjust.setNewPrice(realtime.getClose().subtract(currentValue).setScale(decimal, RoundingMode.DOWN).toPlainString()); |
| | | } |
| | | marketQuotationsAdjust.setPips(Arith.str(item.getPips(), decimal)); |
| | | marketQuotationsAdjust.setAfterValue(Arith.str(realtime.getClose(), decimal)); |
| New file |
| | |
| | | package com.yami.trading.admin.task; |
| | | |
| | | import com.yami.trading.bean.item.domain.Item; |
| | | import com.yami.trading.common.domain.Result; |
| | | import com.yami.trading.common.exception.YamiShopBindException; |
| | | import com.yami.trading.huobi.data.internal.KlineInitService; |
| | | import com.yami.trading.huobi.data.internal.KlineService; |
| | | import com.yami.trading.service.item.ItemService; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.concurrent.atomic.AtomicBoolean; |
| | | import java.util.concurrent.locks.Lock; |
| | | import java.util.concurrent.locks.ReentrantLock; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @program: trading-order-master |
| | | * @description: |
| | | * @create: 2025-10-30 15:49 |
| | | **/ |
| | | @Component |
| | | public class KineTask { |
| | | |
| | | private final AtomicBoolean syncINStockData = new AtomicBoolean(false); |
| | | |
| | | private final Lock syncINStockDataLock = new ReentrantLock(); |
| | | |
| | | |
| | | @Autowired |
| | | private KlineInitService klineInitService ; |
| | | @Autowired |
| | | private ItemService itemService; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 同步系统所需要的股票 |
| | | */ |
| | | @Scheduled(cron = "0 0 0/1 * * ?") |
| | | public void syncINStockData() { |
| | | if (syncINStockData.get()) { // 判断任务是否在处理中 |
| | | return; |
| | | } |
| | | if (syncINStockDataLock.tryLock()) { |
| | | try { |
| | | syncINStockData.set(true); // 设置处理中标识为true |
| | | |
| | | String symbols = itemService.list().stream().map(Item::getSymbol).collect(Collectors.joining(",")); |
| | | try { |
| | | klineInitService.klineInit(symbols); |
| | | }catch (Exception e){ |
| | | throw new YamiShopBindException("定时任务k线图初始化失败"); |
| | | } |
| | | } finally { |
| | | syncINStockDataLock.unlock(); |
| | | syncINStockData.set(false); // 设置处理中标识为false |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | map.put("high", realtime.getHigh()); |
| | | map.put("low", realtime.getLow()); |
| | | if( realtime.getVolume() != null){ |
| | | map.put("volume", realtime.getVolume().setScale(2, RoundingMode.HALF_UP)); |
| | | map.put("volume", realtime.getVolume().setScale(2, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("volume", realtime.getVolume()); |
| | | } |
| | | if( realtime.getAmount() != null){ |
| | | map.put("amount", realtime.getAmount().setScale(2, RoundingMode.HALF_UP)); |
| | | map.put("amount", realtime.getAmount().setScale(2, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("amount", realtime.getAmount()); |
| | | } |
| | |
| | | if (!map.containsKey(key)) { |
| | | map.put(key, stringObjectMap.get(key)); |
| | | BigDecimal open = realtime.getClose(); |
| | | map.put("open", open != null ? open.setScale(decimal, RoundingMode.HALF_UP) : null); |
| | | map.put("open", open != null ? open.setScale(decimal, RoundingMode.DOWN) : null); |
| | | BigDecimal close = realtime.getClose(); |
| | | map.put("close", close != null ? close.setScale(decimal, RoundingMode.HALF_UP) : null); |
| | | map.put("close", close != null ? close.setScale(decimal, RoundingMode.DOWN) : null); |
| | | BigDecimal high = realtime.getHigh(); |
| | | map.put("high", high != null ? high.setScale(decimal, RoundingMode.HALF_UP) : null); |
| | | map.put("high", high != null ? high.setScale(decimal, RoundingMode.DOWN) : null); |
| | | BigDecimal low = realtime.getLow(); |
| | | map.put("low", low != null ? low.setScale(decimal, RoundingMode.HALF_UP) : null); |
| | | map.put("low", low != null ? low.setScale(decimal, RoundingMode.DOWN) : null); |
| | | } |
| | | } |
| | | |
| | |
| | | percent = BigDecimal.ZERO; |
| | | } else { |
| | | chg = close.subtract(open); |
| | | percent = chg.divide(open, 10, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); |
| | | percent = chg.divide(open, 10, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); |
| | | ; |
| | | } |
| | | model.setKLineData(JSONObject.toJSONString(klines)); |
| | |
| | | percent = BigDecimal.ZERO; |
| | | } else { |
| | | chg = close.subtract(open); |
| | | percent = chg.divide(open, 10, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); |
| | | percent = chg.divide(open, 10, RoundingMode.DOWN).multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); |
| | | ; |
| | | } |
| | | robotModel.setKLineData(JSONObject.toJSONString(klines)); |
| | |
| | | if(content.contains("null")){ |
| | | return "-"; |
| | | } |
| | | return new BigDecimal(content).setScale(scale, RoundingMode.HALF_UP).toPlainString(); |
| | | return new BigDecimal(content).setScale(scale, RoundingMode.DOWN).toPlainString(); |
| | | } |
| | | |
| | | public static String formatMoney(String moneyStr) { |
| | |
| | | Map<String, String> data = new HashMap<String, String>(); |
| | | DecimalFormat df2 = new DecimalFormat("#.##"); |
| | | // 向下取整 |
| | | df2.setRoundingMode(RoundingMode.HALF_UP); |
| | | df2.setRoundingMode(RoundingMode.DOWN); |
| | | String partyId = SecurityUtils.getCurrentUserId(); |
| | | if ("".equals(partyId) || null == partyId) { |
| | | // 当前外汇资产 |
| | |
| | | map.put("price", order.getPrice()); |
| | | map.put("stop_price_profit", order.getStopPriceProfit()); |
| | | if( order.getStopPriceLoss() !=null) { |
| | | map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.HALF_UP)); |
| | | map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("stop_price_loss", null); |
| | | |
| | | } |
| | | map.put("price_type", order.getOrderPriceType()); |
| | | map.put("state", order.getState()); |
| | | map.put("amount", order.getVolume().multiply(order.getUnitAmount()).setScale(4, RoundingMode.HALF_UP)); |
| | | map.put("amount", order.getVolume().multiply(order.getUnitAmount()).setScale(4, RoundingMode.DOWN)); |
| | | map.put("amount_open", order.getVolumeOpen().multiply(order.getUnitAmount())); |
| | | map.put("fee", order.getFee()); |
| | | map.put("deposit", order.getDeposit()); |
| | |
| | | Realtime realtime = realtimeMap.get(data.getSymbol()); |
| | | BigDecimal mark_price = realtime.getClose(); |
| | | if(data.getDirection().equalsIgnoreCase("buy")){ |
| | | expectedProfitAndLoss += data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.HALF_UP)).doubleValue(); |
| | | expectedProfitAndLoss += data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.DOWN)).doubleValue(); |
| | | }else{ |
| | | expectedProfitAndLoss -= data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.HALF_UP)).doubleValue(); |
| | | expectedProfitAndLoss -= data.getVolume().multiply(data.getLeverRate()).multiply(data.getUnitAmount()).multiply(mark_price.subtract(data.getPrice()).divide(data.getPrice(), 4, RoundingMode.DOWN)).doubleValue(); |
| | | } |
| | | //手续费 |
| | | double fee = Double.parseDouble(data.getFee().toString()); |
| | |
| | | for (MoneyLog log : (List<MoneyLog>) page.getRecords()) { |
| | | log.setContent_type(log.getContentType()); |
| | | log.setWallet_type(log.getWalletType()); |
| | | log.setAmount_after(log.getAmountAfter().setScale(4, RoundingMode.HALF_UP)); |
| | | log.setAmount_before(log.getAmountBefore().setScale(4, RoundingMode.HALF_UP)); |
| | | log.setAmount_after(log.getAmountAfter().setScale(4, RoundingMode.DOWN)); |
| | | log.setAmount_before(log.getAmountBefore().setScale(4, RoundingMode.DOWN)); |
| | | if (Constants.MONEYLOG_CONTENT_FINANCE_PROFIT.equals(log.getContentType())) { |
| | | log.setAmount(log.getAmount().add(new BigDecimal(amount))); |
| | | |
| | |
| | | map.put("decimals", decimal); |
| | | map.put("ts", ts); |
| | | map.put("current_time", kline.getCurrentTime()); |
| | | map.put("open", open.setScale(decimal, RoundingMode.HALF_UP)); |
| | | map.put("close", close.setScale(decimal, RoundingMode.HALF_UP)); |
| | | map.put("high", high.setScale(decimal, RoundingMode.HALF_UP)); |
| | | map.put("low", low.setScale(decimal, RoundingMode.HALF_UP)); |
| | | map.put("open", open.setScale(decimal, RoundingMode.DOWN)); |
| | | map.put("close", close.setScale(decimal, RoundingMode.DOWN)); |
| | | map.put("high", high.setScale(decimal, RoundingMode.DOWN)); |
| | | map.put("low", low.setScale(decimal, RoundingMode.DOWN)); |
| | | map.put("volume", kline.getVolume()); |
| | | list.add(map); |
| | | } |
| | |
| | | d.setType(bySymbol.getType()); |
| | | d.setName(bySymbol.getName()); |
| | | Integer decimals = bySymbol.getDecimals(); |
| | | d.setClose(d.getClose().setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setOpen(d.getOpen().setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setHigh(d.getHigh().setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setLow(d.getLow().setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setClose(d.getClose().setScale(decimals, RoundingMode.DOWN)); |
| | | d.setOpen(d.getOpen().setScale(decimals, RoundingMode.DOWN)); |
| | | d.setHigh(d.getHigh().setScale(decimals, RoundingMode.DOWN)); |
| | | d.setLow(d.getLow().setScale(decimals, RoundingMode.DOWN)); |
| | | BigDecimal bigDecimal = BigDecimal.valueOf(1, decimals); |
| | | d.setAsk(d.getClose().add(bigDecimal).setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setBid(d.getClose().subtract(bigDecimal).setScale(decimals, RoundingMode.HALF_UP)); |
| | | d.setAsk(d.getClose().add(bigDecimal).setScale(decimals, RoundingMode.DOWN)); |
| | | d.setBid(d.getClose().subtract(bigDecimal).setScale(decimals, RoundingMode.DOWN)); |
| | | if(d.getVolume()!=null){ |
| | | d.setVolume(d.getVolume().setScale(2, RoundingMode.HALF_UP)); |
| | | d.setVolume(d.getVolume().setScale(2, RoundingMode.DOWN)); |
| | | } |
| | | if(d.getAmount()!=null){ |
| | | d.setAmount(d.getAmount().setScale(2, RoundingMode.HALF_UP)); |
| | | d.setAmount(d.getAmount().setScale(2, RoundingMode.DOWN)); |
| | | } |
| | | d.setSymbolData(bySymbol.getSymbolData()); |
| | | |
| | |
| | | if(unitAmount == null){ |
| | | unitAmount = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.DOWN); |
| | | return bigDecimal1.toPlainString(); |
| | | } |
| | | |
| | |
| | | if(unitAmount == null){ |
| | | unitAmount = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.DOWN); |
| | | return bigDecimal2.toPlainString(); |
| | | } |
| | | |
| | |
| | | if(unitAmount == null){ |
| | | unitAmount = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal bigDecimal1 = volume.multiply(unitAmount).setScale(2, RoundingMode.DOWN); |
| | | BigDecimal bigDecimal2 = volumeOpen.multiply(unitAmount).setScale(2, RoundingMode.DOWN); |
| | | return bigDecimal1.toPlainString()+"/"+bigDecimal2.toPlainString(); |
| | | } |
| | | |
| | |
| | | if(depositOpen == null){ |
| | | depositOpen = BigDecimal.ZERO; |
| | | } |
| | | return deposit.setScale(2, RoundingMode.HALF_UP).toPlainString()+"/"+depositOpen.setScale(2, RoundingMode.HALF_UP).toPlainString(); |
| | | return deposit.setScale(2, RoundingMode.DOWN).toPlainString()+"/"+depositOpen.setScale(2, RoundingMode.DOWN).toPlainString(); |
| | | } |
| | | } |
| | |
| | | return BigDecimal.ZERO; |
| | | |
| | | } |
| | | BigDecimal changeRatio = close.subtract(open).divide(open, 10, RoundingMode.HALF_UP); |
| | | BigDecimal changeRatio = close.subtract(open).divide(open, 10, RoundingMode.DOWN); |
| | | changeRatio = changeRatio.multiply(new BigDecimal(100)).setScale(2, RoundingMode.DOWN); |
| | | return changeRatio; |
| | | |
| | |
| | | } |
| | | |
| | | public BigDecimal getNetChange() { |
| | | BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.HALF_UP); |
| | | BigDecimal netChange = close.multiply(getChangeRatio()).divide(new BigDecimal(100), 10, RoundingMode.DOWN); |
| | | netChange = netChange.setScale(4, RoundingMode.DOWN); |
| | | return netChange; |
| | | } |
| | |
| | | |
| | | |
| | | public void divide(){ |
| | | this.setProfitRatio(profitRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); |
| | | this.setProfitRatioMax(profitRatioMax.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP)); |
| | | this.setUnitFee(unitFee.divide(BigDecimal.valueOf(100),2, RoundingMode.HALF_UP)); |
| | | this.setProfitRatio(profitRatio.divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN)); |
| | | this.setProfitRatioMax(profitRatioMax.divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN)); |
| | | this.setUnitFee(unitFee.divide(BigDecimal.valueOf(100),2, RoundingMode.DOWN)); |
| | | } |
| | | |
| | | } |
| | |
| | | AdjustmentValueCache.getDelayValue().remove(symbol); |
| | | } else { |
| | | // 本次调整值 |
| | | BigDecimal currentValue_frequency = delayValue.getValue().divide(new BigDecimal(frequency), decimal, RoundingMode.HALF_UP); |
| | | BigDecimal currentValue_frequency = delayValue.getValue().divide(new BigDecimal(frequency), decimal, RoundingMode.DOWN); |
| | | |
| | | if (currentValue == null) { |
| | | AdjustmentValueCache.getCurrentValue().put(symbol, currentValue_frequency); |
| | |
| | | currentValue = AdjustmentValueCache.getCurrentValue().get(realtime.getSymbol()); |
| | | |
| | | if (currentValue != null && currentValue.compareTo(BigDecimal.ZERO) != 0) { |
| | | realtime.setClose(realtime.getClose().add(currentValue).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(realtime.getClose().add(currentValue).setScale(decimal, RoundingMode.DOWN)); |
| | | BigDecimal ask = realtime.getAsk(); |
| | | if(ask!=null){ |
| | | realtime.setAsk(ask.add(currentValue).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setAsk(ask.add(currentValue).setScale(decimal, RoundingMode.DOWN)); |
| | | } |
| | | BigDecimal bid = realtime.getBid(); |
| | | if(bid!=null){ |
| | | realtime.setBid(bid.add(currentValue).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setBid(bid.add(currentValue).setScale(decimal, RoundingMode.DOWN)); |
| | | } |
| | | // realtime.setVolume(Arith.add(realtime.getVolume(), Arith.mul(Arith.div(currentValue, realtime.getClose()), realtime.getVolume()))); |
| | | // realtime.setAmount(Arith.add(realtime.getAmount(), Arith.mul(Arith.div(currentValue, realtime.getClose()), realtime.getAmount()))); |
| | |
| | | realtime.setSymbol(currency); |
| | | realtime.setName(currency); |
| | | realtime.setTs(realtimeJson.getLong("timestamp")); |
| | | realtime.setOpen(realtimeJson.getBigDecimal("open").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(realtimeJson.getBigDecimal("mid").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setHigh(realtimeJson.getBigDecimal("high").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setLow(realtimeJson.getBigDecimal("low").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setOpen(realtimeJson.getBigDecimal("open").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setClose(realtimeJson.getBigDecimal("mid").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setHigh(realtimeJson.getBigDecimal("high").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setLow(realtimeJson.getBigDecimal("low").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setAmount(BigDecimal.ZERO); |
| | | realtime.setVolume(BigDecimal.ZERO); |
| | | realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setBid(realtimeJson.getBigDecimal("bid").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setBid(realtimeJson.getBigDecimal("bid").setScale(decimal, RoundingMode.DOWN)); |
| | | list.add(realtime); |
| | | } |
| | | } else { |
| | |
| | | realtime.setSymbol(symbol); |
| | | realtime.setTs(timestamp); |
| | | realtime.setName(symbol); |
| | | realtime.setOpen(BigDecimal.valueOf(Double.parseDouble(split[5])).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setHigh(BigDecimal.valueOf(Double.parseDouble(split[6])).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setLow(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setOpen(BigDecimal.valueOf(Double.parseDouble(split[5])).setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setHigh(BigDecimal.valueOf(Double.parseDouble(split[6])).setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setLow(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.DOWN)); |
| | | if(StringUtils.isNotEmpty(split[1])){ |
| | | realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[1])).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[1])).setScale(decimal, RoundingMode.DOWN)); |
| | | }else{ |
| | | realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(BigDecimal.valueOf(Double.parseDouble(split[7])).setScale(decimal, RoundingMode.DOWN)); |
| | | } |
| | | realtime.setMarketCapital(0L); |
| | | realtime.setFloatMarketCapital(0L); |
| | |
| | | timestamp = timestamp / 1000; |
| | | } |
| | | realtime.setTs(timestamp); |
| | | realtime.setOpen(jsonObject.getBigDecimal("open").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(jsonObject.getBigDecimal("current").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setHigh(jsonObject.getBigDecimal("high").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setLow(jsonObject.getBigDecimal("low").setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setOpen(jsonObject.getBigDecimal("open").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setClose(jsonObject.getBigDecimal("current").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setHigh(jsonObject.getBigDecimal("high").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setLow(jsonObject.getBigDecimal("low").setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setMarketCapital(jsonObject.getLong("market_capital")); |
| | | realtime.setFloatMarketCapital(jsonObject.getLong("float_market_capital")); |
| | | realtime.setPeForecast(jsonObject.getBigDecimal("pe_forecast")); |
| | |
| | | if (amount == null) { |
| | | amount = BigDecimal.ZERO; |
| | | } |
| | | realtime.setAmount(amount.setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setAmount(amount.setScale(decimal, RoundingMode.DOWN)); |
| | | BigDecimal volume = jsonObject.getBigDecimal("volume"); |
| | | if (volume == null) { |
| | | volume = BigDecimal.ZERO; |
| | | } |
| | | realtime.setVolume(volume.setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setVolume(volume.setScale(decimal, RoundingMode.DOWN)); |
| | | // realtime.setAsk(realtimeJson.getBigDecimal("ask").setScale(decimal, RoundingMode.HALF_UP)); |
| | | // realtime.setBid(realtimeJson.getBigDecimal("pb").setScale(decimal, RoundingMode.HALF_UP)); |
| | | list.add(realtime); |
| | |
| | | Wallet wallet = this.walletService.findByUserId(order.getPartyId()); |
| | | BigDecimal amountBefore = wallet.getMoney(); |
| | | BigDecimal totalAmountCost = order.getDeposit().add(order.getFee()); |
| | | |
| | | log.info("amountBefore:"+amountBefore); |
| | | log.info("totalAmountCost:"+totalAmountCost); |
| | | if (amountBefore.compareTo(totalAmountCost) < 0) { |
| | | throw new YamiShopBindException("not sufficient funds"); |
| | | } |
| | |
| | | return list(queryWrapper); |
| | | |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | System.out.println(); |
| | | if (new BigDecimal("1432.34").compareTo(new BigDecimal("1432.34")) < 0) { |
| | | throw new YamiShopBindException("not sufficient funds"); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | BigDecimal point = close.subtract(order.getTradeAvgPrice()); |
| | | BigDecimal profit = point.multiply(new BigDecimal("0.01")).multiply(order.getVolumeOpen()).setScale(4, BigDecimal.ROUND_DOWN);; |
| | | BigDecimal rentalProfit = order.getDeposit().add(profit); |
| | | BigDecimal rate = volume.divide(order.getVolumeOpen(), 2, RoundingMode.HALF_UP); |
| | | BigDecimal rate = volume.divide(order.getVolumeOpen(), 2, RoundingMode.DOWN); |
| | | order.setAmountClose(order.getAmountClose().add(profit)); |
| | | order.setVolume(order.getVolume().subtract(volume)); |
| | | order.setDeposit(order.getDeposit().subtract(order.getDepositOpen().multiply(rate))); |
| | |
| | | map.put("trade_avg_price", order.getTradeAvgPrice()); |
| | | map.put("close_avg_price", order.getCloseAvgPrice()); |
| | | if (order.getStopPriceProfit() != null) { |
| | | map.put("stop_price_profit", order.getStopPriceProfit().setScale(4, RoundingMode.HALF_UP)); |
| | | map.put("stop_price_profit", order.getStopPriceProfit().setScale(4, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("stop_price_profit", order.getStopPriceProfit()); |
| | | |
| | | } |
| | | if (order.getStopPriceLoss() != null) { |
| | | map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.HALF_UP)); |
| | | map.put("stop_price_loss", order.getStopPriceLoss().setScale(4, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("stop_price_loss", order.getStopPriceLoss()); |
| | | } |
| | |
| | | map.put("fee", order.getFee()); |
| | | map.put("deposit", order.getDeposit()); |
| | | map.put("deposit_open", order.getDepositOpen()); |
| | | map.put("change_ratio", order.getChangeRatio().setScale(2, RoundingMode.HALF_UP)); |
| | | map.put("change_ratio", order.getChangeRatio().setScale(2, RoundingMode.DOWN)); |
| | | |
| | | if(order.getProfit()!=null){ |
| | | map.put("profit", order.getProfit().setScale(2, RoundingMode.HALF_UP)); |
| | | map.put("profit", order.getProfit().setScale(2, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("profit", order.getProfit()); |
| | | } |
| | |
| | | |
| | | BigDecimal range = upperBound.subtract(lowerBound); |
| | | BigDecimal randomValue = range.multiply(BigDecimal.valueOf(Math.random())).add(lowerBound); |
| | | return randomValue.setScale(3, RoundingMode.HALF_UP); |
| | | return randomValue.setScale(3, RoundingMode.DOWN); |
| | | } |
| | | |
| | | private void printResult(List<Kline> originalSecKline) { |
| | |
| | | realtime.setName(symbol); |
| | | |
| | | realtime.setTs(kline.getTs() / 1000); |
| | | realtime.setOpen(kline.getOpen().setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setClose(kline.getClose().setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setHigh(kline.getHigh().setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setLow(kline.getLow().setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setOpen(kline.getOpen().setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setClose(kline.getClose().setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setHigh(kline.getHigh().setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setLow(kline.getLow().setScale(decimal, RoundingMode.DOWN)); |
| | | // realtime.setMarketCapital(realtimeJson.getLong("marketCapital")); |
| | | // realtime.setFloatMarketCapital(realtimeJson.getLong("floatMarketCapital")); |
| | | // realtime.setPeForecast(realtimeJson.getBigDecimal("peForecast")); |
| | |
| | | BigDecimal lastAmount = (BigDecimal) Optional.ofNullable(redisTemplate.opsForHash().get(RedisKeys.SYMBOL_AMOUNT_VOLUME + symbol, "amount")).orElse(BigDecimal.ZERO); |
| | | BigDecimal amount = Optional.of(kline.getAmount()).orElse(BigDecimal.ZERO); |
| | | |
| | | realtime.setAmount(lastAmount.add(amount).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setAmount(lastAmount.add(amount).setScale(decimal, RoundingMode.DOWN)); |
| | | BigDecimal lastVolume = (BigDecimal) Optional.ofNullable(redisTemplate.opsForHash().get(RedisKeys.SYMBOL_AMOUNT_VOLUME + symbol, "volume")).orElse(BigDecimal.ZERO); |
| | | BigDecimal volume = Optional.of(kline.getVolume()).orElse(BigDecimal.ZERO); |
| | | |
| | | realtime.setVolume(lastVolume.add(volume).setScale(decimal, RoundingMode.HALF_UP)); |
| | | realtime.setVolume(lastVolume.add(volume).setScale(decimal, RoundingMode.DOWN)); |
| | | realtime.setAsk(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(realtime.getLow(), realtime.getClose(), random))); |
| | | realtime.setBid(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(realtime.getHigh(), realtime.getClose(), random))); |
| | | |
| | |
| | | List<Realtime> realtimes = dataService.realtime(IXIC); |
| | | if (CollectionUtils.isNotEmpty(realtimes)) { |
| | | Realtime realtime = realtimes.get(0); |
| | | BigDecimal ratio = realtime.getClose().divide(realtime.getOpen(), 10, RoundingMode.HALF_UP); |
| | | BigDecimal close = ratio.multiply(kline.getClose()).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal low = ratio.multiply(kline.getLow()).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal high = ratio.multiply(kline.getHigh()).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal ratio = realtime.getClose().divide(realtime.getOpen(), 10, RoundingMode.DOWN); |
| | | BigDecimal close = ratio.multiply(kline.getClose()).setScale(2, RoundingMode.DOWN); |
| | | BigDecimal low = ratio.multiply(kline.getLow()).setScale(2, RoundingMode.DOWN); |
| | | BigDecimal high = ratio.multiply(kline.getHigh()).setScale(2, RoundingMode.DOWN); |
| | | retKline.setClose(close); |
| | | retKline.setLow(low); |
| | | retKline.setHigh(high); |
| | |
| | | |
| | | buy = new DepthEntry(); |
| | | // 买 |
| | | BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue(); |
| | | buy.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue()); |
| | | buy.setAmount(enlarge * volumeSplit.get(i).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue()); |
| | | BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue(); |
| | | buy.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getLow(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue()); |
| | | buy.setAmount(enlarge * volumeSplit.get(i).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue()); |
| | | |
| | | // 卖 |
| | | sell = new DepthEntry(); |
| | | sell.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getHigh(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue()); |
| | | sell.setPrice(BigDecimal.valueOf(KlineConfigService.randomBigDecimal(kline.getHigh(), kline.getClose(), random)).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue()); |
| | | |
| | | sell.setAmount(enlarge * volumeSplit.get(i + 5).setScale(item.getDecimals(), RoundingMode.HALF_UP).doubleValue()); |
| | | sell.setAmount(enlarge * volumeSplit.get(i + 5).setScale(item.getDecimals(), RoundingMode.DOWN).doubleValue()); |
| | | |
| | | |
| | | depth.getAsks().add(sell); |
| | |
| | | toDayProfitLoss = (marketValue - (openPrice * volume)); |
| | | profitLoss = marketValue - cost; |
| | | ExchangeSymbolDto exchangeSymbolDto = new ExchangeSymbolDto(); |
| | | exchangeSymbolDto.setVolume(new BigDecimal(volume).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setPositionVolume(new BigDecimal(volume).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setPrice(new BigDecimal(price).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setVolume(new BigDecimal(volume).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setPositionVolume(new BigDecimal(volume).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setPrice(new BigDecimal(price).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setName(name); |
| | | exchangeSymbolDto.setSymbol(key); |
| | | exchangeSymbolDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setToDayProfitLossPercentage(calculateProfitPercentage(openPrice, currentPrice)); |
| | | exchangeSymbolDto.setCurrentPrice(new BigDecimal(currentPrice).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setOpenPrice(new BigDecimal(openPrice).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setMarketValue(new BigDecimal(marketValue).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | exchangeSymbolDto.setCurrentPrice(new BigDecimal(currentPrice).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setOpenPrice(new BigDecimal(openPrice).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setMarketValue(new BigDecimal(marketValue).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | exchangeSymbolDto.setProfitLossPercentage(calculateProfitPercentage(price, currentPrice)); |
| | | result.add(exchangeSymbolDto); |
| | | } |
| | |
| | | double profit = currentPrice - buyPrice; |
| | | double profitPercentage = (profit / buyPrice) * 100; |
| | | System.out.println(profitPercentage); |
| | | return new BigDecimal(profitPercentage).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | return new BigDecimal(profitPercentage).setScale(2, RoundingMode.DOWN).doubleValue(); |
| | | } |
| | | |
| | | public static void test() { |
| | |
| | | |
| | | } |
| | | SumEtfDto sumEtfDto = new SumEtfDto(); |
| | | sumEtfDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | sumEtfDto.setSumPrice(new BigDecimal(sumPrice).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | sumEtfDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | sumEtfDto.setProfitLoss(new BigDecimal(profitLoss).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | sumEtfDto.setSumPrice(new BigDecimal(sumPrice).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | sumEtfDto.setToDayProfitLoss(new BigDecimal(toDayProfitLoss).setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | // usdt余额 |
| | | Wallet wallet = new Wallet(); |
| | | if (!"".equals(userId) && userId != null) { |
| | | wallet = walletService.findByUserId(userId.toString()); |
| | | } |
| | | sumEtfDto.setSumVolume(wallet.getMoney().setScale(2, RoundingMode.HALF_UP).doubleValue()); |
| | | sumEtfDto.setSumVolume(wallet.getMoney().setScale(2, RoundingMode.DOWN).doubleValue()); |
| | | return sumEtfDto; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | map.put("create_time", DateUtil.formatDate(order.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss)); |
| | | map.put("volume", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.HALF_UP)); |
| | | map.put("volume", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.DOWN)); |
| | | // 买的时候total 为volume,卖的时候total = volume*closeTime |
| | | if("open".equalsIgnoreCase(order.getOffset())){ |
| | | map.put("total", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.HALF_UP)); |
| | | map.put("total", new BigDecimal(order.getVolume()).setScale(6, RoundingMode.DOWN)); |
| | | }else{ |
| | | map.put("total", new BigDecimal(order.getVolume()*order.getClosePrice()).setScale(2, RoundingMode.HALF_UP)); |
| | | map.put("total", new BigDecimal(order.getVolume()*order.getClosePrice()).setScale(2, RoundingMode.DOWN)); |
| | | } |
| | | map.put("offset", order.getOffset()); |
| | | map.put("price", order.getPrice()); |
| | |
| | | if (profitRatio.compareTo(val) < 0 || profitRatioMax.compareTo(val) < 0) { |
| | | scale = 1; |
| | | } |
| | | String profitRatioFront = profitRatio.setScale(scale, RoundingMode.HALF_UP) + "-" + profitRatioMax.setScale(scale, RoundingMode.HALF_UP); |
| | | String profitRatioFront = profitRatio.setScale(scale, RoundingMode.DOWN) + "-" + profitRatioMax.setScale(scale, RoundingMode.DOWN); |
| | | futuresPara.setProfitRatioFront(profitRatioFront); |
| | | BigDecimal unitMaxAmount = futuresPara.getUnitMaxAmount().compareTo(BigDecimal.ZERO)<= 0?null: futuresPara.getUnitMaxAmount(); |
| | | futuresPara.setBuyMin(new BigDecimal(futuresPara.getUnitAmount())); |
| | |
| | | if (result < 0) { |
| | | return 0; |
| | | } |
| | | return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue(); |
| | | } |
| | | |
| | | |
| | |
| | | if (result < 0) { |
| | | return 0; |
| | | } |
| | | return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue(); |
| | | } |
| | | |
| | | |
| | |
| | | if (result < 0) { |
| | | return 0; |
| | | } |
| | | return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue(); |
| | | } |
| | | |
| | | |
| | |
| | | if (result < 0) { |
| | | return 0; |
| | | } |
| | | return new BigDecimal(result).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | return new BigDecimal(result).setScale(2, RoundingMode.DOWN).doubleValue(); |
| | | } |
| | | |
| | | } |
| | |
| | | throw new YamiShopBindException("操作失败!修正后账户余额小于0。"); |
| | | } |
| | | walletService.updateExtend(walletExtend.getPartyId().toString(), gift_symbol, gift_sum); |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN); |
| | | userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue()); |
| | | |
| | | /* |
| | |
| | | if (Arith.add(gift_sum, walletExtend.getAmount()) < 0.0D) { |
| | | throw new YamiShopBindException("操作失败!修正后账户余额小于0。"); |
| | | } |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN); |
| | | userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue()); // 保存账变日志 |
| | | // MoneyLog moneyLog = new MoneyLog(); |
| | | // moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_COIN); |
| | |
| | | if (!walletExtendService.saveOrUpdate(walletExtend)) { |
| | | throw new YamiShopBindException("操作钱包失败!"); |
| | | } |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal amount = dataService.realtime(gift_symbol).get(0).getClose().multiply(new BigDecimal(gift_sum)).setScale(2, RoundingMode.DOWN); |
| | | userDataService.saveGiftMoneyHandle(wallet.getUserId(), amount.doubleValue()); |
| | | |
| | | // 保存账变日志 |