| | |
| | | |
| | | public abstract class AbstractGetDataJob implements Runnable { |
| | | public static volatile boolean first = true; |
| | | protected static Logger logger = LoggerFactory.getLogger(StockGetDataJob.class); |
| | | protected static Logger logger = LoggerFactory.getLogger(AbstractGetDataJob.class); |
| | | /** |
| | | * 数据接口调用间隔时长(毫秒) |
| | | */ |
| | |
| | | } |
| | | Integer frequency = AdjustmentValueCache.getFrequency().get(symbol); |
| | | if (frequency == null) { |
| | | frequency = (int) Arith.div(Arith.mul(delayValue.getSecond(), 1000.0D), this.interval); |
| | | double rawFrequency = Arith.div(Arith.mul(delayValue.getSecond(), 1000.0D), this.interval); |
| | | // 判断是否有小数部分 |
| | | if (rawFrequency > (int) rawFrequency) { |
| | | // 有小数(如333.333)→ +1 |
| | | frequency = (int) rawFrequency + 1; |
| | | } else { |
| | | // 无小数(如500.0)→ 不+1 |
| | | frequency = (int) rawFrequency; |
| | | } |
| | | AdjustmentValueCache.getFrequency().put(symbol, frequency); |
| | | } |
| | | if (frequency <= 1) { |
| | |
| | | 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)); |
| | | } |
| | | adjustments.addAll(generateRandomAdjustments(result.get(i), frequency / 10, 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.getPreAllocatedAdjustments().remove(symbol); |
| | | AdjustmentValueCache.getCurrentAdjustmentIndex().remove(symbol); |
| | | 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) { |
| | |
| | | public static void main(String[] args) { |
| | | AbstractGetDataJob abstractGetDataJob = new CryptosGetDataJob(); |
| | | List<BigDecimal> list = new ArrayList<>(); |
| | | int frequency = 200; |
| | | int decimal = 6; |
| | | int frequency = 334; |
| | | int decimal = 4; |
| | | //分几段执行 |
| | | int nums = Math.max(10, frequency / 10); |
| | | System.out.println(nums); |
| | | List<BigDecimal> result = RandomNumbersGenerator.generateNumbers(BigDecimal.valueOf(0.02), nums, decimal + 4); |
| | | System.out.println(result); |
| | | for (int i = 0; i < result.size(); i++) { |
| | | list.addAll(abstractGetDataJob.generateRandomAdjustments(result.get(i), frequency / 10, decimal)); |
| | | int count = frequency / nums; |
| | | if (i == result.size() - 1) { |
| | | count += frequency % nums; |
| | | } |
| | | List<BigDecimal> numbers = abstractGetDataJob.generateRandomAdjustments(result.get(i), count, decimal); |
| | | System.out.println(numbers); |
| | | list.addAll(numbers); |
| | | } |
| | | |
| | | BigDecimal sum = BigDecimal.ZERO; |
| | |
| | | |
| | | numd = numd.add(list.get(i)); |
| | | num++; |
| | | if (num == 20) { |
| | | if (num == 33) { |
| | | System.out.println(dmt+"ddd" + numd); |
| | | dmt++; |
| | | num=0; |