Files
2026-07-03 15:56:07 +08:00

156 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 整理算法
## 简称和命名
### Quotes
* 最原始的Quote对象包含五个字段:t,o,c,l,h
* t 时间,该报价单元生成的时间戳
* o 开盘价,该报价单元的开始报价
* c 闭盘价,该报价单元的结束报价
* l 最低价,该报价单元的最低价
* h 最高价,该报价单元的最高价
## 算法和示例代码
### MA
> 移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。[[百度百科:移动平均线](https://baike.baidu.com/item/%E7%A7%BB%E5%8A%A8%E5%B9%B3%E5%9D%87%E7%BA%BF/217887?fr=aladdin&fromid=1511750&fromtitle=MA)]
#### MA算法
* MA5,指的是5单位的移动平均线,其它同理。MA(5,10,20)指的是5单位、10单位、20单位三条移动平均线。
* 很多资料都把MAn,称为n天的移动平均线,感觉这样是不合理的,因为折线图有很多类型,比如1分钟的、1小时的、1周的等等。所以,这里"n"不应该称为“天”,而是应该是对应的类型,所以这里直接称为“单位”。
* 计算公式:MA =(C1+C2+C3+C4+C5+...+Cn)/n,其中C为收盘价n为移动平均周期数。例如现货黄金的5日移动平均价格计算方法为:MA5=(前四天收盘价+前三天收盘价+前天收盘价+昨天收盘价+今天收盘价)/5。
* 指定点的MAn值的计算,就是从该点开始(包括该点)起向历史数据取n个数据单元的收盘价之和,然后取均值。
* 特殊的,假如数据集合中最开始的n个数据,是没法计算MAn的。这里的处理方式有两种
1. 对于最开始的n个点,直接用当日的收盘价当作对应MA值即可。
2. 不计算,绘制时直接不绘制对应MA即可。本项目采用这种方式。
#### MA示例代码
* 本项目中处理MA只计算MA5,MA10MA20。并且直接在Quotes中定义该三个字段,计算好之后直接赋值。
* 示例代码
```java
/**
* 计算公式:MA =(C1+C2+C3+C4+C5+...+Cn)/n,其中C为收盘价n为移动平均周期数。
* 例如现货黄金的5日移动平均价格计算方法为:MA5=(前四天收盘价+前三天收盘价+前天收盘价+昨天收盘价+今天收盘价)/5。
* 特殊的,假如数据集合中最开始的n个数据,是没法计算MAn的。这里的处理方式是不计算,绘制时直接不绘制对应MA即可。
* @param quotesList 数据集合
* @param period MAn中的n
*/
public static void calculateMA(List<Quotes> quotesList, int period) {
if (quotesList == null || quotesList.isEmpty()) return;
if (period < 0 || period > quotesList.size() - 1) return;
double sum = 0;
for (int i = 0; i < quotesList.size(); i++) {
//计算和
Quotes quotes = quotesList.get(i);
sum += quotes.c;
if (i > period - 1) {
sum -= quotesList.get(i - period).c;
}
//边界
if (i < period - 1) {
continue;
}
if (period == 5) {
quotes.ma5 = sum / period;
} else if (period == 10) {
quotes.ma10 = sum / period;
} else if (period == 20) {
quotes.ma20 = sum / period;
} else {
Log.e(TAG, "calculateMA: 没有该种periodTODO:完善Quotes");
return;
}
}
}
```
### BOLL
> 布林线,Boll,是股市技术分析的常用工具之一,通过计算股价的“标准差”,再求股价的“信赖区间”。该指标在图形上画出三条线,其中上下两条线可以分别看成是股价的压力线和支撑线,而在两条线之间还有一条股价平均线,布林线指标的参数最好设为20。一般来说,股价会运行在压力线和支撑线所形成的通道中。[[百度百科:布林线](https://baike.baidu.com/item/%E5%B8%83%E6%9E%97%E7%BA%BF/3424486?fr=aladdin)]
#### BOLL算法
* BOLL(n),指的是n单位的BOLL线。
* BOLL(n)包含三条线,中轨线(MB)、上轨线(UP)和下轨线(DN)。
* BOLL(n)计算公式:
* MA=n日内的收盘价之和÷n。
* MD=(n-1)日的平方根(C-MA)的两次方之和除以n
* MB=n1)日的MA
* UP=MB+k×MD
* DN=MBk×MD
* K为参数,可根据股票的特性来做相应的调整,一般默认为2
* 特殊的,假如数据集合中最开始的n个数据,是没法计算BOLL(n)的。这里的处理方式有两种
1. 对于最开始的n个点,直接用当日的收盘价当作当日的MA值即可。
2. 不计算,绘制时直接不绘制对应BOLL即可。本项目采用这种方式。
#### BOLL示例代码
* 本项目中处理MA只计算BOLL(26),k=2。并且直接在Quotes中定义mb、up、dn,计算好之后直接赋值。
* 示例代码
```java
/**
* BOLL(n)计算公式:
* MA=n日内的收盘价之和÷n。
* MD=(n-1)日的平方根(C-MA)的两次方之和除以n
* MB=n1)日的MA
* UP=MB+k×MD
* DN=MBk×MD
* K为参数,可根据股票的特性来做相应的调整,一般默认为2
*
* @param quotesList 数据集合
* @param period 周期,一般为26
* @param k 参数,可根据股票的特性来做相应的调整,一般默认为2
*/
public static void calculateBOLL(List<Quotes> quotesList, int period, int k) {
if (quotesList == null || quotesList.isEmpty()) return;
if (period < 0 || period > quotesList.size() - 1) return;
double mb;//上轨线
double up;//中轨线
double dn;//下轨线
//n日
double sum = 0;
//n-1日
double sum2=0;
for (int i = 0; i < quotesList.size(); i++) {
Quotes quotes = quotesList.get(i);
sum += quotes.c;
sum2+=quotes.c;
if (i > period - 1)
sum -= quotesList.get(i - period).c;
if(i>period-2)
sum2 -= quotesList.get(i - period+1).c;
//这个范围不计算,在View上的反应就是不显示这个范围的boll线
if (i < period - 1)
continue;
//n日MA
double ma = sum / period;
//n-1日MA
double ma2=sum2/(period-1);
double md = 0;
for (int j = i + 1 - period; j <= i; j++) {
//n-1日
md += Math.pow(quotesList.get(j).c - ma, 2);
}
md = Math.sqrt(md / period);
//(n1)日的MA
mb = ma2;
up = mb + k * md;
dn = mb - k * md;
quotes.mb = mb;
quotes.up = up;
quotes.dn = dn;
}
}
```