package com.activequant.backtesting;
import com.activequant.archive.TimeSeriesIterator;
import com.activequant.domainmodel.TimeStamp;
import com.activequant.domainmodel.Tuple;
import com.activequant.domainmodel.streaming.MarketDataEvent;
import com.activequant.domainmodel.streaming.MarketDataSnapshot;
import com.activequant.domainmodel.streaming.StreamEventIterator;
import com.activequant.interfaces.archive.IArchiveReader;
/**
*
* converts a field to a stream. such as PX_SETTLE of daily data.
*
* @author ustaudinger
*
*/
public class FieldToBidAskConverterStream extends StreamEventIterator<MarketDataEvent> {
private String mdiId, tdiId, fieldName;
private TimeSeriesIterator streamIterator;
private double[] bid, ask, bidQ, askQ;
private double bidQuantity = 1000000, askQuantity = 1000000, bidOffset = -0.0001, askOffset = +0.0001;
public FieldToBidAskConverterStream(String mdiId, String field, TimeStamp startTime, TimeStamp endTime, IArchiveReader archiveReader) throws Exception {
this.mdiId = mdiId;
this.tdiId = mdiId;
this.fieldName = field;
this.streamIterator = archiveReader.getTimeSeriesStream(mdiId, fieldName, startTime, endTime);
bid = new double[1];
ask = new double[1];
bidQ = new double[1];
askQ = new double[1];
}
public FieldToBidAskConverterStream(String mdiId, String tdiId, String field, TimeStamp startTime, TimeStamp endTime, IArchiveReader archiveReader) throws Exception {
this.mdiId = mdiId;
this.fieldName = field;
this.streamIterator = archiveReader.getTimeSeriesStream(mdiId, fieldName, startTime, endTime);
bid = new double[1];
ask = new double[1];
bidQ = new double[1];
askQ = new double[1];
this.tdiId = tdiId;
}
@Override
public boolean hasNext() {
return streamIterator.hasNext();
}
@Override
public MarketDataEvent next() {
Tuple<TimeStamp, Double> valueMap = streamIterator.next();
// fixing ...
bid = new double[1];
ask = new double[1];
bidQ = new double[1];
askQ = new double[1];
// take the value and create a synthetic bid and ask out of it.
ask[0] = valueMap.getB()+this.getAskOffset();
bid[0] = valueMap.getB()+this.getBidOffset();
askQ[0] = this.getAskQuantity();
bidQ[0] = this.getBidQuantity();
MarketDataSnapshot mds = new MarketDataSnapshot();
mds.setMdiId(this.mdiId);
mds.setTdiId(this.tdiId);
mds.setAskPrices(ask);
mds.setBidPrices(bid);
mds.setAskSizes(askQ);
mds.setBidSizes(bidQ);
mds.setTimeStamp(valueMap.getA());
return mds;
}
public double getBidQuantity() {
return bidQuantity;
}
public void setBidQuantity(double bidQuantity) {
this.bidQuantity = bidQuantity;
}
public double getAskQuantity() {
return askQuantity;
}
public void setAskQuantity(double askQuantity) {
this.askQuantity = askQuantity;
}
public double getBidOffset() {
return bidOffset;
}
public void setBidOffset(double bidOffset) {
this.bidOffset = bidOffset;
}
public double getAskOffset() {
return askOffset;
}
public void setAskOffset(double askOffset) {
this.askOffset = askOffset;
}
}