| | |
| | | List<BigDecimal> adjustments = AdjustmentValueCache.getPreAllocatedAdjustments().get(symbol); |
| | | Integer currentIndex = AdjustmentValueCache.getCurrentAdjustmentIndex().get(symbol); |
| | | |
| | | // 首次执行:生成含正负值的调整序列 |
| | | // 首次执行:生成调整序列(小幅调整用等额分步,确保合计等于目标值) |
| | | if (adjustments == null || currentIndex == null) { |
| | | //分几段执行 |
| | | int nums = Math.max(10, frequency / 10); |
| | | List<BigDecimal> result = RandomNumbersGenerator.generateNumbers(delayValue.getValue(), nums, decimal + 4); |
| | | for (int i = 0; i < result.size(); i++) { |
| | | if (adjustments == null) { |
| | | adjustments = new ArrayList<>(); |
| | | if (delayValue.getValue().abs().compareTo(new BigDecimal("2")) <= 0) { |
| | | adjustments = buildEqualAdjustments(delayValue.getValue(), frequency, decimal); |
| | | } else { |
| | | int nums = Math.max(10, frequency / 10); |
| | | List<BigDecimal> result = RandomNumbersGenerator.generateNumbers(delayValue.getValue(), nums, decimal + 4); |
| | | adjustments = new ArrayList<>(); |
| | | for (int i = 0; i < result.size(); i++) { |
| | | int count = frequency / nums; |
| | | if (i == result.size() - 1) { |
| | | count += frequency % nums; |
| | | } |
| | | adjustments.addAll(generateRandomAdjustments(result.get(i), count, decimal)); |
| | | } |
| | | int count = frequency / nums; |
| | | if (i == result.size() - 1) { |
| | | count += frequency % nums; |
| | | } |
| | | adjustments.addAll(generateRandomAdjustments(result.get(i), count, decimal)); |
| | | } |
| | | currentIndex = 0; |
| | | AdjustmentValueCache.getPreAllocatedAdjustments().put(symbol, adjustments); |
| | |
| | | if (low != null) { |
| | | realtime.setLow(BigDecimal.valueOf(low)); |
| | | } |
| | | DataCache.putRealtime(symbol, realtime); |
| | | this.dataDBService.saveAsyn(realtime); |
| | | } |
| | | |
| | |
| | | AdjustmentValueCache.getFrequency().remove(symbol); |
| | | } |
| | | |
| | | /** |
| | | * 等额分步,保证各步相加严格等于 totalValue(适用于管理员小幅调价,如 -0.1)。 |
| | | */ |
| | | private List<BigDecimal> buildEqualAdjustments(BigDecimal totalValue, int count, int decimal) { |
| | | List<BigDecimal> adjustments = new ArrayList<>(Math.max(1, count)); |
| | | if (count <= 1) { |
| | | adjustments.add(totalValue.setScale(decimal, RoundingMode.HALF_UP)); |
| | | return adjustments; |
| | | } |
| | | BigDecimal per = totalValue.divide(BigDecimal.valueOf(count), decimal + 4, RoundingMode.HALF_UP); |
| | | BigDecimal sum = BigDecimal.ZERO; |
| | | for (int i = 0; i < count - 1; i++) { |
| | | BigDecimal step = per.setScale(decimal, RoundingMode.HALF_UP); |
| | | adjustments.add(step); |
| | | sum = sum.add(step); |
| | | } |
| | | adjustments.add(totalValue.subtract(sum).setScale(decimal, RoundingMode.HALF_UP)); |
| | | return adjustments; |
| | | } |
| | | |
| | | private List<BigDecimal> generateRandomAdjustments(BigDecimal totalValue, int count, int decimal) { |
| | | List<BigDecimal> adjustments = new ArrayList<>(count); |
| | | BigDecimal sum = BigDecimal.ZERO; // 整体累积和 |