/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.model.pnl;
import org.threeten.bp.Clock;
import org.threeten.bp.LocalDate;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries;
import com.opengamma.core.position.PositionOrTrade;
import com.opengamma.core.position.Trade;
import com.opengamma.core.security.Security;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.analytics.timeseries.DateConstraint;
import com.opengamma.financial.security.FinancialSecurityUtils;
import com.opengamma.financial.security.bond.BondSecurity;
import com.opengamma.financial.security.fx.FXForwardSecurity;
import com.opengamma.financial.security.option.FXBarrierOptionSecurity;
import com.opengamma.financial.security.option.FXDigitalOptionSecurity;
import com.opengamma.financial.security.option.FXOptionSecurity;
/**
*
*/
public class TradeExchangeTradedPnLFunction extends AbstractTradeOrDailyPositionPnLFunction {
/**
* @param resolutionKey the resolution key, not-null
* @param mark2marketField the mark to market data field name, not-null
* @param costOfCarryField the cost of carry field name, not-null
*/
public TradeExchangeTradedPnLFunction(String resolutionKey, String mark2marketField, String costOfCarryField) {
super(resolutionKey, mark2marketField, costOfCarryField);
}
@Override
public boolean canApplyTo(FunctionCompilationContext context, ComputationTarget target) {
if (!super.canApplyTo(context, target)) {
return false;
}
Security security = target.getTrade().getSecurity();
if (security instanceof FXForwardSecurity || security instanceof FXOptionSecurity || security instanceof FXBarrierOptionSecurity || security instanceof FXDigitalOptionSecurity) {
return false;
}
return FinancialSecurityUtils.isExchangeTraded(security) || (security instanceof BondSecurity);
}
@Override
public String getShortName() {
return "TradePnL";
}
@Override
public ComputationTargetType getTargetType() {
return ComputationTargetType.TRADE;
}
@Override
protected LocalDate getPreferredTradeDate(Clock valuationClock, PositionOrTrade positionOrTrade) {
return ((Trade) positionOrTrade).getTradeDate();
}
@Override
protected DateConstraint getTimeSeriesStartDate(final PositionOrTrade positionOrTrade) {
return DateConstraint.of(((Trade) positionOrTrade).getTradeDate());
}
@Override
protected DateConstraint getTimeSeriesEndDate(final PositionOrTrade positionOrTrade) {
return DateConstraint.of(((Trade) positionOrTrade).getTradeDate());
}
@Override
protected LocalDate checkAvailableData(LocalDate originalTradeDate, HistoricalTimeSeries markToMarketSeries, Security security,
String markDataField, String resolutionKey) {
if (markToMarketSeries.getTimeSeries().isEmpty() || markToMarketSeries.getTimeSeries().getValue(originalTradeDate) == null) {
throw new NullPointerException("Could not get mark to market value for security " +
security.getExternalIdBundle() + " for " + markDataField + " using " + resolutionKey + " for " + originalTradeDate);
}
return originalTradeDate;
}
@Override
protected String getResultValueRequirementName() {
return ValueRequirementNames.PNL;
}
}