最近进行的项目需要实现EMA和MACD,但苦于互联网上没有具体的实现算法。 所以我自己试着做了一套。
对照直通等主要股票分析软件和结果,将其开源放在GitHub上,包括Junit测试用例。
GitHub地址: https://github.com/wizard Byron/finance-indicators
//*
*计算Ema,
*
* @param list
* :Price list to calculate,the first at head,the last at tail。
* @return
*/
publicstaticfinaldoublegetexpma (finallistlist,final int number ) {
开始计算//EMA值,
双精度=2.0/(编号1.0 ); 计算//序号
双精度EMA=list.get (0; //第一天的ema等于当天的收盘价
for(intI=1; i list.size (; I ) {
//第二天以后,当天收盘价乘以系数,进而昨天的EMA乘以系数-1
EMA=list.get(I ) *kEMA ) (1-k );
}
返回Ema;
}
//*
*计算标记值
*
* @param list
* :Price list to calculate,the first at head,the last at tail。
* @param shortPeriod
* : the短周期值。
* @param longPeriod
* : the长周期值。
* @param midPeriod
* :the mid period value。
* @return
*/
publicstaticfinalhashmapgetmacd (finallistlist,final int shortPeriod,final int longPeriod,int midPeriod ) {
HashMap macdData=new HashMap (;
列表差异列表=new ArrayList (;
双短整型EMA=0.0;
双长行程=0.0;
双精度dif=0.0;
双缉毒=0.0;
for(intI=list.size ) (- 1; i=0; I---- ) {
listsublist=list.sublist(0,list.size ) (- i );
short EMA=indicators.getexpma (sublist,shortPeriod );
longema=indicators.getexpma (sublist,longPeriod );
dif=短EMA-longema;
difflist.add(dif );
}
DEA=indicators.getexpma (diff list,midPeriod );
MACDdata.put(dif )、dif );
MACDdata.put(dea )、DEA );
MACDdata.put(MACD ),(dif - dea ) ) 2;
返回制造数据;
}