package org.marketcetera.core.position.impl; import java.math.BigDecimal; import org.marketcetera.core.position.PositionMetrics; import org.marketcetera.core.position.Trade; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * A calculator that wraps another calculator and multiplies all P&L values by a * multiplier. * <p> * If the multiplier is unavailable, this class effectively nulls out all PNL * values. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: MultiplierCalculator.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ @ClassVersion("$Id: MultiplierCalculator.java 16154 2012-07-14 16:34:05Z colin $") public class MultiplierCalculator implements PositionMetricsCalculator { private final PositionMetricsCalculator mDelegate; private final BigDecimal mMultiplier; /** * Constructor. * * @param delegate * the calculator implementation * @param multiplier * the multiplier to apply to P&L values, null if unavailable */ public MultiplierCalculator(PositionMetricsCalculator delegate, BigDecimal multiplier) { mDelegate = delegate; mMultiplier = multiplier; } @Override public PositionMetrics tick(BigDecimal tradePrice) { return multiply(mDelegate.tick(tradePrice)); } @Override public PositionMetrics trade(Trade<?> trade) { return multiply(mDelegate.trade(trade)); } private PositionMetrics multiply(PositionMetrics metrics) { return new PositionMetricsImpl(metrics.getIncomingPosition(), metrics .getPosition(), multiply(metrics.getPositionPL()), multiply(metrics.getTradingPL()), multiply(metrics .getRealizedPL()), multiply(metrics.getUnrealizedPL()), multiply(metrics.getTotalPL())); } private BigDecimal multiply(BigDecimal pnl) { if (mMultiplier == null || pnl == null) { return null; } else { return pnl.multiply(mMultiplier); } } }