/*
* -------------------------------------------------------------------------
* $Id: Database.java,v 1.13 2004/05/26 19:20:42 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.WallStreet;
import java.util.*;
import java.io.*;
/**
*
* @author brophy
* @created January 24, 2002
*/
class Database implements Serializable {
static final long serialVersionUID = -4975277050625648285L;
private HashMap hashSeries;
/** Creates new Database */
public Database(String filename) throws Exception {
readAll(filename);
}
void save(String filename) throws IOException {
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this);
oos.close();
fos.close();
}
static Database load(String filename) throws IOException {
return load(new FileInputStream(filename));
}
static Database load(InputStream is) throws IOException {
try {
ObjectInputStream ois = new ObjectInputStream(is);
Database db = (Database)ois.readObject();
ois.close();
return db;
} catch (ClassNotFoundException e) {
System.out.println("Error loading database: "+e.getMessage());
e.printStackTrace();
return null;
}
}
public String[] getTickers() {
Set keys = hashSeries.keySet();
SortedSet ss = new TreeSet();
Iterator iter = keys.iterator();
while (iter.hasNext()) {
ss.add(iter.next());
}
return (String[])ss.toArray(new String[0]);
}
public Series getSeries(String ticker) {
return (Series)hashSeries.get(ticker);
}
public Series getSeries(String ticker, int period, int interval) {
Series daily = getSeries(ticker);
ListSeries listSeries = new ListSeries();
GregorianCalendar calStart = new GregorianCalendar(2002, 0, 23);
switch (interval) {
case Model.INTERVAL_MONTH:
calStart.add(GregorianCalendar.MONTH, -1);
break;
case Model.INTERVAL_YEAR:
calStart.add(GregorianCalendar.YEAR, -1);
break;
case Model.INTERVAL_QUARTER:
calStart.add(GregorianCalendar.MONTH, -3);
break;
case Model.INTERVAL_WEEK:
calStart.add(GregorianCalendar.DATE, -7);
break;
}
GregorianCalendar cal = new GregorianCalendar();
int lastPeriod = -1;
double open = 0;
double close = 0;
double high = 0;
double low = 0;
double volume = 0;
Date startDate = null;
for (int k = 0; k < daily.date.length; k++) {
Date date = new java.util.Date((long)daily.date[k]);
cal.setTime(date);
if (cal.before(calStart)) continue;
int thisPeriod = cal.get(period);
if (thisPeriod != lastPeriod) {
if (lastPeriod != -1) {
listSeries.add(startDate, high, low, close, open, volume);
}
startDate = date;
open = daily.open[k];
close = daily.close[k];
high = daily.high[k];
low = daily.low[k];
volume = daily.volume[k];
} else {
close = daily.close[k];
high = Math.max(high,daily.high[k]);
low = Math.min(low,daily.low[k]);
volume += daily.volume[k];
}
lastPeriod = thisPeriod;
}
listSeries.add(startDate, high, low, close, open, volume);
return new Series(listSeries);
}
private void readAll(String filename) throws Exception {
// read the data
hashSeries = new HashMap(1000);
ReadStockData rsd = new ReadStockData(filename);
while (rsd.next()) {
String ticker = rsd.getString("Ticker");
ListSeries listSeries = (ListSeries)hashSeries.get(ticker);
if (listSeries == null) {
listSeries = new ListSeries();
hashSeries.put(ticker, listSeries);
}
listSeries.listDate.add(rsd.getObject("Date"));
listSeries.listHigh.add(rsd.getObject("High"));
listSeries.listLow.add(rsd.getObject("Low"));
listSeries.listClose.add(rsd.getObject("Close"));
listSeries.listOpen.add(rsd.getObject("Open"));
listSeries.listVolume.add(rsd.getObject("Volume"));
}
rsd.close();
Iterator iter = hashSeries.keySet().iterator();
while (iter.hasNext()) {
String ticker = (String)iter.next();
ListSeries listSeries = (ListSeries)hashSeries.get(ticker);
Series series = new Series(listSeries);
hashSeries.put(ticker, series);
}
}
static private class ListSeries {
List listDate;
List listHigh;
List listLow;
List listClose;
List listOpen;
List listVolume;
ListSeries() {
listDate = new ArrayList(500);
listHigh = new ArrayList(500);
listLow = new ArrayList(500);
listClose = new ArrayList(500);
listOpen = new ArrayList(500);
listVolume = new ArrayList(500);
}
void add(java.util.Date date, double high, double low, double close, double open, double volume) {
listDate.add(date);
listHigh.add(new Double(high));
listLow.add(new Double(low));
listClose.add(new Double(close));
listOpen.add(new Double(open));
listVolume.add(new Double(volume));
}
}
static class Series implements Serializable {
static final long serialVersionUID = 6083341146689785913L;
String ticker;
double date[];
double high[];
double low[];
double close[];
double open[];
double volume[];
Series(ListSeries listSeries) {
int n = listSeries.listDate.size();
if (listSeries.listDate.get(0) == null) n = 0;
date = new double[n];
high = new double[n];
low = new double[n];
close = new double[n];
open = new double[n];
volume = new double[n];
for (int k = 0; k < n; k++) {
date[k] = ((java.util.Date)listSeries.listDate.get(k)).getTime();
high[k] = ((Double)listSeries.listHigh.get(k)).doubleValue();
low[k] = ((Double)listSeries.listLow.get(k)).doubleValue();
close[k] = ((Double)listSeries.listClose.get(k)).doubleValue();
open[k] = ((Double)listSeries.listOpen.get(k)).doubleValue();
volume[k] = ((Double)listSeries.listVolume.get(k)).doubleValue();
}
}
}
}