java 实现macd算法_macd 的java版本实现 包含测试用例
代码段如下:
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 财经数据指标工具类
*/
public class FinanceIndicatorsTools {
private static BigDecimal two = new BigDecimal(2);
/**
* Calculate EMA,
*
* @param list
* :Price list to calculate,the first at head, the last at tail.
* @return
*/
public static final BigDecimal getEXPMAV1(final Listlist, final int number) {
// 开始计算EMA值,
BigDecimal k = two.divide(new BigDecimal(number +1),2,RoundingMode.HALF_UP); 计算出序数
BigDecimal ema = list.get(0);// 第一天ema等于当天收盘价
for (int i = 1; i < list.size(); i++) {
// 第二天以后,当天收盘 收盘价乘以系数再加上昨天EMA乘以系数-1
ema = list.get(i).multiply(k).add(ema.multiply(BigDecimal.ONE.subtract(k)) ) ;
}
return ema;
}
/**
* DEA:离差平均值。今日DEA = (前一日DEA) * ((N-1)/(N+1)) + (今日DIF) * 2/(N+1))
*/
public static final BigDecimal getMyDea(final ListdiffList, final int N) {
BigDecimal fix02 = two.divide(new BigDecimal(N+1),2,RoundingMode.HALF_UP);
if(diffList.size() == 1){
return fix02.multiply(diffList.get(0));
}else {
BigDecimal fix08 = new BigDecimal(N-1).divide(new BigDecimal(N+1),2,RoundingMode.HALF_UP);
BigDecimal right = fix02.multiply(diffList.get(diffList.size() -1)) ;
Listsublist = diffList.subList(0,diffList.size()-1);
BigDecimal left = fix08.multiply(getMyDea(sublist,N));
return left.add(right);
}
}
/**
* 参考文章:
* https://blog.csdn.net/u014427812/article/details/37508179(原理)
* https://www.cnblogs.com/xhqgogogo/p/3386426.html(实现篇,有点糙,根据上面的原理优化了)
*
* @param list
* @param number
* @return
*/
public static final BigDecimal getMyEXPMA(final Listlist, final int number) {
if(list.size() == 1){
return list.get(0);
}else {
Listsublist = list.subList(0,list.size()-1);
BigDecimal left = two.multiply(list.get(list.size()-1)).divide(new BigDecimal(number +1),2,RoundingMode.HALF_UP);
BigDecimal last = getMyEXPMA( sublist, number);//递归调用
BigDecimal right = new BigDecimal(number -1).multiply(last).divide(new BigDecimal(number +1),2,RoundingMode.HALF_UP);
return left .add(right);
}
}
/**
* calculate MACD values
*
* @param list
* :Price list to calculate,the first at head, the last at tail.
* @param shortPeriod 12
* :the short period value.
* @param longPeriod 26
* :the long period value.
* @param midPeriod 9
* :the mid period value.
* @return
*/
public static final HashMapgetMACDV1(final Listlist, final int shortPeriod, final int longPeriod, int midPeriod) {
HashMapmacdData = new HashMap<>();
ListdiffList = new ArrayList();
BigDecimal shortEMA = BigDecimal.ZERO;
BigDecimal longEMA = BigDecimal.ZERO;
BigDecimal dif = BigDecimal.ZERO;
BigDecimal dea = BigDecimal.ZERO;
for (int i = list.size() - 1; i >= 0; i--) {
Listsublist = list.subList(0, list.size() - i);
shortEMA = getMyEXPMA(sublist, shortPeriod);
longEMA = getMyEXPMA(sublist, longPeriod);
dif = shortEMA.subtract(longEMA);
diffList.add(dif);
}
dea = getMyDea(diffList, midPeriod);
dea = dea.setScale(2,BigDecimal.ROUND_HALF_DOWN);
dif = dif.setScale(2,BigDecimal.ROUND_HALF_DOWN);
BigDecimal MACD = two.multiply (dif.subtract(dea));
MACD = MACD.setScale(2,BigDecimal.ROUND_HALF_DOWN);
macdData.put("DIF", dif);
macdData.put("DEA", dea);
macdData.put("MACD",MACD);
return macdData;
}
}
测试用例如下,数据是从数据库中查询历史交易数据:
import com.alibaba.fastjson.JSON;
import com.gxkj.projects.myschoolx.nentitys.JczxPstock2402Trade;
import com.gxkj.projects.myschoolx.utils.FinanceIndicatorsTools;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
public class FinanceIndicatorsToolsTest extends BaseSpringTest {
Logger logger = LoggerFactory.getLogger(FinanceIndicatorsToolsTest.class);
@Autowired
private JczxPstock2402TradeService jczxPstock2402TradeService;
@Test
public void getMyEXPMATestV2(){
/**
* 整理数据最好是5*daysize或者是3.45*(N+1)天的数据
*/
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
int manDaySize = 26;
int kuaiDaySize = 12;
int avgDaySize = 9;
//数据库查询日交易数据
ListtradeList = jczxPstock2402TradeService.findLastSizeBySecCode("600004",manDaySize*5);
if(tradeList != null ) {
// 反转lists,实现交易日期从小到大排列
Collections.reverse(tradeList);
int length = tradeList.size();
for(int i=0;ilist = new ArrayList<>();
int localLength = tradeList.size();
BigDecimal F007N = null;
Date lastDate = tradeList.get(localLength-1).getTRADEDATE();
String lastFormatDate = sdf.format(lastDate);
for(int jx =0;jx < localLength;jx++){
F007N = tradeList.get(jx).getF007N();
if(F007N != null ){
list.add(F007N);
}
}
HashMap result = FinanceIndicatorsTools.getMACDV1(list,12,26,9);
logger.info("测试计算移动平均线"+lastFormatDate+ JSON.toJSONString(result));
tradeList.remove(tradeList.size()-1);
length = tradeList.size();
}
}
}catch (Exception e){
e.printStackTrace();
logger.error("测试计算移动平均线异常",e);
}
}
}
请大家有任何优化方案可以一起分享,并持续更新
java 实现macd算法_macd 的java版本实现 包含测试用例相关推荐
- java 哈希算法_选择Java密码算法第1部分-哈希
java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...
- 6种java垃圾回收算法_学习java垃圾回收
垃圾回收(GC)一直是Java受欢迎背后的重要特性之一.垃圾回收是Java中用于释放未使用的内存的机制.本质上,它追踪所有仍在使用的对象,并将剩下的标记为垃圾.Java的垃圾回收被认为是一种自动内存管 ...
- java 实现macd算法_java尝试编写macd,试验顶背离底背离
MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一慢指数移动平均(EMA)之间的差计算出来."快"指短时期的EMA,而"慢"则指长 ...
- 学Java可以不学算法吗-学java有必要学算法吗?
按理来说,只要你工作没有需要,当然可以不学算法,其实大部分java程序员确实都不会算法,但是,我要说但是: 如果开发一个非常复杂而且有高并发的大型系统,必然会在系统中使用算法,看出算法对于Java程序 ...
- java数据结构与算法面试,java面试手写代码
前言 总有一天你会明白,你的努力终究没有白费 年前辞职,人算不如天算,突如其来的疫情完全把自己的计划给打碎了,面试难度简直不亚于一场江苏高考题,后悔.焦虑不安.失眠成了我的生活状态. 从三月底开始投递 ...
- java dbscan_聚类算法之DBScan(Java实现)
DBScan是一种基于密度的聚类算法,它有一个核心点的概念:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点.核心和它Eps范围内的邻居形成一个簇.在一个簇内如果出现多个点都 ...
- java五子棋的算法_初学java,写了一个五子棋算法的类,请大家多多指教.
//五子棋算法类, /*看了一下QQ上面五子棋,直到有五子连珠才给出谁胜 *俺也这么做 *开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化 *========================= ...
- java实现apriori算法_用Java实现插入排序算法
前言 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止. 代码 package 总结 点击关注不迷路哦
- java aes解密算法_使用java实现AES算法的加解密(亲测可用)
话不多说,直接上代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto ...
- Java面试准备:15个Java面试问题
并非所有的访谈都将重点放在算法和数据结构上-通常,访谈通常只侧重于您声称是专家的语言或技术.在此类访谈中,通常没有任何"陷阱"问题,而是它们要求您利用内存和使用该语言的经验–换句话 ...
最新文章
- LeetCode简单题之字符串转化后的各位数字之和
- Java云托管服务的开支削减策略
- 编写高性能的 JavaScript 程序的几个提示
- 如何写一个脚本语言_如何写一个Nx schematic plugin?
- python学习手册笔记——22.模块代码编写基础
- MYSQL两个数据库字符集保持一致问题
- java中printarray和selectsort方法_算法题(一)
- java面试题十三 string创建了几个对象
- 在statspack显示完整的SQL
- html自动滑动轮播代码,html+css+js 实现自动滑动轮播图
- 怎样运行python_怎样运行python
- 单片机牛人的学习经历
- windows server 2016安装网卡驱动【引用】
- 罗技无法使用计算机上的配置文件,Win10专业版罗技无线鼠标无法使用咋办?
- overleaf表格_latex插入表格心得
- 大数据数据挖掘与云计算-认识大数据
- c语言alpha通道的用法,alpha通道最主要的用途是什么
- web asp.net 发布网站和配置iis(win10)
- 服务器抓不到mrcp协议,MRCP协议学习笔记-语音识别资源的概括和全部Methods
- Kaldi中如何使用已经训练好的模型进行语音识别ASR呢?
热门文章
- 笔记本计算机摄像头怎么打开方式,笔记本的摄像头怎么打开,手把手教你笔记本电脑摄像头如何打开...
- LoRa技术-什么是LoRa
- 如何写一份前端开发简历
- 微软自带比对神器,快速比对两个表格-高效好用又简单(99.9%的人没听说过)
- js上传插件uploadify自动检测不到flash控件的问题
- activity多实例任务节点审批
- 互联网周刊:草根创业选择题
- C语言实现根据用户输入的整数求和(两种方法)
- 新手小白零基础,该怎样学习编程呢?
- c++win32项目 如何显示后再删除一个绘图_50个CAD绘图小技巧,来get成倍提高绘图效率...