首页>代码>android客户端专业股票k线图>/KChartView-master/kchart/Example/src/main/java/com/github/tifezh/kchart/DataHelper.java
package com.github.tifezh.kchart;
import com.github.tifezh.kchart.chart.KLineEntity;
import java.util.List;
/**
* 数据辅助类 计算macd rsi等
* Created by tifezh on 2016/11/26.
*/
public class DataHelper {
/**
* 计算RSI
*
* @param datas
*/
static void calculateRSI(List<KLineEntity> datas) {
float rsi1 = 0;
float rsi2 = 0;
float rsi3 = 0;
float rsi1ABSEma = 0;
float rsi2ABSEma = 0;
float rsi3ABSEma = 0;
float rsi1MaxEma = 0;
float rsi2MaxEma = 0;
float rsi3MaxEma = 0;
for (int i = 0; i < datas.size(); i++) {
KLineEntity point = datas.get(i);
final float closePrice = point.getClosePrice();
if (i == 0) {
rsi1 = 0;
rsi2 = 0;
rsi3 = 0;
rsi1ABSEma = 0;
rsi2ABSEma = 0;
rsi3ABSEma = 0;
rsi1MaxEma = 0;
rsi2MaxEma = 0;
rsi3MaxEma = 0;
} else {
float Rmax = Math.max(0, closePrice - datas.get(i - 1).getClosePrice());
float RAbs = Math.abs(closePrice - datas.get(i - 1).getClosePrice());
rsi1MaxEma = (Rmax + (6f - 1) * rsi1MaxEma) / 6f;
rsi1ABSEma = (RAbs + (6f - 1) * rsi1ABSEma) / 6f;
rsi2MaxEma = (Rmax + (12f - 1) * rsi2MaxEma) / 12f;
rsi2ABSEma = (RAbs + (12f - 1) * rsi2ABSEma) / 12f;
rsi3MaxEma = (Rmax + (24f - 1) * rsi3MaxEma) / 24f;
rsi3ABSEma = (RAbs + (24f - 1) * rsi3ABSEma) / 24f;
rsi1 = (rsi1MaxEma / rsi1ABSEma) * 100;
rsi2 = (rsi2MaxEma / rsi2ABSEma) * 100;
rsi3 = (rsi3MaxEma / rsi3ABSEma) * 100;
}
point.rsi1 = rsi1;
point.rsi2 = rsi2;
point.rsi3 = rsi3;
}
}
/**
* 计算kdj
*
* @param datas
*/
static void calculateKDJ(List<KLineEntity> datas) {
float k = 0;
float d = 0;
for (int i = 0; i < datas.size(); i++) {
KLineEntity point = datas.get(i);
final float closePrice = point.getClosePrice();
int startIndex = i - 8;
if (startIndex < 0) {
startIndex = 0;
}
float max9 = Float.MIN_VALUE;
float min9 = Float.MAX_VALUE;
for (int index = startIndex; index <= i; index++) {
max9 = Math.max(max9, datas.get(index).getHighPrice());
min9 = Math.min(min9, datas.get(index).getLowPrice());
}
float rsv = 100f * (closePrice - min9) / (max9 - min9);
if (i == 0) {
k = rsv;
d = rsv;
} else {
k = (rsv + 2f * k) / 3f;
d = (k + 2f * d) / 3f;
}
point.k = k;
point.d = d;
point.j = 3f * k - 2 * d;
}
}
/**
* 计算macd
*
* @param datas
*/
static void calculateMACD(List<KLineEntity> datas) {
float ema12 = 0;
float ema26 = 0;
float dif = 0;
float dea = 0;
float macd = 0;
for (int i = 0; i < datas.size(); i++) {
KLineEntity point = datas.get(i);
final float closePrice = point.getClosePrice();
if (i == 0) {
ema12 = closePrice;
ema26 = closePrice;
} else {
// EMA(12) = 前一日EMA(12) X 11/13 + 今日收盘价 X 2/13
// EMA(26) = 前一日EMA(26) X 25/27 + 今日收盘价 X 2/27
ema12 = ema12 * 11f / 13f + closePrice * 2f / 13f;
ema26 = ema26 * 25f / 27f + closePrice * 2f / 27f;
}
// DIF = EMA(12) - EMA(26) 。
// 今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10)
// 用(DIF-DEA)*2即为MACD柱状图。
dif = ema12 - ema26;
dea = dea * 8f / 10f + dif * 2f / 10f;
macd = (dif - dea) * 2f;
point.dif = dif;
point.dea = dea;
point.macd = macd;
}
}
/**
* 计算 BOLL 需要在计算ma之后进行
*
* @param datas
*/
static void calculateBOLL(List<KLineEntity> datas) {
for (int i = 0; i < datas.size(); i++) {
KLineEntity point = datas.get(i);
final float closePrice = point.getClosePrice();
if (i == 0) {
point.mb = closePrice;
point.up = Float.NaN;
point.dn = Float.NaN;
} else {
int n = 20;
if (i < 20) {
n = i + 1;
}
float md = 0;
for (int j = i - n + 1; j <= i; j++) {
float c = datas.get(j).getClosePrice();
float m = point.getMA20Price();
float value = c - m;
md += value * value;
}
md = md / (n - 1);
md = (float) Math.sqrt(md);
point.mb = point.getMA20Price();
point.up = point.mb + 2f * md;
point.dn = point.mb - 2f * md;
}
}
}
/**
* 计算ma
*
* @param datas
*/
static void calculateMA(List<KLineEntity> datas) {
float ma5 = 0;
float ma10 = 0;
float ma20 = 0;
for (int i = 0; i < datas.size(); i++) {
KLineEntity point = datas.get(i);
final float closePrice = point.getClosePrice();
ma5 += closePrice;
ma10 += closePrice;
ma20 += closePrice;
if (i >= 5) {
ma5 -= datas.get(i - 5).getClosePrice();
point.MA5Price = ma5 / 5f;
} else {
point.MA5Price = ma5 / (i + 1f);
}
if (i >= 10) {
ma10 -= datas.get(i - 10).getClosePrice();
point.MA10Price = ma10 / 10f;
} else {
point.MA10Price = ma10 / (i + 1f);
}
if (i >= 20) {
ma20 -= datas.get(i - 20).getClosePrice();
point.MA20Price = ma20 / 20f;
} else {
point.MA20Price = ma20 / (i + 1f);
}
}
}
/**
* 计算MA BOLL RSI KDJ MACD
*
* @param datas
*/
static void calculate(List<KLineEntity> datas) {
calculateMA(datas);
calculateMACD(datas);
calculateBOLL(datas);
calculateRSI(datas);
calculateKDJ(datas);
}
}
最近下载更多
lizeng206 LV1
2022年11月16日
windygzf LV1
2022年1月3日
sianhxyeiangu LV14
2020年6月14日
没骨气的鱼 LV4
2020年6月6日
花花滑滑画画瓜瓜 LV9
2020年1月9日
陈大美女 LV1
2020年1月2日
13964652858 LV1
2019年5月8日
zyl891027 LV1
2019年1月12日
凌乱18181 LV2
2018年12月7日
xinghunbuxiu LV1
2018年11月19日

最近浏览
