In the spirit of open source ....

here's a routine I coded awhile back ... may be some use to fellow data junkies ...


public Period getPeriod(String symbol,int tdays, MarketDay[] tradedays, Period prevPeriod){

Period period = new Period(symbol,tdays,prevPeriod);

float prevmax = 0;
float prevmin = 0;
float prevclose = 0;
float prevopen = 0;
long prevvol = 0;
float prevrs = 0;
float prevrsi = 0;
float prevrsigain = 0;
float prevrsiloss = 0;
float prevendvol = 0;

period.DX = 0;
period.ADX = 0;
period.symbol = symbol;

if (prevPeriod.Exists){
prevmax = prevPeriod.startmax;
prevmin = prevPeriod.startmin;
prevclose = prevPeriod.startclose;
prevopen = prevPeriod.startopen;
prevvol = prevPeriod.startvol;
prevrs = prevPeriod.RS;
prevrsi = prevPeriod.RSI;
prevrsigain = prevPeriod.RSIGAIN;
prevrsiloss = prevPeriod.RSILOSS;
}

try{
int up = 0;
int down = 0;
float vols = 0;
float pvols = 0;
float posDI = 0;
float negDI = 0;
float posSDI = 0;
float negSDI = 0;
float sma = 0;
float ema = 0;
float recs = 0;
float momntm = 0;
float loss = 0;
float gain = 0;
float days = tdays;
float TR = 0;

float posDM = 0;
float negDM = 0;
float curmax = 0;
float curmin = 0;
float curclose = 0;
float curopen = 0;
String curdate;
int curvol = 0;
float accm = 0;
float[] cl = new float[tdays];
int dy = 0;
float sumtypicals = 0;
float[] typicals = new float[tdays];
float sATR = 0;

period.ATR = 0 ;
period.SWA = 0;
period.SMA = 0;
period.EMA = 0;

int hiday = 0;
int loday = 0;
int newhghs = 0;
int newlws = 0;
int gns = 0;
int lss = 0;

int dnm = 0;
for (int i = 1; i<tdays+1; i++){
dnm += i;
}

float pbpp = 0;
float nbpp = 0;
int h,l;

double X = 0;

for (int i = 0; i<tdays; i++){

posDM = 0;
negDM = 0;

curdate = tradedays.qdate;
curopen = tradedays.open;
curclose = tradedays.close;
curmax = tradedays.maxprice;
curmin = tradedays.minprice;
curvol = tradedays.volume;

if ((period.minprice==0) || (period.minprice>curmin)){
period.minprice = curmin;
h = i+1;
}

if (period.maxprice<curmax){
period.maxprice = curmax;
l = i+1;
}

if (i==0){
period.sdate = curdate;
period.startdate = sdf.parse(curdate);
period.startopen = curopen;
period.startclose = curclose;
period.startmax = curmax;
period.startmin = curmin;
period.startvol = curvol;
}
if (i==tdays-1){
period.edate = curdate;
period.enddate = sdf.parse(curdate);
period.endopen = curopen;
period.endclose = curclose;
period.endmax = curmax;
period.endmin = curmin;
period.endvol = curvol;
}

period.volume += curvol;

if (prevPeriod.Exists){

//SET BPP ================================
if (i>0){
if ((curclose > prevclose)){
period.PBPP += (float)(i+1)/dnm*100;
}else{
period.NBPP += (float)(i+1)/dnm*100;
}
}else{
if ((curclose > prevPeriod.startclose)){
period.PBPP += (float)(i+1)/dnm*100;
}else{
period.NBPP += (float)(i+1)/dnm*100;
}
}

//SET DX===========================
if (curmax>prevmax){
posDM = (curmax - prevmax);
}
if (curmin<prevmin){
negDM = (prevmin - curmin);
}

if (posDM>negDM){
negDM = 0;
}else if (posDM < negDM){
posDM = 0;
}else{
posDM = negDM = 0;
}
//==================================

//SET ATR===========================
float a = Math.abs(curmin - prevclose);
float b = Math.abs(curmax - prevclose);
float c = Math.abs(curmax - curmin);
float d = 0;

if (a>b){
if (a>c){d = a;
}else{d = c;}
}else{
if (b>c){d = b;
}else{d = c;}
}

TR = d;
sATR +=TR;
//==================================

//SET DX============================
if (TR != 0){
posSDI += posDM;
negSDI += negDM;
}
//==================================

//SET RSI===========================
if (curclose>prevclose){
gain += (curclose-prevclose);
}else{
loss += (prevclose-curclose);
}
//===================================

period.velocity += curclose - prevclose;

//SET ACCUMULATION===================
if (curmax != curmin){
period.accumulation += Math.abs(curvol * ((curclose - curmin) - (curmax - curclose))/(curmax-curmin));
}
//===================================

//SET CCI============================
cl[dy] = curclose;
typicals[dy] = (curmax+curmin+curclose)/3;
sumtypicals += typicals[dy];

dy++;
//====================================

//SET HVA============================
X += Math.log((double)(curclose/prevclose));
//===============================

}

//SET SMA, WMA==========================
sma += curclose;
vols += curvol;
pvols += ((Math.abs(curclose-curopen)/2)+curopen) * curvol;

//set prev as cur
prevmax = curmax;
prevmin = curmin;
prevclose = curclose;
prevopen = curopen;
prevvol = curvol;


}
// end loop through period Quotes=====================

period.dvolume = period.volume/tdays;

//SET AROONUP=========================
//ARNUP = (float)h/(tdays*100);
//====================================
//SET AROONDWN========================
//ARNDWN = (float)l/(tdays*100);
//====================================
//ARNOS = ARNUP - ARNDWN;
//====================================

// set stochastics ===================================
if (period.maxprice!=period.minprice){
period.stochk = 100 * (period.endclose - period.minprice) / (period.maxprice - period.minprice);
}

if (!prevPeriod.Exists){
period.stochs[0] =period.stochk;
}

int sint = 3;

for (int i = sint-1; i>0; i--){
period.stochs = prevPeriod.stochs[i-1];
}
period.stochs[0] = period.stochk;

float sd = 0;
boolean b = true;

for (int j=0; j<sint; j++){
if (period.stochs[j] == 0){
b = false;
}
sd += period.stochs[j];
}

if (b){
period.stochd = sd / sint;
}
//====================================================

if (period.endclose>period.startclose){
period.uptrend = true;
}else{
period.uptrend = false;
}

if (period.startclose!=0){
period.momentum = (period.endclose/period.startclose) * 100;
}

//SET SWA=============================
if (vols!=0){
period.SWA = pvols / vols;
}else{
period.SWA = 0;
}
//====================================

//SET SMA=============================
period.SMA = sma / days;
//====================================

if (!prevPeriod.Exists){
//SET EMA as SMA for first period
period.EMA = period.SMA;
}
 
if (prevPeriod.Exists){

//SET ATR============================
period.ATR = (float)(sATR / days);
//===================================

//SET DX =============================
if (sATR!=0){
posDI = posSDI / sATR;
negDI = negSDI / sATR;
}

if ((posDI + negDI)!=0){
period.DX = ((float)(Math.abs(posDI - negDI))/(Math.abs(posDI + negDI))) * 100;
}
//====================================

//SET RSI=============================
if ((prevPeriod.RSILOSS==0) && (prevPeriod.RSIGAIN==0)){
if ((loss!=0)){
period.RSIGAIN = gain/days;
period.RSILOSS = loss/days;
period.RS = (period.RSIGAIN/period.RSILOSS);
period.RSI = 100 - (100/(1+period.RS));
}
}else{
float curgain = 0;
float curloss = 0;

if (period.endclose>prevPeriod.endclose){
curgain = (period.endclose-prevPeriod.endclose);
}else{
curloss = (prevPeriod.endclose-period.endclose);
}

float rsig = ((prevrsigain * (days-1)) + curgain)/days;
float rsil = ((prevrsiloss * (days-1)) + curloss)/days;

if ((rsil!=0)){
period.RS = rsig/rsil;
period.RSI = 100 - (100/(1+period.RS));
period.RSIGAIN = rsig;
period.RSILOSS = rsil;
}
}
//===================================

//SET CCI============================
double tmp = 0;
double typ = 0;
double avetypc = (double)sumtypicals/tdays;
double x = 0;

//sum for each tday in period
//X += Math.log((double)(curclose/prevclose));

X = X/tdays;


for (int z=0; z<tdays; z++){
//tmp += (Math.exp(cl[z] - period.SMA));
tmp += (cl[z] - period.SMA)*(cl[z] - period.SMA);
typ += (Math.abs(typicals[z] - avetypc));
if (z > 0){
x += Math.pow((Math.log((float)(cl[z]/cl[z-1])) - X),2);
}else{
x = Math.pow((Math.log((float)(period.startclose/prevPeriod.startclose)) - X),2);
}
}

double typc = typ / tdays;

if (typc != 0){
period.CCI = (typicals[tdays-1] - avetypc)/(.015 * typc);
}
//====================================

double df = (double)252/period.tdays;
//SET HVA============================
period.HV = Math.sqrt((double)(x/(period.tdays-1)));
//period.AHV = 100*period.HV*(df);
period.HV = 100*period.HV;

// 'ditching' the mean
// HV = Math.sqrt(Math.sq(x)/period.tdays);
period.AHV = period.HV * 15.8745;
//===============================

//SET Standard Deviation==============
period.StdDev = Math.sqrt((float)tmp/(tdays-1));
//====================================

//SET BOLLINGER BANDS=================
if (period.StdDev<100000){
period.upperband = period.SMA + (period.numOfStdDev * period.StdDev);
period.lowerband = period.SMA - (period.numOfStdDev * period.StdDev);
}
//====================================


//SET EMA=============================
float t = tdays;
float multipler = (float)2/(t+1);
period.EMA = ((period.endclose - prevPeriod.EMA) * multipler) + prevPeriod.EMA;
//====================================

//SET PRICE ACCELARATION==============
period.acceleration = period.velocity - prevPeriod.velocity;
//===================================

//set stoch moves=======================
period.stdmv = period.stochd - prevPeriod.stochd;
period.stkmv = period.stochk - prevPeriod.stochk;
//======================================

}

for (int i = 0; i < period.tdays; i++){

}


period.perup = ((period.endclose - period.startclose)/period.startclose)*100;

period.periodId = period.symbol + ((period.sdate.replaceAll("/","")).replaceAll(":","")).replaceAll(" ","") + tdays;

}catch(Exception e){
e.printStackTrace();
}

return period;

}
 
Back
Top