代码段如下:

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版本实现 包含测试用例相关推荐

  1. java 哈希算法_选择Java密码算法第1部分-哈希

    java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...

  2. 6种java垃圾回收算法_学习java垃圾回收

    垃圾回收(GC)一直是Java受欢迎背后的重要特性之一.垃圾回收是Java中用于释放未使用的内存的机制.本质上,它追踪所有仍在使用的对象,并将剩下的标记为垃圾.Java的垃圾回收被认为是一种自动内存管 ...

  3. java 实现macd算法_java尝试编写macd,试验顶背离底背离

    MACD是查拉尔·阿佩尔(Geral Appel)于1979年提出的,由一快及一慢指数移动平均(EMA)之间的差计算出来."快"指短时期的EMA,而"慢"则指长 ...

  4. 学Java可以不学算法吗-学java有必要学算法吗?

    按理来说,只要你工作没有需要,当然可以不学算法,其实大部分java程序员确实都不会算法,但是,我要说但是: 如果开发一个非常复杂而且有高并发的大型系统,必然会在系统中使用算法,看出算法对于Java程序 ...

  5. java数据结构与算法面试,java面试手写代码

    前言 总有一天你会明白,你的努力终究没有白费 年前辞职,人算不如天算,突如其来的疫情完全把自己的计划给打碎了,面试难度简直不亚于一场江苏高考题,后悔.焦虑不安.失眠成了我的生活状态. 从三月底开始投递 ...

  6. java dbscan_聚类算法之DBScan(Java实现)

    DBScan是一种基于密度的聚类算法,它有一个核心点的概念:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点.核心和它Eps范围内的邻居形成一个簇.在一个簇内如果出现多个点都 ...

  7. java五子棋的算法_初学java,写了一个五子棋算法的类,请大家多多指教.

    //五子棋算法类, /*看了一下QQ上面五子棋,直到有五子连珠才给出谁胜 *俺也这么做 *开始分析,先只考虑实现,不考虑效益,然后再对算法进行优化 *========================= ...

  8. java实现apriori算法_用Java实现插入排序算法

    前言 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止. 代码 package 总结 点击关注不迷路哦

  9. java aes解密算法_使用java实现AES算法的加解密(亲测可用)

    话不多说,直接上代码 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto ...

  10. Java面试准备:15个Java面试问题

    并非所有的访谈都将重点放在算法和数据结构上-通常,访谈通常只侧重于您声称是专家的语言或技术.在此类访谈中,通常没有任何"陷阱"问题,而是它们要求您利用内存和使用该语言的经验–换句话 ...

最新文章

  1. LeetCode简单题之字符串转化后的各位数字之和
  2. Java云托管服务的开支削减策略
  3. 编写高性能的 JavaScript 程序的几个提示
  4. 如何写一个脚本语言_如何写一个Nx schematic plugin?
  5. python学习手册笔记——22.模块代码编写基础
  6. MYSQL两个数据库字符集保持一致问题
  7. java中printarray和selectsort方法_算法题(一)
  8. java面试题十三 string创建了几个对象
  9. 在statspack显示完整的SQL
  10. html自动滑动轮播代码,html+css+js 实现自动滑动轮播图
  11. 怎样运行python_怎样运行python
  12. 单片机牛人的学习经历
  13. windows server 2016安装网卡驱动【引用】
  14. 罗技无法使用计算机上的配置文件,Win10专业版罗技无线鼠标无法使用咋办?
  15. overleaf表格_latex插入表格心得
  16. 大数据数据挖掘与云计算-认识大数据
  17. c语言alpha通道的用法,alpha通道最主要的用途是什么
  18. web asp.net 发布网站和配置iis(win10)
  19. 服务器抓不到mrcp协议,MRCP协议学习笔记-语音识别资源的概括和全部Methods
  20. Kaldi中如何使用已经训练好的模型进行语音识别ASR呢?

热门文章

  1. 笔记本计算机摄像头怎么打开方式,笔记本的摄像头怎么打开,手把手教你笔记本电脑摄像头如何打开...
  2. LoRa技术-什么是LoRa
  3. 如何写一份前端开发简历
  4. 微软自带比对神器,快速比对两个表格-高效好用又简单(99.9%的人没听说过)
  5. js上传插件uploadify自动检测不到flash控件的问题
  6. activity多实例任务节点审批
  7. 互联网周刊:草根创业选择题
  8. C语言实现根据用户输入的整数求和(两种方法)
  9. 新手小白零基础,该怎样学习编程呢?
  10. c++win32项目 如何显示后再删除一个绘图_50个CAD绘图小技巧,来get成倍提高绘图效率...