# xianlaocai-quant
**Repository Path**: donhow/xianlaocai-quant
## Basic Information
- **Project Name**: xianlaocai-quant
- **Description**: 基于Java实现常见指标MACD,RSI,BOLL,KDJ,CCI,MA,EMA,BIAS,TD,WR等,全部封装,简洁且准确,能非常方便的应用在各自股票股市技术分析,股票自动程序化交易,数字货币BTC等量化等领域
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2024-06-24
- **Last Updated**: 2024-06-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# xianlaocai-quant
## 交流群信息:
点击加入【QQ交流群】[](https://jq.qq.com/?_wv=1027&k=3l0rfaJP)
QQ群号:223606797,(加群备注:quant,后期找群主要 微信 交流群)
## 介绍
xianlaocai-quant是一个父工程,目前仅仅开源一个包,会逐步开源子模块。
### quant-data-indicator
主要是用来计算技术指标的,后续会持续更新。欢迎大家多提bug和建议,参与贡献.
### quant-data-indicator
基于Java实现常见指标MACD,RSI,BOLL,KDJ,CCI,MA,EMA,BIAS,TD,WR,DMI等,全部封装,简洁且准确,能非常方便的应用在各自股票股市技术分析,股票自动程序化交易,数字货币BTC等量化等领域.
## 使用说明(如果能帮到你,烦请点个赞)
### Maven直接引用
Maven地址(更新较快)阿里云Maven仓库搜索关键词:quant-data-indicator,
阿里云Maven仓库地址:https://developer.aliyun.com/mvn/search
mvnrepository地址(更新较慢):https://mvnrepository.com/artifact/com.xianlaocai.quant/quant-data-indicator
1. IDE: Ecplse或者IDEA均可
2. Maven
```xml
com.xianlaocai.quant
quant-data-indicator
XLCQ20240604
```
Gradle
```xml
// https://mvnrepository.com/artifact/com.xianlaocai.quant/quant-data-indicator
implementation group: 'com.xianlaocai.quant', name: 'quant-data-indicator', version: 'XLCQ20240604'
```
### 基表计算示例
示例地址: /quant-data-indicator/src/test/java/xlc/quant/data/indicator/test/DemoTest.java
## 软件架构
java最低最低JDK1.8(Java8),Maven聚合父子项目,会逐步开源子模块。
### quant-data-indicator中指标计算实现说明
#### 实现一个新的指标计算
1. 指标类 继承 Indicator指标顶级父类 ,并定义指标值(如果有)
2. 指标类 构建一个计算器静态内部类 继承 IndicatorCalculator指标计算器抽象父类 ,并实现TimeSeriesDataRollingWindowQueue抽象类中的 protected abstract INDI executeCalculate(Function propertyGetter) 方法
```java
/**
* 执行计算,由子类具体某个指标的计算器实现
* @param propertyGetter 委托方法,从载体类获取计算结果的方法
* @return
*/
protected abstract INDI executeCalculate(Function propertyGetter);
```
#### 指标实现举例:移动平均线MA
1. 指标类 继承 Indicator指标顶级父类 ,并定义指标值(如果有)
2. 指标类 构建一个计算器静态内部类 继承 IndicatorCalculator指标计算器抽象父类 ,并实现TimeSeriesDataRollingWindowQueue抽象类中的 protected abstract INDI executeCalculate(Function propertyGetter) 方法
```java
/**
* @author Rootfive
*
* 移动平均线,英文名称为MovingAverage,简称MA,原本意思是移动平均。由于我们将其制作成线形,所以一般称为移动平均线,简称均线。
* 均线是将某一段吋间的收盘价之和除以该周期,比如日线MA5指5天内的收盘价除以5,
* 其计算公式为: MA(5)=(C1+C2+C3十C4+C5)/5
* 其中:
* Cn为第n日收盘价。例如C1,则为第1日收盘价。
*
* 用EMA追底,用MA识顶。 例如,用20天EMA判断底部,用20天MA判断顶部。
*
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MA extends Indicator {
//=============
//内部类分隔符 XXX
//=============
/**
* 构建-计算器
* @param capacity
* @param indicatorSetScale 指标精度
* @return
*/
public static > IndicatorCalculator buildCalculator(int capacity,int indicatorSetScale) {
return new MACalculator<>(capacity,indicatorSetScale);
}
/**
* 内部类实现MA计算器
* @author Rootfive
*/
private static class MACalculator> extends IndicatorCalculator {
/** 指标精度 */
private final int indicatorSetScale;
/**
* @param capacity
*/
MACalculator(int capacity,int indicatorSetScale) {
super(capacity, true);
this.indicatorSetScale = indicatorSetScale;
}
@Override
protected Double executeCalculate(Function propertyGetter) {
double closeSumValue = DoubleUtils.ZERO;
for (int i = 0; i < size(); i++) {
closeSumValue = closeSumValue+ get(i).getClose();
}
return DoubleUtils.divide(closeSumValue, size(), indicatorSetScale);
}
}
}
```
## 升级日志 倒叙
### XLCQ20240604
升级RangeInXLC范围工具类
```java
xlc.quant.data.indicator.struct.RangeInXLC.all()
```
### XLCQ20240406
修复工具类方法。设置double值设置精度。借助BigDecimal设置精度
```java
/**
* 设置精度
* @param value
* @param newScale
*/
public static double setScale(double value, int newScale) {
if (newScale > 15|| newScale < 0 ) {
throw new IllegalArgumentException("小数位必须在(1-15)位");
}
return new BigDecimal(String.valueOf(value)).setScale(newScale,RoundingMode.HALF_UP).doubleValue();
}
```
原因是原方法中:value * factor 的结果 大于 long的最大值Long.MAX_VALUE时,返回的结果可能会出现一个固定值。
```java
/**
* 设置精度
* @param value
* @param newScale
* @return
* 将给定的 double 值乘以一个放大因子,然后使用 Math.round() 方法四舍五入,最后再除以放大因子,以达到截断小数点位数的效果。
* 这种方法的性能相对较高,因为它只使用了简单的数学运算,没有涉及字符串操作或格式化。
* 它直接对 double 值进行数学计算,因此在处理大量数据时能够更高效地执行。
*/
public static double setScale(double value, int newScale) {
if (newScale > 15|| newScale < 0 ) {
throw new IllegalArgumentException("小数位必须在(1-15)位");
}
double factor = Math.pow(10, newScale);
return Math.round(value * factor) / factor; // 问题出现在这里 value * factor 可能恒等于 Long.MAX_VALUE
}
```
### XLCQ20231027
增加指标数仓和数仓管理员概念
1、 数仓:IndicatorDataWarehouse 基于内存存储指标
```java
xlc.quant.data.indicator.IndicatorDataWarehouse
```
2、 数仓管理员:IndicatorWarehouseManager 管理指标(自定义个数)计算
```java
xlc.quant.data.indicator.IndicatorWarehouseManager