package jtrade.trader; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import jtrade.Symbol; import jtrade.marketfeed.MarketFeed; import jtrade.marketfeed.Tick; public class Portfolio { MarketFeed marketFeed; Map<Symbol, Position> positions; Map<String, DoubleValue> cash; Map<String, Double> exchangeRatesInBase; String baseCurrency; @SuppressWarnings("serial") public Portfolio(MarketFeed marketFeed) { this.marketFeed = marketFeed; this.cash = new TreeMap<String, DoubleValue>() { @Override public DoubleValue get(Object key) { DoubleValue value = super.get(key); if (value == null) { super.put((String) key, value = new DoubleValue(0.0)); } return value; } }; this.positions = new TreeMap<Symbol, Position>() { @Override public Position get(Object key) { Position value = super.get(key); if (value == null) { super.put((Symbol) key, value = new Position((Symbol) key)); } return value; } }; this.exchangeRatesInBase = new TreeMap<String, Double>() { @Override public Double get(Object key) { Double value = super.get(key); if (value == null) { super.put((String) key, value = Double.valueOf(1.0)); } return value; } }; baseCurrency = "USD"; } public Position getPosition(Symbol symbol) { return positions.get(symbol); } public void setPosition(Symbol symbol, Position position) { positions.put(symbol, position); } public List<Position> getPositions() { return new ArrayList<Position>(positions.values()); } public double getPositionsValue() { double total = 0.0; for (Position p : positions.values()) { Tick lastTick = marketFeed.getLastTick(p.getSymbol()); if (lastTick != null) { total += p.getValue(lastTick.getMidPrice()) * getExchangeRate(p.getSymbol().getCurrency()); } } return total; } public double getPortfolioValue() { return getCashValue() + getPositionsValue(); } public double getCashValue() { double total = 0.0; for (String currency : cash.keySet()) { total += getCash(currency) * getExchangeRate(currency); } return total; } public double getCash(String currency) { return cash.get(currency).value; } public void setCash(String currency, double amount) { cash.get(currency).value = amount; } public void addCash(String currency, double amount) { cash.get(currency).value += amount; } public double getExchangeRate(String currency) { return exchangeRatesInBase.get(currency); } public void setExchangeRate(String currency, double exchangeRate) { exchangeRatesInBase.put(currency, exchangeRate); } public String getBaseCurrency() { return baseCurrency; } public void setBaseCurrency(String baseCurrency) { this.baseCurrency = baseCurrency; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); if (positions != null) { sb.append("positions="); sb.append(positions.values()); sb.append(", "); } if (cash != null) { sb.append("cash="); sb.append(cash); sb.append(", "); } if (exchangeRatesInBase != null) { sb.append("exchangeRatesInBase="); sb.append(exchangeRatesInBase); sb.append(", "); } if (baseCurrency != null) { sb.append("baseCurrency="); sb.append(baseCurrency); } sb.append("]"); return sb.toString(); } class DoubleValue { double value; public DoubleValue(double d) { value = d; } public String toString() { return String.valueOf(value); } } }