package storm.applications.bolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; import java.util.HashMap; import java.util.Map; import org.joda.time.DateTime; import static storm.applications.constants.BargainIndexConstants.*; /** * Calculates the VWAP (Volume Weighted Average Price) throughout the day for each * stock symbol. When the first quote from following day appears, the old calculation * is thrown away. * * @author mayconbordin */ public class BargainIndexBolt extends AbstractBolt { private Map<String, TradeSummary> trades; private double threshold; @Override public Fields getDefaultFields() { return new Fields(Field.STOCK, Field.PRICE, Field.VOLUME, Field.BARGAIN_INDEX); } @Override public void initialize() { threshold = config.getDouble(Conf.BARGAIN_INDEX_THRESHOLD, 0.001); trades = new HashMap<>(); } @Override public void execute(Tuple input) { String stream = input.getSourceStreamId(); if (stream.equals(Stream.QUOTES)) { String stock = input.getStringByField(Field.STOCK); double askPrice = input.getDoubleByField(Field.PRICE); int askSize = input.getIntegerByField(Field.VOLUME); DateTime date = (DateTime) input.getValueByField(Field.DATE); TradeSummary summary = trades.get(stock); double bargainIndex = 0; if (summary != null) { if (summary.vwap > askPrice) { bargainIndex = Math.exp(summary.vwap - askPrice) * askSize; if (bargainIndex > threshold) collector.emit(new Values(stock, askPrice, askSize, bargainIndex)); } } } else if (stream.equals(Stream.TRADES)) { String stock = input.getStringByField(Field.STOCK); double vwap = (Double) input.getValueByField(Field.VWAP); DateTime endDate = (DateTime) input.getValueByField(Field.END_DATE); if (trades.containsKey(stock)) { TradeSummary summary = trades.get(stock); summary.vwap = vwap; summary.date = endDate; } else { trades.put(stock, new TradeSummary(stock, vwap, endDate)); } } } private static class TradeSummary { public String symbol; public double vwap; public DateTime date; public TradeSummary(String symbol, double vwap, DateTime date) { this.symbol = symbol; this.vwap = vwap; this.date = date; } } }