package com.activequant.trading;
import org.apache.log4j.Logger;
import com.activequant.domainmodel.OHLCV;
import com.activequant.domainmodel.PersistentEntity;
import com.activequant.domainmodel.TimeFrame;
import com.activequant.domainmodel.exceptions.TransportException;
import com.activequant.interfaces.transport.IReceiver;
import com.activequant.interfaces.transport.ITransportFactory;
import com.activequant.interfaces.utils.IEventListener;
import com.activequant.messages.AQMessages;
import com.activequant.messages.AQMessages.BaseMessage;
import com.activequant.messages.AQMessages.BaseMessage.CommandType;
import com.activequant.messages.Marshaller;
/**
* Convenience wrapper to subscribe to an OHLC data feed.
*
* @author GhostRider
*
*/
public class OHLCDataFeedAdapter {
private Marshaller marshaller = new Marshaller();
private Logger log = Logger.getLogger(OHLCDataFeedAdapter.class);
private final String mdi;
private final ITransportFactory transFac;
private final TimeFrame resolution;
/**
* Internal event listener, this one will dispatch data on.
*/
private IEventListener<byte[]> rawListener = new IEventListener<byte[]>() {
@Override
public void eventFired(byte[] event) {
BaseMessage bm;
try {
bm = marshaller.demarshall(event);
if (bm.getType().equals(CommandType.OHLC)) {
OHLCV ohlc= marshaller
.demarshall(((AQMessages.OHLC) bm
.getExtension(AQMessages.OHLC.cmd)));
processOHLCV(ohlc);
}
} catch (Exception e) {
e.printStackTrace();
log.warn("Exception: ", e);
}
}
};
//
private IEventListener<PersistentEntity> persListener = new IEventListener<PersistentEntity>(){
@Override
public void eventFired(PersistentEntity event) {
if(event instanceof OHLCV)
processOHLCV((OHLCV)event);
}
};
/**
* override this in your class.
*
* @param mds
*/
public void processOHLCV(OHLCV ohlc) {
if (log.isDebugEnabled())
log.debug("Received OHLC: " + ohlc);
}
/**
* public constructor.
*
* @param mdi
* @param transFac
*/
public OHLCDataFeedAdapter(String mdi, TimeFrame resolution, ITransportFactory transFac) {
this.mdi = mdi;
this.transFac = transFac;
this.resolution = resolution;
}
/**
* Use it to start a feed.
* @throws TransportException
*/
public void start() throws TransportException {
// feels quite dirty, but ok.
OHLCV o = new OHLCV();
o.setResolutionInSeconds(resolution.getMinutes() * 60);
o.setMdiId(mdi);
IReceiver r = transFac.getReceiver(o.getId());
r.getRawEvent()
.addEventListener(rawListener);
// let's also add an old-format event listener.
r.getMsgRecEvent().addEventListener(persListener);
}
}