package jtrade.strategy; import jtrade.Recorder; import jtrade.Symbol; import jtrade.marketfeed.IBMarketFeed; import jtrade.marketfeed.MarketFeed; import jtrade.marketfeed.MarketListener; import jtrade.trader.OpenOrder; import jtrade.trader.OrderListener; import jtrade.trader.OrderType; import jtrade.trader.Position; import jtrade.trader.Trader; import jtrade.util.Configurable; import jtrade.util.Util; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class BaseStrategy implements Strategy, MarketListener, OrderListener { protected Logger logger; protected MarketFeed marketFeed; protected Trader trader; protected Recorder recorder; protected boolean verbose; protected BaseStrategy() { this.verbose = false; this.logger = LoggerFactory.getLogger(this.getClass()); setRecorder(new Recorder() { @Override public void record(String name, DateTime dateTime, boolean autoScale, double... value) { } @Override public void record(String name, DateTime dateTime, double... value) { } @Override public void plot() { } }); } @Override public void destroy() { if (trader != null && trader.isConnected()) { trader.removeOrderListener(this); } if (marketFeed != null && marketFeed.isConnected()) { marketFeed.removeListener(this); } } public Position setPosition(Symbol symbol, int quantity) { Position position = trader.getPortfolio().getPosition(symbol); if (position.getQuantity() == quantity) { return position; } if (trader.getOpenOrder(symbol, OrderType.MARKET) == null) { trader.cancelOrder(symbol, null); trader.placeOrder(symbol, quantity - position.getQuantity(), getClass().getSimpleName()); } return null; } @Override public MarketFeed getMarketFeed() { return marketFeed; } @Override public void setMarketFeed(MarketFeed marketFeed) { this.marketFeed = marketFeed; if (marketFeed instanceof IBMarketFeed) { verbose = true; } } @Override public Trader getTrader() { return trader; } @Override public void setTrader(Trader trader) { this.trader = trader; } @Override public Recorder getRecorder() { return recorder; } @Override public void setRecorder(Recorder recorder) { this.recorder = recorder; } public boolean isVerbose() { return verbose; } public void setVerbose(boolean verbose) { this.verbose = verbose; Configurable.configure("jtrade.trader.DummyTrader#VERBOSE", verbose); } @Override public void onDay(DateTime dateTime) { } @Override public void onHour(DateTime dateTime) { } @Override public void onMinute(DateTime dateTime) { } @Override public void onOrderPlaced(OpenOrder openOrder) { } @Override public void onOrderFilled(OpenOrder openOrder, Position position) { } @Override public void onOrderFailed(OpenOrder openOrder) { } @Override public void onOrderCancelled(OpenOrder openOrder) { } public void logError(String message) { logger.error(message); } public void logError(String message, Object arg1) { logger.error(message, arg1); } public void logError(String message, Object arg1, Object arg2) { logger.error(message, arg1, arg2); } public void logError(String message, Object... args) { logger.error(message, args); } public void logWarn(String message) { logger.warn(message); } public void logWarn(String message, Object arg1) { logger.warn(message, arg1); } public void logWarn(String message, Object arg1, Object arg2) { logger.warn(message, arg1, arg2); } public void logWarn(String message, Object... args) { logger.warn(message, args); } public void logInfo(String message) { if (verbose) { logger.info(message); } } public void logInfo(String message, Object arg1) { if (verbose) { logger.info(message, arg1); } } public void logInfo(String message, Object arg1, Object arg2) { if (verbose) { logger.info(message, arg1, arg2); } } public void logInfo(String message, Object... args) { if (verbose) { logger.info(message, args); } } public void logDebug(String message) { if (verbose) { logger.debug(message); } } public void logDebug(String message, Object arg1) { if (verbose) { logger.debug(message, arg1); } } public void logDebug(String message, Object arg1, Object arg2) { if (verbose) { logger.debug(message, arg1, arg2); } } public void logDebug(String message, Object... args) { if (verbose) { logger.debug(message, args); } } @Override public String toString() { return Util.toString(this).concat(" ").concat(super.toString()); } }