自适应网格

This commit is contained in:
tony 2026-07-05 23:43:24 +08:00
parent 12bf7e893d
commit a9b3bbb095
3 changed files with 941 additions and 309 deletions

View File

@ -0,0 +1,24 @@
package com.sample.trend.config;
import vip.uuquant.exhangeapi.core.ExchangeFactory;
import vip.uuquant.exhangeapi.core.HttpClient;
import vip.uuquant.exhangeapi.core.WebSocketManager;
/**
* 交易所客户端全局单例
*/
public class CommonConstant {
public static final HttpClient httpClient = HttpClient.builder().build();
public static final WebSocketManager webSocketManager = new WebSocketManager(httpClient);
public static final ExchangeFactory exchangeFactory = new ExchangeFactory();
static {
webSocketManager.setLogEnabled(false);
}
private CommonConstant() {
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
package com.sample.trend.strategy.util;
import com.alibaba.fastjson2.JSONArray;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
/**
* ATR(Average True Range)计算工具
*/
public final class AtrCalculator {
private AtrCalculator() {
}
/**
* 根据 K 线数据计算 ATR。
* K 线格式:[timestamp, open, high, low, close, ...]
*
* @param klines K 线数组,按时间升序
* @param period ATR 周期
* @return ATR 值,数据不足时返回 null
*/
public static BigDecimal calculate(JSONArray klines, int period) {
if (klines == null || klines.size() < period + 1) {
return null;
}
List<BigDecimal> trueRanges = new ArrayList<>();
for (int i = 1; i < klines.size(); i++) {
JSONArray current = klines.getJSONArray(i);
JSONArray previous = klines.getJSONArray(i - 1);
BigDecimal high = current.getBigDecimal(2);
BigDecimal low = current.getBigDecimal(3);
BigDecimal prevClose = previous.getBigDecimal(4);
BigDecimal range1 = high.subtract(low);
BigDecimal range2 = high.subtract(prevClose).abs();
BigDecimal range3 = low.subtract(prevClose).abs();
BigDecimal tr = range1.max(range2).max(range3);
trueRanges.add(tr);
}
if (trueRanges.size() < period) {
return null;
}
BigDecimal sum = BigDecimal.ZERO;
int start = trueRanges.size() - period;
for (int i = start; i < trueRanges.size(); i++) {
sum = sum.add(trueRanges.get(i));
}
return sum.divide(BigDecimal.valueOf(period), 8, RoundingMode.HALF_UP);
}
}