package com.activequant.backtesting.reporting; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Date; import com.activequant.domainmodel.TimeStamp; import com.activequant.domainmodel.streaming.StreamEventIterator; import com.activequant.domainmodel.streaming.TimeStreamEvent; import com.activequant.domainmodel.trade.event.OrderFillEvent; import com.activequant.domainmodel.trade.order.OrderSide; /** * Creates a stream event iterator from a transaction file list. * Can be used to replay order fills in sync with market events, for example to generate reports. * * @author GhostRider * */ public class TransactionFileStreamIterator extends StreamEventIterator<TimeStreamEvent> { private BufferedReader br; private String line; public TransactionFileStreamIterator(String fileName) throws Exception { File f = new File(fileName); br = new BufferedReader(new FileReader(f)); // skip header line = br.readLine(); line = br.readLine(); } @Override public boolean hasNext() { if (line != null) return true; return false; } /** * format documentation see * * http://developers.activequant.org/projects/pecora/wiki */ @Override public OrderFillEvent next() { try { String[] p = line.split(","); String id = p[0]; String inst = p[1]; TimeStamp tsUnixGmt = new TimeStamp(new Date(Long.parseLong(p[3]) * 1000)); String dir = p[4]; Double price = Double.parseDouble(p[6]); Double quantity = Double.parseDouble(p[5]); OrderFillEvent ofe = new OrderFillEvent(); ofe.setRefOrderId(id); ofe.setOptionalInstId(inst); ofe.setFillPrice(price); ofe.setFillAmount(quantity); ofe.setSide(OrderSide.valueOf(dir)); ofe.setTimeStamp(tsUnixGmt); // shift it, so that it looks as if it emitted at the end of a // candle. line = br.readLine(); return ofe; } catch (Exception e) { throw new RuntimeException(e); } } }