--白色线形图-->
能量潮指标(OBV)根据股市成交量来推测股价趋势。
由美国的投资分析家JoeGranville所创。
使用方法:
用法:
1.股价上升OBV线下降,买盘无力2.股价下跌OBV线上升,买盘旺盛,反弹有望3.OBV缓慢上升,买盘渐强,买进信号4.OBV急速上升,买盘力量将尽,卖出信号5.OBV线由正转负,下跌趋势,卖出信号;反之,买进信号。
Java代码:
/*
*@(#)DailyOBVIndicator.java
*
*Copyright@HangzhouShengrenSoftwareTech.Co.,Ltd.
*/
packagecom.shengrensoft.stock.model.indicator.dailyobv;
importjava.rmi.RemoteException;
importjava.text.DecimalFormat;
importjava.util.LinkedHashMap;
importjava.util.List;
importmon.util.DateUtil;
importmon.util.StkAnalysisUtil;
importcom.shengrensoft.stock.center.data.Data;
importcom.shengrensoft.stock.center.data.GettingDataList;
importcom.shengrensoft.stock.center.data.Data.DataName;
importcom.shengrensoft.stock.center.data.StkDailyK.StkDailyKData;
importcom.shengrensoft.stock.center.model.ModelParam;
importcom.shengrensoft.stock.center.model.indicator.AbstractIndicator;
importcom.shengrensoft.stock.center.model.indicator.IndicatorValue;
importcom.shengrensoft.stock.center.data.IdxDailyK.IdxDailyKData;
importcom.shengrensoft.stock.center.data.BlkDailyK.BlkDailyKData;
/**
*OBV能量潮指标的实现类。
*
*@author迅动平台2012/08/06新建
*/
publicclassDailyOBVIndicatorextendsAbstractIndicator{
/**序列版本ID*/
privatestaticfinallongserialVersionUID=6146654415916101973L;
//计算值定义
/**计算值:
能量潮指标*/
privatestaticfinalStringVALUE_OBV="O";
/**
*构造方法。
*/
publicDailyOBVIndicator()throwsRemoteException{}
/**
*取得指定时间范围内的OBV能量潮指标的值列表。
*
*@paramstkCode证券代码
*@parambeginDate起始日期
*@paramcloseDate终止日期
*@paramparamsList指标参数列表
*
*@returnOBV能量潮指标的值列表
*/
publicLinkedHashMapcalculate(
StringstkCode,
java.util.DatebeginDate,
java.util.DatecloseDate,
ListparamsList)throwsRemoteException{
//如果未指定起始日期,则返回空的值序列
if(beginDate==null){
returnnull;
}
//如果未指定终止日期,则以当前日期作为终止日期
if(closeDate==null){
closeDate=DateUtil.getSystemTime();
}
//起始日期、终止日期的前后关系检查
if(beginDate.after(closeDate)){
returnnull;
}
//判别证券代码类型(股票代码、股指代码、或板指代码),分别计算OBV能量潮指标的值序列
StkAnalysisUtilstkAnalysisUtil=super.getStkAnalysisUtil();
if(stkAnalysisUtil.isStkCode(stkCode)){
returnthis.calcStkDailyOBV(stkCode,beginDate,closeDate);
}elseif(stkAnalysisUtil.isIdxCode(stkCode)){
returnthis.calcIdxDailyOBV(stkCode,beginDate,closeDate);
}elseif(stkAnalysisUtil.isBlkCode(super.getUserId(),stkCode)){
returnthis.calcBlkDailyOBV(stkCode,beginDate,closeDate);
}else{
returnnull;
}
}
/**
*计算出指定股票指定日期范围的OBV能量潮指标的值序列。
*
*@paramstkCode股票代码
*@parambeginDate起始日期
*@paramcloseDate终止日期
*
*@returnOBV能量潮指标的值序列
*/
privateLinkedHashMapcalcStkDailyOBV(
StringstkCode,
java.util.DatebeginDate,
java.util.DatecloseDate){
//准备好指标返回值列表
LinkedHashMapindicatorValueList=
newLinkedHashMap();
//取得指定股票指定日期范围的日K数据
GettingDataListdataList=super.getUsingDataList();
Datadata=dataList.getDailyData(
DataName.StkDailyKData.getShortName(),stkCode,beginDate,closeDate);
if(data==null){
returnindicatorValueList;//表示指定日期范围内无对应的日K数据
}
//数据类型转换
StkDailyKDatadailyKData=(StkDailyKData)data;
longyestObv=0;
longobv=0;
booleanflag=true;//用来判断是否为第一天
java.util.Datedate=beginDate;
do{
//日期
StringdateStr=DateUtil.getFormatedDate(date,"yyyyMMdd");
//容错处理:
应对因系统原因导致某日该有交易日却没有交易记录的情况
Integertest=dailyKData.getOpen(dateStr);
if(test!
=null&&test!
=0){
//构造指标值对象
IndicatorValueindicatorValue=newIndicatorValue();
Integerclose=dailyKData.getClose(dateStr);
if(close!
=null&&close!
=0){
//计算OBV值
obv=dailyKData.getVolume(dateStr);//获得成交量
intchange=dailyKData.getChange(dateStr);//获得涨跌额(今收盘价-昨收盘价)
if((!
flag)&&(change>=0)){
obv=yestObv+obv;
}elseif((!
flag)&&(change<0)){
obv=yestObv-obv;
}elseif(flag){
yestObv=obv;
flag=false;
}
indicatorValue.setValue(VALUE_OBV,format(obv));
//添加指标值对象
indicatorValueList.put(date,indicatorValue);
}
}
//准备取得下一日的数据
date=super.getStkTransDateUtil().getNextTransDate(date);
if(date==null){
break;
}
}while(!
date.after(closeDate));
//返回OBV能量潮指标的值序列
returnindicatorValueList;
}
/**
*计算出指定股指指定日期范围的OBV能量潮指标的值序列。
*
*@paramidxCode股指代码
*@parambeginDate起始日期
*@paramcloseDate终止日期
*
*@returnOBV能量潮指标的值序列
*/
privateLinkedHashMapcalcIdxDailyOBV(
StringidxCode,
java.util.DatebeginDate,
java.util.DatecloseDate){
//准备好指标返回值列表
LinkedHashMapindicatorValueList=
newLinkedHashMap();
//取得指定股票指定日期范围的日K数据
GettingDataListdataList=super.getUsingDataList();
Datadata=dataList.getDailyData(
DataName.IdxDailyKData.getShortName(),idxCode,beginDate,closeDate);
if(data==null){
returnindicatorValueList;//表示指定日期范围内无对应的日K数据
}
//数据类型转换
IdxDailyKDatadailyKData=(IdxDailyKData)data;
longyestObv=0;
longobv=0;
booleanflag=true;//用来判断是否为第一天
java.util.Datedate=beginDate;
do{
//日期
StringdateStr=DateUtil.getFormatedDate(date,"yyyyMMdd");
//容错处理:
应对因系统原因导致某日该有交易日却没有交易记录的情况
Integertest=dailyKData.getOpen(dateStr);
if(test!
=null&&test!
=0){
//构造指标值对象
IndicatorValueindicatorValue=newIndicatorValue();
Integerclose=dailyKData.getClose(dateStr);
if(close!
=null&&close!
=0){
//计算OBV值
obv=dailyKData.getVolume(dateStr);//获得成交量
intchange=dailyKData.getChange(dateStr);//获得涨跌额(今收盘价-昨收盘价)
if((!
flag)&&(change>=0)){
obv=yestObv+obv;
}elseif((!
flag)&&(change<0)){
obv=yestObv-obv;
}elseif(flag){
yestObv=obv;
flag=false;
}
indicatorValue.setValue(VALUE_OBV,format(obv));
//添加指标值对象
indicatorValueList.put(date,indicatorValue);
}
}
//准备取得下一日的数据
date=super.getStkTransDateUtil().getNextTransDate(date);
if(date==null){
break;
}
}while(!
date.after(closeDate));
//返回OBV能量潮指标的值序列
returnindicatorValueList;
}
/**
*计算出指定板指指定日期范围的OBV能量潮指标的值序列。
*
*@paramblkCode扳指代码
*@parambeginDate起始日期
*@paramcloseDate终止日期
*
*@returnOBV能量潮指标的值序列
*/
privateLinkedHashMapcalcBlkDailyOBV(
StringblkCode,
java.util.DatebeginDate,
java.util.DatecloseDate){
//准备好指标返回值列表
LinkedHashMapindicatorValueList=
newLinkedHashMap();
//取得指定股票指定日期范围的日K数据
GettingDataListdataList=super.getUsingDataList();
Datadata=dataList.getDailyData(
DataName.BlkDailyKData.getShortName(),blkCode,beginDate,closeDate);
if(data==