/*******************************************************************************
* Copyright (c) 2013 Luigi Sgro. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Luigi Sgro - initial API and implementation
******************************************************************************/
package com.quantcomponents.marketdata;
import java.util.Date;
import java.util.TimeZone;
import com.quantcomponents.core.model.BarSize;
import com.quantcomponents.core.model.DataType;
import com.quantcomponents.core.model.IContract;
import com.quantcomponents.core.model.ISeriesListener;
import com.quantcomponents.core.model.ISeriesPoint;
import com.quantcomponents.core.model.beans.ContractBase;
/**
* Implementation of {@link IStockDatabase}
*/
public class StockDatabase implements IStockDatabase {
private final IContract contract;
private final BarSize barSize;
private final DataType dataType;
private final boolean includeAfterHours;
private final OHLCTimeSeries ohlcTimeSeries;
private final TickTimeSeries tickTimeSeries;
private final OHLCVirtualTimeSeries virtualTimeSeries;
private final TimeZone timeZone;
private final String ID;
public StockDatabase(IContract contract, DataType dataType, BarSize barSize, boolean includeAfterHours, TimeZone timeZone) {
ID = ContractBase.stringRepr(contract) + ";" + dataType.name() + ";" + barSize.name() + ";" + Boolean.toString(includeAfterHours) + ";" + timeZone.getID();
this.contract = contract;
this.barSize = barSize;
this.dataType = dataType;
this.includeAfterHours = includeAfterHours;
this.timeZone = timeZone;
ohlcTimeSeries = new SlaveOHLCTimeSeries(contract, dataType, barSize, includeAfterHours);
tickTimeSeries = new SlaveTickTimeSeries(contract, dataType, barSize.getDurationInMs());
virtualTimeSeries = new OHLCVirtualTimeSeries(ID, contract, dataType, barSize, includeAfterHours, timeZone);
ohlcTimeSeries.addSeriesListener(new ISeriesListener<Date, Double>() {
@Override
public void onItemAdded(ISeriesPoint<Date, Double> newItem) {
virtualTimeSeries.addOrUpdateBar((IOHLCPoint) newItem);
}
@Override
public void onItemUpdated(ISeriesPoint<Date, Double> existingItem, ISeriesPoint<Date, Double> updatedItem) {
virtualTimeSeries.addOrUpdateBar((IOHLCPoint) updatedItem);
}});
tickTimeSeries.addSeriesListener(new ISeriesListener<Date, Double>() {
@Override
public void onItemAdded(ISeriesPoint<Date, Double> newItem) {
virtualTimeSeries.addTick((ITickPoint) newItem);
}
@Override
public void onItemUpdated(ISeriesPoint<Date, Double> existingItem, ISeriesPoint<Date, Double> updatedItem) {
// never
}});
}
@Override
public IMutableOHLCTimeSeries getOHLCTimeSeries() {
return ohlcTimeSeries;
}
@Override
public IMutableTickTimeSeries getTickTimeSeries() {
return tickTimeSeries;
}
@Override
public IOHLCTimeSeries getVirtualTimeSeries() {
return virtualTimeSeries;
}
@Override
public long getTimestamp() {
return Math.max(ohlcTimeSeries.getTimestamp(), tickTimeSeries.getTimestamp());
}
@Override
public TimeZone getTimeZone() {
return timeZone;
}
private class SlaveOHLCTimeSeries extends OHLCTimeSeries {
private static final long serialVersionUID = 2654593577745684284L;
public SlaveOHLCTimeSeries(IContract contract, DataType dataType, BarSize barSize, boolean includeAfterHours) {
super(ID, contract, barSize, dataType, includeAfterHours, timeZone);
}
}
private class SlaveTickTimeSeries extends TickTimeSeries {
private static final long serialVersionUID = -8804580947127074390L;
public SlaveTickTimeSeries(IContract contract, DataType dataType, long interval) {
super(ID, contract, dataType, interval, timeZone);
}
}
@Override
public IContract getContract() {
return contract;
}
@Override
public BarSize getBarSize() {
return barSize;
}
@Override
public boolean isIncludeAfterHours() {
return includeAfterHours;
}
@Override
public DataType getDataType() {
return dataType;
}
@Override
public String getPersistentID() {
return ID;
}
public static String stringRepr(IStockDatabase stockDatabase) {
StringBuilder buffer = new StringBuilder();
buffer.append("db [");
buffer.append(ContractBase.stringRepr(stockDatabase.getContract()));
buffer.append("; ");
buffer.append(stockDatabase.getDataType().name());
buffer.append("; ");
buffer.append(stockDatabase.getBarSize().name());
buffer.append("; ");
buffer.append(stockDatabase.getTimeZone().getDisplayName());
buffer.append("; OTH= ");
buffer.append(Boolean.toString(stockDatabase.isIncludeAfterHours()));
buffer.append("]");
return buffer.toString();
}
}