package org.cryptocoinpartners.bin; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import org.cryptocoinpartners.command.ConsoleWriter; import org.cryptocoinpartners.esper.annotation.When; import org.cryptocoinpartners.schema.Book; import org.cryptocoinpartners.schema.Fill; import org.cryptocoinpartners.schema.Listing; import org.cryptocoinpartners.schema.Market; import org.cryptocoinpartners.schema.Order; import org.cryptocoinpartners.schema.OrderUpdate; import org.cryptocoinpartners.schema.Trade; /** * This is attached to the Context operated by ConsoleRunMode. It is responsible for printing event alerts to the * console. * * @author Tim Olson */ @Singleton public class ConsoleNotifications { public void watch(Listing listing) { if (watchList.add(listing)) out.println("now watching " + listing); else out.println("already watching " + listing); out.flush(); } public void unwatch(Listing listing) { if (watchList.remove(listing)) out.println("no longer watching " + listing); out.flush(); } public Set<Listing> getWatchList() { return watchList; } @When("select * from Book") private void watchBook(Book b) { Market market = b.getMarket(); if (watching(market.getListing())) { out.println(String.format("book: %s\t%s (%s) - %s (%s)", market, b.getBidPrice(), b.getBidVolume(), b.getAskPrice(), b.getAskVolume())); out.flush(); } } @When("select * from Trade") private void watchTrade(Trade t) { Market market = t.getMarket(); if (watching(market.getListing())) { out.println(String.format("trade: %s\t%s (%s)", market, t.getPrice(), t.getVolume())); out.flush(); } } @When("select * from Fill") private void announceFill(Fill f) { out.println("Filled order " + f.getOrder().getId() + ": " + f); out.flush(); } @When("select * from OrderUpdate") private void announceUpdate(OrderUpdate update) { Order order = update.getOrder(); switch (update.getState()) { case NEW: out.println("Creating order " + order); break; case ROUTED: out.println("Order has been placed. " + order); break; case PLACED: out.println("Order has been placed. " + order); break; case PARTFILLED: out.println("Order is partially filled " + order); break; case FILLED: out.println("Order has been completely filled. " + order); break; case CANCELLING: out.println("Cancelling order " + order); break; case CANCELLED: out.println("Cancelled order " + order); break; case REJECTED: out.println("Order REJECTED as unfillable. " + order); break; case EXPIRED: out.println("Order has expired. " + order); break; default: out.println("Unknown order state: " + update.getState()); break; } } private boolean watching(Listing listing) { return watchList.contains(listing); } @Inject private ConsoleWriter out; private final Set<Listing> watchList = new HashSet<>(); }