1、(本源代码转载自迅动股票分析平台,了解更多请访问 )基于 Java 语言开发的个性化股票分析技术:移动平均线(MA)移动平均线(MA)是以道琼斯的“平均成本概念”为理论基础,采用“移动平均“的原理, 将一段时期内的股票价格平均值连成曲线,显示股价的历史波动情况,进而反映股价指数未 来发展趋势的技术分析方法。优点:显示买进和卖出信号,直观的显示价格变动大致方向。 缺点:不易把握汇价的高峰及低谷;须靠其他的技术指标的辅助。XML 描述:(本源代码转载自迅动股票分析平台,了解更多请访问 )移动平均线(MA)是以道琼斯的“平均成本概念”为理论基础,采用“移动平均“的原理,(本源代码转载自迅动股票分析平
2、台,了解更多请访问 )将一段时期内的股票价格平均值连成曲线,显示股价的历史波动情况,进而反映股价指数未来发展趋势的技术分析方法。优点:显示买进和卖出信号,直观的显示价格变动大致方向。缺点:不易把握汇价的高峰及低谷;须靠其他的技术指标的辅助。 Java 代码:/* (#)DailyMAIndicator.java* Copyright Hangzhou Shengren Software Tech. Co., Ltd.*/package com.shengrensoft.stock.model.indicator.dailyma;import java.rmi.RemoteException;i
3、mport java.text.DecimalFormat;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import mons.lang.math.NumberUtils;import mon.util.DateUtil;import mon.util.StkAnalysisUtil;import com.shengrensoft.stock.center.data.Data;import com.shengrensoft.stock.center.data.GettingDat
4、aList;import com.shengrensoft.stock.center.data.BlkDailyK.BlkDailyKData;import com.shengrensoft.stock.center.data.Data.DataName;import com.shengrensoft.stock.center.data.IdxDailyK.IdxDailyKData;import com.shengrensoft.stock.center.data.StkDailyK.StkDailyKData;import com.shengrensoft.stock.center.mod
5、el.ModelParam;import com.shengrensoft.stock.center.model.indicator.AbstractIndicator;import com.shengrensoft.stock.center.model.indicator.IndicatorValue;/* MA 移动平均线的实现类。* * author 迅动平台 2012/08/27 新建*/public class DailyMAIndicator extends AbstractIndicator (本源代码转载自迅动股票分析平台,了解更多请访问 )/* 序列版本 ID */priva
6、te static final long serialVersionUID = 6146654415916101973L;/ 参数名定义/* 参数名:超短期 */private static final String PARAM_TINY = “TINY“;/* 参数名:短期 */private static final String PARAM_SHRT = “SHRT“;/* 参数名:中期 */private static final String PARAM_MID = “MID“;/* 参数名:长期 */private static final String PARAM_LONG =
7、“LONG“;/* 参数名:超长期 */private static final String PARAM_HUGE = “HUGE“;/ 计算值定义/* 计算值:超短期 */private static final String VALUE_TINY = “T“;/* 计算值:短期 */private static final String VALUE_SHRT = “S“;/* 计算值:中期 */private static final String VALUE_MID = “M“;/* 计算值:长期 */private static final String VALUE_LONG = “
8、L“;/* 计算值:超长期 */private static final String VALUE_HUGE = “H“;/* 构造方法。*/public DailyMAIndicator() throws RemoteException /* 计算出指定时间范围内 MA 移动平均线的值序列。(本源代码转载自迅动股票分析平台,了解更多请访问 )* * param stkCode 证券代码* param beginDate 起始日期* param closeDate 终止日期* param paramsList 指标参数列表* * return MA 移动平均线的值序列*/public Link
9、edHashMap calculate (String stkCode,java.util.Date beginDate,java.util.Date closeDate,List paramsList) throws RemoteException / 如果未指定起始日期,则返回空的值序列if (beginDate = null) return null;/ 如果未指定终止日期,则以当前日期作为终止日期if (closeDate = null) closeDate = DateUtil.getSystemTime();/ 起始日期、终止日期的前后关系检查if (beginDate.after
10、(closeDate) return null;/ 取得指标的各个参数int paramTINY = 0; / 参数:超短期int paramSHRT = 0; / 参数:短期int paramMID = 0; / 参数:中期int paramLONG = 0; / 参数:长期int paramHUGE = 0; / 参数:超长期for (ModelParam param : paramsList) if (PARAM_TINY.equals(param.getShortName() paramTINY = NumberUtils.toInt(param.getValue(); else if
11、 (PARAM_SHRT.equals(param.getShortName() paramSHRT = NumberUtils.toInt(param.getValue(); else if (PARAM_MID.equals(param.getShortName() paramMID = NumberUtils.toInt(param.getValue(); else if (PARAM_LONG.equals(param.getShortName() paramLONG = NumberUtils.toInt(param.getValue();(本源代码转载自迅动股票分析平台,了解更多请
12、访问 ) else if (PARAM_HUGE.equals(param.getShortName() paramHUGE = NumberUtils.toInt(param.getValue(); else return null; / 发现一个意外的模型参数/ 判别证券代码类型(股票代码、股指代码、或板指代码),分别计算 MA 移动平均线的值序列StkAnalysisUtil stkAnalysisUtil = super.getStkAnalysisUtil();if (stkAnalysisUtil.isStkCode(stkCode) return this.calcStkDail
13、yMA(stkCode, beginDate, closeDate,paramTINY, paramSHRT, paramMID, paramLONG, paramHUGE); else if (stkAnalysisUtil.isIdxCode(stkCode) return this.calcIdxDailyMA(stkCode, beginDate, closeDate,paramTINY, paramSHRT, paramMID, paramLONG, paramHUGE); else if (stkAnalysisUtil.isBlkCode(super.getUserId(), s
14、tkCode) return this.calcBlkDailyMA(stkCode, beginDate, closeDate,paramTINY, paramSHRT, paramMID, paramLONG, paramHUGE); else return null;/* 计算出指定股票指定日期范围的 MA 移动平均线值序列。* * param stkCode 股票代码* param beginDate 起始日期* param closeDate 终止日期* param paramTINY 超短期参数* param paramSHRT 短期参数* param paramMID 中期参数*
15、 param paramLONG 长期参数* param paramHUGE 超长期参数* * return MA 移动平均线值序列*/private LinkedHashMap calcStkDailyMA(String stkCode,java.util.Date beginDate,java.util.Date closeDate,int paramTINY,(本源代码转载自迅动股票分析平台,了解更多请访问 )int paramSHRT,int paramMID,int paramLONG,int paramHUGE) / 准备好指标返回值列表LinkedHashMap indicato
16、rValueList = new LinkedHashMap();/ 取得指定股票指定日期范围的日 K 数据GettingDataList dataList = super.getUsingDataList();Data data = dataList.getDailyData(DataName.StkDailyKData.getShortName(), stkCode, beginDate, closeDate);if (data = null) return indicatorValueList; / 表示指定日期范围内无对应的日 K 数据/ 数据类型转换StkDailyKData dai
17、lyKData = (StkDailyKData) data;/ 自起始日期始至终止日期止,依次计算出各日的不同 MA 线的值List tinyCloseValueList = new ArrayList(paramTINY);List shortCloseValueList = new ArrayList(paramSHRT);List middleCloseValueList = new ArrayList(paramMID);List longCloseValueList = new ArrayList(paramLONG);List hugeCloseValueList = new A
18、rrayList(paramHUGE);/ 自起始日期始至终止日期止,依次取得各日的 MA 移动平均线的值java.util.Date date = beginDate;do / 日期格式转换(数据存储时统一使用了 yyyyMMdd 格式)String dateStr = DateUtil.getFormatedDate(date, “yyyyMMdd“);/ 容错处理:应对因系统原因导致某日该有交易记录却没有交易记录的情况Integer test = dailyKData.getOpen(dateStr);if (test != null Integer close = dailyKData
19、.getClose(dateStr);if (close != null / 新值加入int num = tinyCloseValueList.size();if (num paramTINY) tinyCloseValueList.remove(0); / 老值剔除if (tinyCloseValueList.size() = paramTINY) String tinyMA = calcAverageValue(tinyCloseValueList);indicatorValue.setValue(VALUE_TINY,tinyMA);/ 计算短期 MA 值shortCloseValueL
20、ist.add(close); / 新值加入num = shortCloseValueList.size();if (num paramSHRT) shortCloseValueList.remove(0); / 老值剔除if (shortCloseValueList.size() = paramSHRT) String shortMA = calcAverageValue(shortCloseValueList);indicatorValue.setValue(VALUE_SHRT,shortMA);/ 计算中期 MA 值middleCloseValueList.add(close); /
21、新值加入num = middleCloseValueList.size();if (num paramMID) middleCloseValueList.remove(0); / 老值剔除if (middleCloseValueList.size() = paramMID) String middleMA = calcAverageValue(middleCloseValueList);indicatorValue.setValue(VALUE_MID,middleMA);/ 计算长期 MA 值longCloseValueList.add(close); / 新值加入num = longClo
22、seValueList.size();if (num paramLONG) longCloseValueList.remove(0); / 老值剔除if (longCloseValueList.size() = paramLONG) String longMA = calcAverageValue(longCloseValueList);indicatorValue.setValue(VALUE_LONG,longMA);(本源代码转载自迅动股票分析平台,了解更多请访问 )/ 计算超长期 MA 值hugeCloseValueList.add(close); / 新值加入num = hugeCl
23、oseValueList.size();if (num paramHUGE) hugeCloseValueList.remove(0); / 老值剔除if (hugeCloseValueList.size() = paramHUGE) String hugeMA = calcAverageValue(hugeCloseValueList);indicatorValue.setValue(VALUE_HUGE,hugeMA);/ 加入一个值对象indicatorValueList.put(date,indicatorValue);/ 准备取得下一日的数据date = super.getStkTr
24、ansDateUtil().getNextTransDate(stkCode,date);if (date = null) break; while (!date.after(closeDate);/ 返回 MA 移动平均线的值序列return indicatorValueList;/* 计算出指定股指指定日期范围的 MA 移动平均线值序列。* * param idxCode 股指代码* param beginDate 起始日期* param closeDate 终止日期* param paramTINY 超短期参数* param paramSHRT 短期参数* param paramMID
25、中期参数* param paramLONG 长期参数* param paramHUGE 超长期参数* * return MA 移动平均线值序列(本源代码转载自迅动股票分析平台,了解更多请访问 )*/private LinkedHashMap calcIdxDailyMA(String idxCode,java.util.Date beginDate,java.util.Date closeDate,int paramTINY,int paramSHRT,int paramMID,int paramLONG,int paramHUGE) / 准备好指标返回值列表LinkedHashMap ind
26、icatorValueList = new LinkedHashMap();/ 取得指定股指指定日期范围的日 K 数据GettingDataList dataList = super.getUsingDataList();Data data = dataList.getDailyData(DataName.IdxDailyKData.getShortName(), idxCode, beginDate, closeDate);if (data = null) return indicatorValueList; / 表示指定日期范围内无对应的 MA 移动平均线数据/ 数据类型转换IdxDail
27、yKData dailyKData = (IdxDailyKData) data;/ 自起始日期始至终止日期止,依次计算出各日的不同 MA 线的值List tinyCloseValueList = new ArrayList(paramTINY);List shortCloseValueList = new ArrayList(paramSHRT);List middleCloseValueList = new ArrayList(paramMID);List longCloseValueList = new ArrayList(paramLONG);List hugeCloseValueLi
28、st = new ArrayList(paramHUGE);/ 自起始日期始至终止日期止,依次取得各日的 MA 移动平均线的值java.util.Date date = beginDate;do / 日期格式转换(数据存储时统一使用了 yyyyMMdd 格式)String dateStr = DateUtil.getFormatedDate(date, “yyyyMMdd“);/ 容错处理:应对因系统原因导致某日该有交易记录却没有交易记录的情况Integer test = dailyKData.getOpen(dateStr);if (test != null Integer close =
29、dailyKData.getClose(dateStr);if(close != null / 新值加入 int num = tinyCloseValueList.size();if (num paramTINY) tinyCloseValueList.remove(0); / 老值剔除if (tinyCloseValueList.size() = paramTINY) String tinyMA = calcAverageValue(tinyCloseValueList);indicatorValue.setValue(VALUE_TINY, tinyMA);/ 计算短期 MA 值short
30、CloseValueList.add(close); / 新值加入num = shortCloseValueList.size();if (num paramSHRT) shortCloseValueList.remove(0); / 老值剔除if (shortCloseValueList.size() = paramSHRT) String shortMA = calcAverageValue(shortCloseValueList);indicatorValue.setValue(VALUE_SHRT, shortMA);/ 计算中期 MA 值middleCloseValueList.ad
31、d(close); / 新值加入num = middleCloseValueList.size();if (num paramMID) middleCloseValueList.remove(0); / 老值剔除 if (middleCloseValueList.size() = paramMID) String middleMA = calcAverageValue(middleCloseValueList);indicatorValue.setValue(VALUE_MID, middleMA);/ 计算长期 MA 值longCloseValueList.add(close); / 新值加
32、入 num = longCloseValueList.size();if (num paramLONG) longCloseValueList.remove(0); / 老值剔除(本源代码转载自迅动股票分析平台,了解更多请访问 )if (longCloseValueList.size() = paramLONG) String longMA = calcAverageValue(longCloseValueList);indicatorValue.setValue(VALUE_LONG, longMA);/ 计算超长期 MA 值hugeCloseValueList.add(close); /
33、新值加入num = hugeCloseValueList.size();if (num paramHUGE) hugeCloseValueList.remove(0); / 老值剔除 if (hugeCloseValueList.size() = paramHUGE) String hugeMA = calcAverageValue(hugeCloseValueList);indicatorValue.setValue(VALUE_HUGE, hugeMA);/ 加入一个值对象indicatorValueList.put(date, indicatorValue);/ 准备取得下一日的数据da
34、te = super.getStkTransDateUtil().getNextTransDate(date); / 随大盘if (date = null) break; while (!date.after(closeDate);/ 返回 MA 移动平均线的值序列return indicatorValueList;/* 计算出指定板指指定日期范围的 MA 移动平均线值序列。* * param blkCode 板指代码* param beginDate 起始日期* param closeDate 终止日期* param paramTINY 超短期参数(本源代码转载自迅动股票分析平台,了解更多请
35、访问 )* param paramSHRT 短期参数* param paramMID 中期参数* param paramLONG 长期参数* param paramHUGE 超长期参数* * return MA 移动平均线值序列*/private LinkedHashMap calcBlkDailyMA(String blkCode,java.util.Date beginDate,java.util.Date closeDate,int paramTINY,int paramSHRT,int paramMID,int paramLONG,int paramHUGE) / 准备好指标返回值列表
36、LinkedHashMap indicatorValueList = new LinkedHashMap();/ 取得指定板指(当前用户的或系统默认的)指定日期范围的日 K 数据GettingDataList dataList = super.getUsingDataList();Data data = dataList.getDailyData(DataName.BlkDailyKData.getShortName(), blkCode, beginDate, closeDate);if (data = null) return indicatorValueList; / 表示指定日期范围内
37、无对应的 MA 移动平均线数据/ 数据类型转换BlkDailyKData dailyKData = (BlkDailyKData) data;/ 自起始日期始至终止日期止,依次计算出各日的不同 MA 线的值List tinyCloseValueList = new ArrayList(paramTINY);List shortCloseValueList = new ArrayList(paramSHRT);List middleCloseValueList = new ArrayList(paramMID);List longCloseValueList = new ArrayList(pa
38、ramLONG);List hugeCloseValueList = new ArrayList(paramHUGE);/ 自起始日期始至终止日期止,依次取得各日的 MA 移动平均线的值java.util.Date date = beginDate;do / 日期格式转换(数据存储时统一使用了 yyyyMMdd 格式)(本源代码转载自迅动股票分析平台,了解更多请访问 )String dateStr = DateUtil.getFormatedDate(date, “yyyyMMdd“);/ 容错处理:应对因系统原因导致某日该有交易记录却没有交易记录的情况Integer test = daily
39、KData.getOpen(dateStr);if (test != null Integer close = dailyKData.getClose(dateStr);if(close != null / 新值加入 int num = tinyCloseValueList.size();if (num paramTINY) tinyCloseValueList.remove(0); / 老值剔除if (tinyCloseValueList.size() = paramTINY) String tinyMA = calcAverageValue(tinyCloseValueList);indi
40、catorValue.setValue(VALUE_TINY, tinyMA);/ 计算短期 MA 值shortCloseValueList.add(close); / 新值加入num = shortCloseValueList.size();if (num paramSHRT) shortCloseValueList.remove(0); / 老值剔除if (shortCloseValueList.size() = paramSHRT) String shortMA = calcAverageValue(shortCloseValueList);indicatorValue.setValue
41、(VALUE_SHRT, shortMA);/ 计算中期 MA 值middleCloseValueList.add(close); / 新值加入num = middleCloseValueList.size();if (num paramMID) middleCloseValueList.remove(0); / 老值剔除 if (middleCloseValueList.size() = paramMID) String middleMA = calcAverageValue(middleCloseValueList);indicatorValue.setValue(VALUE_MID, m
42、iddleMA);(本源代码转载自迅动股票分析平台,了解更多请访问 )/ 计算长期 MA 值longCloseValueList.add(close); / 新值加入 num = longCloseValueList.size();if (num paramLONG) longCloseValueList.remove(0); / 老值剔除if (longCloseValueList.size() = paramLONG) String longMA = calcAverageValue(longCloseValueList);indicatorValue.setValue(VALUE_LON
43、G, longMA);/ 计算超长期 MA 值hugeCloseValueList.add(close); / 新值加入num = hugeCloseValueList.size();if (num paramHUGE) hugeCloseValueList.remove(0); / 老值剔除 if (hugeCloseValueList.size() = paramHUGE) String hugeMA = calcAverageValue(hugeCloseValueList);indicatorValue.setValue(VALUE_HUGE, hugeMA);/ 加入一个值对象ind
44、icatorValueList.put(date, indicatorValue);/ 准备取得下一日的数据date = super.getStkTransDateUtil().getNextTransDate(date); / 随大盘if (date = null) break; while (!date.after(closeDate);/ 返回 MA 移动平均线的值序列return indicatorValueList;/*(本源代码转载自迅动股票分析平台,了解更多请访问 )* 计算 N 日内收盘价的平均值。* * params closeValueList N 日内的收盘价列表* *
45、return N 日内收盘价的平均值*/private String calcAverageValue(List closeValueList) if (closeValueList = null | closeValueList.size() = 0) return “0.00“;int total = 0;for (Integer closeValue : closeValueList) total += closeValue;Float average = total * 1F / closeValueList.size();return format(average);/* 将浮点数转
46、化为带两位小数的字符串。* * param floatValue 浮点数* * return 格式化字符串(带二位小数)*/private String format(Float floatValue) if (floatValue = null) return “0.00“; else return new DecimalFormat(“#.00“).format(floatValue / 100F); /分=元/* 计算方法:将某一时间段的收盘股价或收盘指数相加的总和,除以时间周期,即得到这一时间的平均线。如 5 日移动平均线,就是将近 5 日的收盘价相加除以 5,得到的就是第一个 5 日平均线的值 ,再将第一个 5 日平均线乘以 5 减去第一日的收盘价加上第 6 日的收盘价,其总和除以 5 得到的就是第二个 5 日平均线值,将计算得到的平均数画在坐标图上连成线,即是 5 日平均线。(本源代码转载自迅动股票分析平台,了解更多请访问 )其他移动平均线的计算方法以此类推。*/ 迅动股票分析平台 股票分析技术 杭州胜人软件技术有限公司 版权所有