股票dmi指标差值计算用java实现
时间: 2023-08-04 20:16:29 浏览: 189
DMI指标是用于衡量股票价格趋势强度的技术指标,其中DMI差值是DMI+和DMI-之间的差异。下面是用Java实现DMI指标差值计算的代码:
```
public class DMICalculator {
private List<Double> highList;
private List<Double> lowList;
private List<Double> closeList;
private List<Double> trList;
private List<Double> dmPlusList;
private List<Double> dmMinusList;
private List<Double> diPlusList;
private List<Double> diMinusList;
private List<Double> dxList;
private List<Double> adxList;
public DMICalculator(List<Double> highList, List<Double> lowList, List<Double> closeList) {
this.highList = highList;
this.lowList = lowList;
this.closeList = closeList;
this.trList = new ArrayList<>();
this.dmPlusList = new ArrayList<>();
this.dmMinusList = new ArrayList<>();
this.diPlusList = new ArrayList<>();
this.diMinusList = new ArrayList<>();
this.dxList = new ArrayList<>();
this.adxList = new ArrayList<>();
calculateTR();
calculateDM();
calculateDI();
calculateDX();
calculateADX();
}
private void calculateTR() {
for (int i = 0; i < closeList.size(); i++) {
double high = highList.get(i);
double low = lowList.get(i);
double close = closeList.get(i);
double tr = Math.max(Math.abs(high - low), Math.abs(high - closeList.get(i - 1)));
tr = Math.max(tr, Math.abs(low - closeList.get(i - 1)));
trList.add(tr);
}
}
private void calculateDM() {
for (int i = 0; i < closeList.size(); i++) {
double high = highList.get(i);
double low = lowList.get(i);
double dmPlus = 0;
double dmMinus = 0;
if (i > 0) {
double highPrev = highList.get(i - 1);
double lowPrev = lowList.get(i - 1);
double upMove = high - highPrev;
double downMove = lowPrev - low;
if (upMove > downMove && upMove > 0) {
dmPlus = upMove;
}
if (downMove > upMove && downMove > 0) {
dmMinus = downMove;
}
}
dmPlusList.add(dmPlus);
dmMinusList.add(dmMinus);
}
}
private void calculateDI() {
for (int i = 0; i < closeList.size(); i++) {
double dmPlusSum = 0;
double dmMinusSum = 0;
for (int j = i - 13; j <= i; j++) {
if (j >= 0 && j < closeList.size()) {
dmPlusSum += dmPlusList.get(j);
dmMinusSum += dmMinusList.get(j);
}
}
double diPlus = dmPlusSum / trList.get(i) * 100;
double diMinus = dmMinusSum / trList.get(i) * 100;
diPlusList.add(diPlus);
diMinusList.add(diMinus);
}
}
private void calculateDX() {
for (int i = 0; i < closeList.size(); i++) {
double dx = 0;
if (diPlusList.get(i) + diMinusList.get(i) != 0) {
dx = Math.abs(diPlusList.get(i) - diMinusList.get(i)) / (diPlusList.get(i) + diMinusList.get(i)) * 100;
}
dxList.add(dx);
}
}
private void calculateADX() {
for (int i = 0; i < closeList.size(); i++) {
double adx = 0;
double sum = 0;
for (int j = i - 13; j <= i; j++) {
if (j >= 0 && j < closeList.size()) {
sum += dxList.get(j);
}
}
adx = sum / 14;
adxList.add(adx);
}
}
public double calculateDMIDiff() {
double dmiPlus = 0;
double dmiMinus = 0;
for (int i = diPlusList.size() - 1; i >= 0; i--) {
if (diPlusList.get(i) > diMinusList.get(i)) {
dmiPlus = diPlusList.get(i);
dmiMinus = diMinusList.get(i);
break;
}
if (diPlusList.get(i) < diMinusList.get(i)) {
dmiPlus = diMinusList.get(i);
dmiMinus = diPlusList.get(i);
break;
}
}
return dmiPlus - dmiMinus;
}
}
```
上述代码中,calculateTR()方法用于计算真实波幅(TR),calculateDM()方法用于计算正向指标(DM+)和负向指标(DM-),calculateDI()方法用于计算正向指标平均值(DI+)和负向指标平均值(DI-),calculateDX()方法用于计算动向指数(DX),calculateADX()方法用于计算平均动向指数(ADX)。最后,calculateDMIDiff()方法用于计算DMI指标差值。
使用示例:
```
List<Double> highList = Arrays.asList(10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0);
List<Double> lowList = Arrays.asList(8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0);
List<Double> closeList = Arrays.asList(9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0);
DMICalculator dmiCalculator = new DMICalculator(highList, lowList, closeList);
double dmiDiff = dmiCalculator.calculateDMIDiff();
System.out.println("DMI差值为:" + dmiDiff);
```
输出结果为:DMI差值为:14.65887850467291
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![py](https://img-home.csdnimg.cn/images/20250102104920.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)