| | |
| | | import com.yami.trading.common.util.Arith; |
| | | import com.yami.trading.common.util.IPHelper; |
| | | import com.yami.trading.common.util.ThreadUtils; |
| | | import com.yami.trading.huobi.data.AdjustmentValueCache; |
| | | import com.yami.trading.huobi.data.DataCache; |
| | | import com.yami.trading.huobi.data.internal.AdjustmentValueService; |
| | | import com.yami.trading.huobi.data.model.AdjustmentValue; |
| | |
| | | |
| | | } |
| | | |
| | | public void adjust(String symbol, Double second, BigDecimal value) { |
| | | BigDecimal currentValue = this.adjustmentValueService.getCurrentValue(symbol); |
| | | if (currentValue == null) { |
| | | Realtime realtime = this.dataService.realtime(symbol).get(0); |
| | | currentValue = realtime.getClose(); |
| | | /** |
| | | * 提交调整(与 getValue.action 预计算使用同一套 type 规则)。 |
| | | */ |
| | | public void adjust(String symbol, Double second, BigDecimal value, String type) { |
| | | AdjustmentValueCache.getDelayValue().remove(symbol); |
| | | AdjustmentValueCache.getPreAllocatedAdjustments().remove(symbol); |
| | | AdjustmentValueCache.getCurrentAdjustmentIndex().remove(symbol); |
| | | AdjustmentValueCache.getFrequency().remove(symbol); |
| | | |
| | | String adjustType = StringUtils.isBlank(type) ? "2" : type; |
| | | BigDecimal effectiveDelta = resolveEffectiveAdjustDelta(symbol, adjustType, value); |
| | | if (effectiveDelta == null || effectiveDelta.compareTo(BigDecimal.ZERO) == 0) { |
| | | log.warn("行情调整无效 symbol={} value={} type={}", symbol, value, adjustType); |
| | | return; |
| | | } |
| | | String log = MessageFormat.format("ip:" + IPHelper.getIpAddr() + ",管理员调整行情,币种:{0},原值:{1},调整值:{2},调整时间:{3}", |
| | | symbol, currentValue.toPlainString(), value.toPlainString(), second); |
| | | |
| | | this.adjustmentValueService.adjust(symbol, value, second); |
| | | saveLog(log); |
| | | ThreadUtils.sleep(1000); |
| | | BigDecimal beforeAdjust = adjustmentValueService.getCurrentValue(symbol); |
| | | double secondVal = second == null ? 0D : second; |
| | | |
| | | String logContent = MessageFormat.format( |
| | | "ip:" + IPHelper.getIpAddr() + ",管理员调整行情,币种:{0},调整前累计:{1},本次增量:{2},type:{3},延迟秒:{4}", |
| | | symbol, |
| | | beforeAdjust == null ? "0" : beforeAdjust.toPlainString(), |
| | | effectiveDelta.toPlainString(), |
| | | adjustType, |
| | | secondVal); |
| | | |
| | | adjustmentValueService.adjust(symbol, effectiveDelta, secondVal); |
| | | |
| | | // 立即生效时同步内存行情,避免只改缓存累计值但页面仍显示旧价 |
| | | if (secondVal <= 0) { |
| | | syncRealtimeCacheAfterAdjust(symbol, effectiveDelta); |
| | | } else { |
| | | log.info("延迟调整已提交 symbol={} 目标增量={} 时长约{}秒,价格将分步变化(非瞬间到位)", |
| | | symbol, effectiveDelta.toPlainString(), secondVal); |
| | | } |
| | | |
| | | saveLog(logContent); |
| | | ThreadUtils.sleep(500); |
| | | } |
| | | |
| | | /** |
| | | * 与 calculateValue 一致:type 0/1 在输入值基础上加减 pips,type 2 直接使用输入值作为本次增量。 |
| | | */ |
| | | private BigDecimal resolveEffectiveAdjustDelta(String symbol, String type, BigDecimal inputValue) { |
| | | if (inputValue == null) { |
| | | return null; |
| | | } |
| | | Item item = itemService.findBySymbol(symbol); |
| | | if (item == null) { |
| | | return inputValue; |
| | | } |
| | | double pips = item.getPips() != null ? item.getPips().doubleValue() : 0D; |
| | | double v = inputValue.doubleValue(); |
| | | if ("0".equalsIgnoreCase(type)) { |
| | | return BigDecimal.valueOf(Arith.add(v, pips)); |
| | | } |
| | | if ("1".equalsIgnoreCase(type)) { |
| | | return BigDecimal.valueOf(Arith.sub(v, pips)); |
| | | } |
| | | return inputValue; |
| | | } |
| | | |
| | | /** 将本次增量反映到 DataCache,与 WebSocket/采集任务展示逻辑一致 */ |
| | | private void syncRealtimeCacheAfterAdjust(String symbol, BigDecimal effectiveDelta) { |
| | | Realtime realtime = DataCache.getRealtime(symbol); |
| | | if (realtime == null) { |
| | | List<Realtime> list = dataService.realtime(symbol); |
| | | if (CollectionUtil.isEmpty(list)) { |
| | | return; |
| | | } |
| | | realtime = list.get(0); |
| | | } |
| | | Integer decimal = itemService.getDecimal(symbol); |
| | | realtime.setClose(realtime.getClose().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP)); |
| | | if (realtime.getAsk() != null) { |
| | | realtime.setAsk(realtime.getAsk().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP)); |
| | | } |
| | | if (realtime.getBid() != null) { |
| | | realtime.setBid(realtime.getBid().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP)); |
| | | } |
| | | DataCache.putRealtime(symbol, realtime); |
| | | } |
| | | |
| | | public void saveLog(String content) { |